Slack
slash_command

【Slack】Custom slash commandsを使う

More than 1 year has passed since last update.

最初に

Slackそんなに使ってないけど社内でSlackに移行しようって流れになったのでSlack開発始めました。
→流れでCustom slash commandsを登録しそこから作成したプログラムを叩かせることをやったのでまとめました。 

背景

社内Slackからお知らせを投稿してDBに保存、そのお知らせを自社ポータルに表示したい。

問題

Publicのchannelだと全員見れてしまうし(インターンも)それはどうなんだろう?
Outgoing webhooksだとprivate channelでつかえない。
*Outgoing webhook...特定チャネルへのpostをフックにしてURLを叩いてくれる、楽

調べる

The outgoing webhook integration is only available in public channels. If you would like to get data out of private groups and DMs in real-time, try a slash command.

by Slackさん公式

Slash Commandsというものを使えばいいらしい。

Slash Commandsとは

"/command hogehoge"で特定の動きをしてくれる。
→Custom Slash Commandsが登録できる
このSlash Commandsにひも付けて既存のサービスをフックするようにすればいい

やることアウトライン

  1. Slackからフックさせる先のプログラムを作る
  2. Custom slash commandsの登録
  3. テスト

Custom slash commandsの登録

私は今回の場合もうプログラムは作ってあったので、説明は省略します。
1. Custom slash commandsから"Add configuration"をクリック
2. "Choose commands"で自分の登録したいコマンドを登録する->次へ
例: /addinfo
3. "URL"のフォームに叩きたいURLを貼る,その他随意に登録
4. OK

叩くプログラムの作り方

基本的にresponseをjson形式でechoで返せばok

test.php
$res = array(
    "text" => "response by bot"
);
header('Content-Type: application/json');
echo json_encode($res);

slash commandsでPOSTされるデータにはトークンやチャネルidも入っているので、プログラム側でそういうの考慮してあげることができます。

token=***
team_id=T0001
team_domain=example
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

こういう感じらしいです。(https://api.slack.com/slash-commands#how_do_commands_work)
今回はPOSTが良かったのでPOSTにしましたが、GETでリクエストさせることもできます。

テスト

スクリーンショット 2016-09-23 21.22.23.png

つまったとこ

投稿した内容がタイムラインに表示されない

response_typeをin_channelにして返す。(参考→https://api.slack.com/slash-commands#responding_to_a_command)
これを指定しないと"only visible to you"にできる。

test.php
$res = array(
    "text" => "response by bot",
    "response_type" => "in_channel"
);
header('Content-Type: application/json');
echo json_encode($res);

json_encodeしても上手くいかない

headerを登録してあげる

test.php
header('Content-Type: application/json');
echo json_encode($res);

これ忘れててなんで表示されないんだろう〜?てちょっと詰まってました。

Botのレスポンスなしにしたい

$res = array(
        "text" => "",
        "response_type" => "in_channel"
        );
    header('Content-Type: application/json');
    echo json_encode($res);

こうやると、ユーザのポストは全員に見れるようになって、botのレスポンスはされないようにできました。

参考文献

https://api.slack.com/slash-commands
http://www.programmableweb.com/news/how-to-use-slack-api-to-build-slash-commands-powered-google-app-engine-and-go/how-to/2015/09/16