Slack分報にターミナルからPOSTするCLI(コマンド)を作る

私が所属している会社では分報を導入しています。

個々人が「何をしているか」「何に困っているか」みたいなことを気軽に呟けるやつですね。

分報はその性質上、短時間に何度も呟くようになります。

個人的にその都度「Slackを開く -> 自分の分報チャンネルを開く -> 投稿フォームにフォーカス合わせる -> 入力してEnter」みたいな作業が面倒だったのと、「リアクションあるか、誰がリアクションしているか」みたいなものがわかるのが投稿ハードルを上げていて、活用頻度が減っていました。

まだまだ駆け出しで先輩方の助けが必要な状況では「今何をしているか、何に困っているかをできる限り高頻度で発信する」が非常に大事だと思っています。

そのためこの「分報活用度の低下」を問題視し、上記であげたハードルの解消のためにターミナルから単純にcurlでPOSTするためのコマンド作成しました。

TL; DR

#!/bin/bash
  
CHANNEL=channel名
USERNAME=POSTで表示したい名前
ICON=アイコンURL
TEXT=$@
WEBHOOK_URL=https://hooks.slack.com/services/xxxxxxxxxx/yyyyyyyyyy
  
if [ $# = 0 ]; then
  echo 'you have to add a text at least one or more.'
  exit 1
fi
  
curl -X POST --data-urlencode "payload={\"channel\": \"$CHANNEL\", \"username\": \"$USERNAME\", \"text\": \"$TEXT\",     \"icon_url\": \"$ICON\"}" $WEBHOOK_URL

自作コマンド用ディレクトリ作成&ファイル作成

コマンド作りする場合には、今後もコマンド作成すること念頭にまとめるファイルを作成しておいても良いと思います。

コマンド用に作成したディレクトリ内にコマンド用ファイルを置きます。

この時、ファイル名がそのままコマンド名になるので拡張子は不要です。

今回はコマンド用のディレクトリを /command に、ファイル名を slack としておきます。

$ mkdir ~/command
$ touch ~/command/slack

使えるか確認用の処理を書く

作成したファイルがコマンドとして利用できるか単純な処理を書いて確認します

#!/bin/bash

echo "コマンド実行しています"

まだこの段階ではパーミッションエラーになると思います

~ ❯❯❯ slack
zsh: permission denied: slack

コマンド実行できるように権限付与する

permission errorになったので権限付与して実行できるようにします。

$ chmod 777 ~/command/slack

上記権限付与で、カレントディレクトリに関わらずどこからでもコマンドの実行が可能になります。

コマンドの再実行

権限付与したので実行できるかを確認します。

$ slack
-> コマンド実行しています

引数の扱い方

bashでは "" を使い、その中で $1 のようにすることで引数を受け取れます。


複数の引数を受け取る場合には $1 $2 $3 のようにすることで任意の順番で渡した引数を受け取れます。

#!/bin/bash

echo "$1 $2 $3"

==== 実行 ====
$ slack hoge foo bar
-> hoge foo bar

引数を全て受け取る場合には $@ を使うと引数を1つにまとめて受け取れます

#!/bin/bash

echo "$@"

==== 実行 ====
$ slack hoge hogeh ssooo ascaskkasca
-> hoge hogeh ssooo ascaskkasca

SlackでPOSTするためのincoming_webhookを取得

Slackで特定のチャンネルに投稿するにはincoming_webhookURLが必要になります。

以下を参考にして取得してください。

Slack での Incoming Webhook の利用

Slack POSTする情報を設定

今回は単純に特定のチャンネルにテキストをPOSTするだけのコマンドなので、CHANNEL名やWEBHOOKURLなどは固定させておきます

CHANNEL=#Channel名
USERNAME=POSTした際に表示したいユーザー名
ICON=アイコンURL(プロフィール画像を右クリックするなどで自分のアイコンURL取得できます)
TEXT=$@
WEBHOOK_URL=https://hooks.slack.com/services/xxxxxxxxxxxxxx/yyyyyyyyyyyyyyyyyyy
 

TEXTは、コマンドの引数を全て1つのテキストとして投稿するので $@ を使っています。状況に応じて変えてください。

また、引数がない場合にはPOSTする内容がないのでエラーとして返すようにします

if [ $# = 0 ]; then
  echo 'you have to add a text at least one or more.'
  exit 1
fi

完成版スクリプト

今回は非常に単純にPOSTするだけのコマンドなので、とりあえず以下で完成です。

他にも引数に応じて投稿するチャンネルを変えたりとかもできますが、分報に投稿したいだけなのでその辺は設定していません。

#!/bin/bash
  
CHANNEL=#Channel名
USERNAME=UserName
ICON=IconURL
TEXT=$@
WEBHOOK_URL=https://hooks.slack.com/services/xxxxxxxxxxxxxx/yyyyyyyyyyyyyyyyyyy
  
if [ $# = 0 ]; then
  echo 'you have to add a text at least one or more.'
  exit 1
fi
  
curl -X POST --data-urlencode "payload={\"channel\": \"$CHANNEL\", \"username\": \"$USERNAME\", \"text\": \"$TEXT\", \"icon_url\": \"$ICON\"}" $WEBHOOK_URL

追記: Github管理のために .env で環境変数管理

上記のスクリプトではチャンネル名やURLなどは同じファイルにベタ書きしましたが、複数のマシンでも同様のコマンド利用できるようにGithubで管理するようにしました。

変数は .env に設定し、実行時に読み込んで利用するような形式で使っています

コメント

タイトルとURLをコピーしました