Skip to content

Instantly share code, notes, and snippets.

@dopiaza
Created September 5, 2013 12:33
Show Gist options
  • Save dopiaza/6449505 to your computer and use it in GitHub Desktop.
Save dopiaza/6449505 to your computer and use it in GitHub Desktop.
Post a message to a Slack channel
#!/bin/bash
# Usage: slackpost <token> <channel> <message>
# Enter the name of your slack host here - the thing that appears in your URL:
# https://slackhost.slack.com/
slackhost=PUT_YOUR_HOST_HERE
token=$1
if [[ $token == "" ]]
then
echo "No token specified"
exit 1
fi
shift
channel=$1
if [[ $channel == "" ]]
then
echo "No channel specified"
exit 1
fi
shift
text=$*
if [[ $text == "" ]]
then
echo "No text specified"
exit 1
fi
escapedText=$(echo $text | sed 's/"/\"/g' | sed "s/'/\'/g" )
json="{\"channel\": \"#$channel\", \"text\": \"$escapedText\"}"
curl -s -d "payload=$json" "https://$slackhost.slack.com/services/hooks/incoming-webhook?token=$token"
@miguelmota
Copy link

miguelmota commented May 12, 2019

Here's a version which uses argument flags:

#!/usr/bin/env bash

# Usage: slackpost -w <webhook_url> -c <channel> -u <username> -m <message> [-a <alert_type>]
# Usage: echo <message> | slackpost -w <webhook_url> -c <channel> -u <username> [-a <alert_type>]

# exit immediately if a command exits with a non-zero status
set -e

# error if variable referenced before being set
set -u

# produce failure return code if any command fails in pipe
set -o pipefail

# accepted values: good, warning, danger
alert_type=""
channel=""
message=""
username=""
webhook_url=""

# colon after var means it has a value rather than it being a bool flag
while getopts 'a:c:m:u:w:' OPTION; do
  case "$OPTION" in
    a)
      alert_type="$OPTARG"
      ;;
    c)
      channel="$OPTARG"
      ;;
    m)
      message="$OPTARG"
      ;;
    u)
      username="$OPTARG"
      ;;
    w)
      webhook_url="$OPTARG"
      ;;
    ?)
      echo "script usage: $(basename $0) {-c channel} {-m message} {-u username} {-w webhook} [-a alert_type]" >&2
      exit 1
      ;;
  esac
done
shift "$(($OPTIND -1))"

# exit if channel not provided
if [[ -z "$channel" ]]
then
  echo "No channel specified"
  exit 1
fi

# read piped data as message if message argument is not provided
if [[ -z "$message" ]]
then
  message=$*

  while IFS= read -r line; do
    message="$message$line\n"
  done
fi

# exit if username not provided
if [[ -z "$username" ]]
then
  echo "No username specified"
  exit 1
fi

# exit if webhook not provided
if [[ -z "$webhook_url" ]]
then
  echo "No webhook_url specified"
  exit 1
fi

# escape message text
escapedText=$(echo $message | sed 's/"/\"/g' | sed "s/'/\'/g")

# create JSON payload
json="{\"channel\": \"$channel\", \"username\":\"$username\", \"icon_emoji\":\"ghost\", \"attachments\":[{\"color\":\"$alert_type\" , \"text\": \"$escapedText\"}]}"

# fire off slack message post
curl -s -d "payload=$json" "$webhook_url"

@hari-mopuri
Copy link

Can you explain for posting slash command using api ?

Copy link

ghost commented May 31, 2019

I should upload my version, it's updated to use the API better ...

@romaopedro
Copy link

romaopedro commented Sep 25, 2019

Don't add the payload key before json variable.
And add the token in the headers.

curl -v \
	-H 'Content-Type:application/json; charset=utf-8' \
	-H 'Authorization: Bearer xoxp-XXXXXX-XXXX-XXXXXXXX \
	--data "$json" \
	"$slackwebhook"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment