■ はじめに
以前のエントリで、 StackStorm の Slack Pack の Action を利用して、Slack への投稿を試しました。
今回は、Action ではなく、Trigger や Sensor を使って Slack 上のイベントを拾って何かする、という機能を試してみます。
■ ためすこと
Slack の投稿を検出して、以下のようにテキストファイルに出力する、という簡単な処理をためすことにします。
名前: 投稿内容 名前: 投稿内容 名前: 投稿内容 名前: 投稿内容
■ 準備
トークンの取得
連携のためには Slack のトークンが必要です。 Slack Pack の GitHub リポジトリの README に説明があります。 今回は、とにかく簡単に試したかったため、「For testing purposes..」の下りで説明されている方法でトークンを取得しました。
Slack Pack の設定
先程取得したトークンを、st2 pack config slack
コマンドで設定します。
今回は以下の値にして、他はデフォルトのままにしました。
設定項目 | 値 | 備考 |
---|---|---|
post_message_action.username | akira6592 | 任意の名前 |
post_message_action.webhook_url | (着信WebフックのURL) | |
sensor.token | (先程控えたトークン) | |
admin.organization | admin | 任意の名前 |
途中、以下のように聞かれますのでエンターを押します。
Do you want to preview the config in an editor before saving? [y]:
設定内容がテキストとしてエディタで開かれるので、確認後エディタを終了します。
最後に
Do you want me to save it? [y]:
と聞かれるのでエンターを押します。
■ Slack Trigger の仕様調査
後で必要になる情報を調べておきます。
Slack Pack に含まれる Trigger を調べます。
[ec2-user@ip-172-31-4-147 ~]$ st2 trigger list -p slack +---------------+-------+------------------------------------------------------+ | ref | pack | description | +---------------+-------+------------------------------------------------------+ | slack.message | slack | Trigger which indicates a new message has been | | | | posted to a channel | +---------------+-------+------------------------------------------------------+
slack.message
という Trigger があり、新着メッセージを拾えるようです。
次に、この Trigger の詳細を調べます。
[ec2-user@ip-172-31-4-147 ~]$ st2 trigger get slack.message +-------------------+--------------------------------------------------------------+ | Property | Value | +-------------------+--------------------------------------------------------------+ | id | 5b0b5b426fb12304dc0e014f | | ref | slack.message | | pack | slack | | name | message | | description | Trigger which indicates a new message has been posted to a | | | channel | | parameters_schema | | | payload_schema | { | | | "type": "object", | | | "properties": { | | | "text": { | | | "type": "string" | | | }, | | | "timestamp_raw": { | | | "type": "string" | | | }, | | | "user": { | | | "type": "object" | | | }, | | | "channel": { | | | "type": "object" | | | }, | | | "timestamp": { | | | "type": "integer" | | | } | | | } | | | } | | tags | | | uid | trigger_type:slack:message | +-------------------+--------------------------------------------------------------+
例えば、投稿内容そのものは text
で取得できそうです。
Slack Pack の GitHub リポジトリの README の slack.message trigger に、ペイロードのサンプルが載っていました。
(引用)
{ "user": { "first_name": "Tomaz", "last_name": "Muraus", "is_owner": false, "name": "kami", "real_name": "Tomaz Muraus", "is_admin": false, "id": "U0CCCCC" }, "channel": { "topic": "", "id": "C0CCCCCC", "name": "test" }, "timestamp": 1419164091, "timestamp_raw": "1419164091.00005", "text": "This is a test message." }
例えば、投稿者の名前は user.name
で取得できそうです。
■ ルールの作成
何が起きたときに何をする、というルールを作成します。
ルールの書き方は、公式ドキュメントの Quick Start の Define a Ruleを参考にしました。後でわかりましたが、ここでの ~/slack.log
は /home/stanley/slack.log
になります。
r_slack.yml
--- name: "r_slack" pack: "test" description: "test rule for slack" enabled: true trigger: type: "slack.message" parameters: {} action: ref: "core.local" parameters: cmd: "echo \"{{trigger.user.name}}: {{trigger.text}}\" >> ; sync"
続いて、ルールを登録します。
[ec2-user@ip-172-31-4-147 ~]$ st2 rule create r_slack.yml +-------------+--------------------------------------------------------------+ | Property | Value | +-------------+--------------------------------------------------------------+ | id | 5b128cfd6fb12304f47d825c | | name | r_slack | | pack | test | | description | test rule for slack | | action | { | | | "ref": "core.local", | | | "parameters": { | | | "cmd": "echo "{{trigger.user.name}}: | | | {{trigger.text}}" >> ~/slack.log ; sync" | | | } | | | } | | criteria | | | enabled | True | | ref | test.r_slack | | tags | | | trigger | { | | | "type": "slack.message", | | | "ref": "slack.message", | | | "parameters": {} | | | } | | type | { | | | "ref": "standard", | | | "parameters": {} | | | } | | uid | rule:test:r_slack | +-------------+--------------------------------------------------------------+
念の為、ルールのリストを確認します。
[ec2-user@ip-172-31-4-147 ~]$ st2 rule list -p test +--------------+------+---------------------+---------+ | ref | pack | description | enabled | +--------------+------+---------------------+---------+ | test.r_slack | test | test rule for slack | True | +--------------+------+---------------------+---------+
無事に登録されたようです。
■ おためし
それではいよいよ試してみます。
Slack の general チャンネルに Hello, Slack!
と投稿すると、/home/stanley/slack.log
に
yokochi: Hello, Slack!
と書き込まれました。
デモ動画
試した限り、今回利用したトークンでは、いずれかのユーザーが general に投稿したイベントを取得することができるようです。他のチャンネルではイベントを取得することができませんでした。
■ まとめ
簡単な例ですが、Slack Pack の Trigger を利用して、Slack に投稿があったら何かする、というルールの動作の確認ができました。 chatops Pack でも色々できそうなので調べてみたいと思います。