chiwata’s blog

たまに技術の話をします。

シェルスクリプトでslackのslash commandを作成する

いろいろあって超短い時間でslackのslash commandを作ることになった。 普通だったらrubyとかgoとかで作るんだろうけど、一日で作るとなると勉強する時間が足りなかったのでbashで作ることにした

今回はconohaのVPS上にbashCGIとして動かす。

今回は説明用に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を置く

httpd.confを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 で渡しています。

試してみる

f:id:chiwata:20190728195033p:plain
slack

こんな感じになります。

その他

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}> 

今回は以上です。