Help us understand the problem. What is going on with this article?

【Slack】Custom slash commandsを使う

More than 3 years have 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした