シェルスクリプトでslackのslash commandを作成する
いろいろあって超短い時間でslackのslash commandを作ることになった。 普通だったらrubyとかgoとかで作るんだろうけど、一日で作るとなると勉強する時間が足りなかったのでbashで作ることにした
今回はconohaのVPS上にbashをCGIとして動かす。
今回は説明用にhttpdの状態を確認するコマンドを作ります(ただし、httpdが起動していない場合コマンドがそもそも反応しないので、完全に説明用です。)
slackのslashcommandとは
リマインドとかで使うあれ api.slack.com
slackでアプリを設定する
ここからcreate new appをおして、アプリの名前を設定します Slack API: Applications | Slack
左側のFeaturesにあるslash commandを選んで、create new commandを選択
必要事項を記入します。
今回はRequest URLの欄には http://VPSのIP/cgi-bin/httpdstatus.cgi
と入力しました。
保存したら。Install Appを押してワークスペースに反映してください。
サーバの設定をして、CGIを置く
<Directory "/var/www/cgi-bin"> AllowOverride None Options ExecCGI Require all granted </Directory>
AddHandler cgi-script .cgi
次にスクリプトを置きます
今回は /var/www/cgi-bin/httpdstatus.cgi
に
#!/bin/bash # statushttpd.cgi echo "Content-type:text/plain" echo systemctl status httpd | while read line do echo $line done
一行ずつ渡してあげないと表示がそれっぽくならないので今回は while read line
で渡しています。
試してみる
こんな感じになります。
その他
slackから送られてくるメッセージを受け取るには
slackからのリクエストには、このようなメッセージがついています
今回はわかりやすいように sed 's/&/\n/g'
で改行していますが、本当は &
区切りでつながっています。
token=トークン team_id=チームID team_domain=ワークスペースのドメイン(slack.comの前) channel_id=チャンネルID channel_name=チャンネル名 user_id=コマンドを叩いたユーザーのユニークID user_name=コマンドを叩いたユーザーの名前 command=%2Fstatushttpd(叩かれたcommand) text=(コマンドの後ろについている文字列 response_url=レスポンスのURL trigger_id=トリガーになったアクションのID
これはScriptに標準入力として渡されるため、read args
で受け取ることができます。
トークンについて
このままだとslack以外からでも、このURLを叩かれた場合レスポンスを返してしまいます
そのため、slack appのページのbasic informationのなかにある Verification Token
を検証する必要があります。
レスポンスをほかのユーザにも見せたい場合
通常の設定だと、commandを叩いた本人にしかレスポンスが見えません。
echo "{ \"response_type\":\"in_channel\" , \"text\":\"メッセージ\" }"
このようにすることでほかのユーザーにも見せられるようになります。
メンションを飛ばしたい場合
レスポンス中で以下のように指定することでメンションをすることができます。ユーザーIDはslackからのリクエストに含まれるユーザーIDで、普段メンションで使っているIDではないので注意してください。
<@${USERID}>
今回は以上です。