SlackのCustom Commandsことはじめ

どうも、Slack大好きなwakです。今日はSlackで自作コマンドを作ることができるCustom Commandsの話の導入をします。

Slash Commandsってなに

Slackには/invite/remindなど、/から始まるいくつかのコマンドがあります。スラッシュから始まるのでSlackではSlash Commandsと呼んでいます。/remindコマンドの使い方については以前まとめました。

tech.sanwasystem.com

コマンドを自作しよう

さて、このSlash Commandsはユーザーが自作することもできます。これがCustom Commandsです。

自作するとどうなるのか? 公式ドキュメントを読むのが手っ取り早いのですが、動作イメージは

  1. 開発者が/addnekoコマンドを用意する
  2. ユーザーが/addneko tama buchi kuroと入力する
  3. Slackは予め設定されたURLにGETまたはPOSTを飛ばす
  4. WebサーバーはレスポンスとしてJSONドキュメントを返す(3秒以内)
  5. JSONの中身がSlackに表示される
  6. (もし必要なら)Webサーバーは追加情報や時間のかかる処理の結果をJSONドキュメントとしてSlackへURLへ送信する(30分以内)
  7. (もしあれば)JSONの中身がSlackに表示される

という流れになります。

リクエストに含まれる情報

Slackが送ってくるリクエストにはパラメーターがいくつかありますが、最低限チェックすべき重要なものはtokenぐらいです。他は必要に応じて参照してください。

token

Custom Commandごとに設定された秘密のトークン。このトークンの正当性をチェックしておかないと、エンドポイントが第三者にバレたときに呼び出し放題になってしまいます。

user_name

このコマンドを実行したユーザーのID(@なし)です。

command

スラッシュから始まるコマンド名です。複数のコマンドでエンドポイントを共有していないなら無視して構いません。

text

コマンドに続けて入力されたテキストです。上の例ならtama buchi kuroが入ります。これもコマンド側で参照する必要がないなら無視しましょう。

response_url

上述の6番の追加情報の送信先です。たとえばEC2インスタンスを起動する/start-ec2コマンドを作ったとします*1。この場合、コマンドは

  1. 処理を受け付けた旨をリクエストに対するレスポンスとして返し、
  2. 続いてインスタンスの立ち上げ処理を開始し、インスタンスの状態を数秒おきに監視する。正常に起動処理が完了したと確認できたところでこのURLに結果を送信する

という処理を行えば良いわけです。2回目のメッセージはユーザーがコマンドを実行したのと同じチャンネルに表示されます。

作ってみよう

Apps & integrations → Build → Make a Custom Integration とたどり、「Slash Commands」を選択します。

f:id:nurenezumi:20160531144353p:plain

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

f:id:nurenezumi:20160531144609p:plain

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

*1:もしちゃんと各種サービスが立ち上がったところまで見届けようとするとこの処理は3秒では終わりません

*2:デフォルトでは補完は効きません。コマンド一覧にも出てきません