GoでSlackのSlashコマンドを作る
Medium使ったことないし、書き心地の確認がてら軽い記事を書いてみることにしました。
Slashコマンド
概要
Slackで /
を入れて実行するコマンドですね。Slackのbotにメンションを飛ばしたりとかで諸々を実行する方法と比べると、こちらは /
を入れた時点でコマンドがサジェストされるのが便利だなと思っています。
うちの会社ではECSの現在デプロイされているコンテナのタグを取得するSlashコマンドなどがあり、以下のように説明と共にサジェストされます。
タグにはGitHubのコミットハッシュが入っているため、そこから対応するGitHubのコミットメッセージやURLなども一緒に表示しています。PRとかが多くなると、今何がデプロイされてるんだっけ?って分からなくなるので便利に使っています。
動作
Slashコマンドでは、HTTP POST経由でパラメータが外部URLに送信されます。以下は /weather 94070
と打った場合の例です。先程の公式ドキュメントのままです。
token=gIkuvaNzQIHg97ATvDxqgjtO
team_id=T0001
team_domain=example
enterprise_id=E0001
enterprise_name=Globular%20Construct%20Inc
channel_id=C2147483705
channel_name=test
user_id=U2147483697
user_name=Steve
command=/weather
text=94070
response_url=https://hooks.slack.com/commands/1234/5678
trigger_id=13345224609.738474920.8088930838d88f008e0
コマンド名やコマンドに渡したパラメータなどが送られてきていることがわかるかと思います。この中でtokenが重要です。単にPOSTを受けるだけでは攻撃者の任意のリクエストを受け取ってしまうため、このtokenの検証をする必要があります。他にもteam_idやchannel_idなど、必要であれば検証することでより限定できます。
Slashコマンドの設定をするとverification tokenが発行されるので、これと一致することを検証します。Slack appの設定は他に色々記事があるので、そちらをご参照下さい。
Goでの実装
上で説明したとおりPOSTが来るだけなので、HTTPサーバを立てれば簡単にSlashコマンドを作れます。ですが、POSTのパラメータをパースしたりtokenのvalidationをしたりという点でライブラリを使うほうが少し楽かと思います。
以下のライブラリを使うことで簡単に実装できます。というか自分が欲しかったので自分でSlashコマンド対応を入れました。
以下のように簡単に実装可能です。リクエストを受けたらstructに格納されるので、あとはtokenの検証をしたあとコマンド名でswitchしてるだけですね。とても簡単です。これぐらいの行数でSlashコマンドが作れるのでオススメです。
上のサンプルは先程のリポジトリにもありますので、実行できる形式で試したい方は以下も参考にして下さい。
https://github.com/nlopes/slack/blob/master/examples/slash/slash.go
まとめ
Slackのbotを作りたいなーと思っている人がいるならSlashコマンドがオススメです。hubotとか使う必要無くWebサーバを立ち上げればよいだけなので簡単です。
Mediumはマークダウンじゃないので敬遠してましたが、結構書きやすいなーと思いました。ただ、コードをGitHubから貼り付けようとすると改行が空白に置き換えられてしまってうまく書けないという問題に直面してます。仕方ないので今回はGist埋め込みをやってみました。あと頻繁にAuto Saveとかがエラーになってしまって記事が一部消えてしまうのもつらいです。