どうも、Slack大好きなwakです。今日はSlackで自作コマンドを作ることができるCustom Commandsの話の導入をします。
Slash Commandsってなに
Slackには/invite
や/remind
など、/
から始まるいくつかのコマンドがあります。スラッシュから始まるのでSlackではSlash Commandsと呼んでいます。/remind
コマンドの使い方については以前まとめました。
コマンドを自作しよう
さて、このSlash Commandsはユーザーが自作することもできます。これがCustom Commandsです。
自作するとどうなるのか? 公式ドキュメントを読むのが手っ取り早いのですが、動作イメージは
- 開発者が
/addneko
コマンドを用意する - ユーザーが
/addneko tama buchi kuro
と入力する - Slackは予め設定されたURLにGETまたはPOSTを飛ばす
- WebサーバーはレスポンスとしてJSONドキュメントを返す(3秒以内)
- JSONの中身がSlackに表示される
- (もし必要なら)Webサーバーは追加情報や時間のかかる処理の結果をJSONドキュメントとしてSlackへURLへ送信する(30分以内)
- (もしあれば)JSONの中身がSlackに表示される
という流れになります。
リクエストに含まれる情報
Slackが送ってくるリクエストにはパラメーターがいくつかありますが、最低限チェックすべき重要なものはtoken
ぐらいです。他は必要に応じて参照してください。
token
Custom Commandごとに設定された秘密のトークン。このトークンの正当性をチェックしておかないと、エンドポイントが第三者にバレたときに呼び出し放題になってしまいます。
user_name
このコマンドを実行したユーザーのID(@
なし)です。
command
スラッシュから始まるコマンド名です。複数のコマンドでエンドポイントを共有していないなら無視して構いません。
text
コマンドに続けて入力されたテキストです。上の例ならtama buchi kuro
が入ります。これもコマンド側で参照する必要がないなら無視しましょう。
response_url
上述の6番の追加情報の送信先です。たとえばEC2インスタンスを起動する/start-ec2
コマンドを作ったとします*1。この場合、コマンドは
- 処理を受け付けた旨をリクエストに対するレスポンスとして返し、
- 続いてインスタンスの立ち上げ処理を開始し、インスタンスの状態を数秒おきに監視する。正常に起動処理が完了したと確認できたところでこのURLに結果を送信する
という処理を行えば良いわけです。2回目のメッセージはユーザーがコマンドを実行したのと同じチャンネルに表示されます。
作ってみよう
Apps & integrations → Build → Make a Custom Integration とたどり、「Slash Commands」を選択します。

どのようなコマンドを作るか聞かれますので、好きな文字列を入れます。多少長くても補完が効くようにできるので*2気にしなくてもいいでしょう。

これでコマンドが作成され、続けてエンドポイントなどの設定に移ることになります。同僚の井上さんがさっそく素敵なコマンドを実装してくれたので交代することにしましょう。よろしく!