概要
Slack の Events API をつかった Bot 開発に挑戦しました。ハマった内容をまとめます。
Bot 仕様
Slack から LINE WORKS へメッセージを転送します。
Slack Bot が登録されているプライベートチャンネルに投稿されたメッセージを
LINE WORKS 側の Bot が受取り、特定のユーザに通知するというものです。
システム構成は以下のような感じです。Bot プログラムは AWS Lambda で実装しました。
(なぜこんなことをしているか)
社内標準のチャットツールは LINE WORKS なのですが、私の所属する情シスグループでは slack を常用しており、特に社内システムからのアラートの通知先として活用しています。今回、とある社内組織にシステムのアラートを共有する必要があり、かつ標準ツールである LINE WORKS をつかってもらいたいという意図から、勉強を兼ねて Botを作ることにしました。
Slack Event API とは
Slack にメッセージが投稿された、ユーザーがワークスペースに登録されたといったイベントをフックする API です。API のスコープやメソッドを使い分けることで、特定のチャンネルのイベントに限定したり、ワークスペース全体を監視したりすることができます。
ハマったこと
Slack Bot が所属していないチャンネルのメッセージも転送されてしまいました。
設定によってプライベートチャンネル限定だったり、パブリックチャンネル限定だったり。
原因
Slack API の「Event Subscriptions」の各種設定が誤っていました。
- 設定「Subscribe to bot events」と「Subscribe to events on behalf of users」の違い
- イベント「message.groups」と「message.channels」の違い
をよくわからないまま、なんとなく設定していたことにより、不安定な振る舞いをしていました。
1. 設定「Subscribe to bot events」と「Subscribe to events on behalf of users」の違い
前者の「Subscribe to bot events」はワークスペース上の様々なイベントを対象とします。例えばワークスペース名の変更を検知する「team_rename」イベントや"誰かに"DMが投げられたことを検知する「message.im」などです。これらのイベントは、特定のユーザーやチャンネルに限定されず、すべからく拾われます。
一方、後者の「Subscribe to events on behalf of users」は招待されたチャンネルに関するイベントのみを対象とします。
2. イベント「message.groups」と「message.channels」の違い
groups と channels、一見同じものを指しているように見えますが
- groups = プライベートチャンネル
- channels = ワークスペース上のすべてのチャンネル(パブリック、プライベート関係なし)
となります。
Bot 仕様である「Slack Bot が登録されているプライベートチャンネル」に限定する場合は
"Subscribe to bot events" でイベント"message.groups" を選択しなければなりません。
一方、私は "message.channels" を選択していました。一見似ていますが、groups はプライベートチャンネルのみ、channnels はパブリックチャンネルを含むすべてとなります。このため、Bot を登録しているチャンネル以外のメッセージもみだりに転送されてしまう事態に。
まとめ
- groups = プライベートチャンネル
- channels = ワークスペース上のすべてのチャンネル(パブリック、プライベート関係なし)
- ドキュメント読め
参考
-
Slack 関連
-
Slack API
https://api.slack.com/ -
Incoming Webhook
https://api.slack.com/messaging/webhooks -
Events API
https://api.slack.com/events-api -
LINE WORKS 関連
- LINE WORKS Developers
https://developers.worksmobile.com/jp/?lang=ja - トーク Bot
https://developers.worksmobile.com/jp/document/5?lang=ja
- LINE WORKS Developers