この記事は「make Advent Calendar 2024」22日目の記事です。
このアドベントカレンダーについて
このアドベントカレンダーは25日間でIPaaS製品の「make」について使い方や、実践を学べる連続ブログ企画です。
「おかしん」「ばるす」「たにあん」の3名がリレー形式でお届けします。
25日間のスケジュールは以下の通りです。
日付 | 内容 | 担当 |
12/1 | 話題のIPaaS製品「make」とは | おかしん |
12/2 | makeで作ってみたScenario紹介 | ばるす |
12/3 | make 基本操作編 機能紹介:Organization | たにあん |
12/4 | make 基本操作編 機能紹介:Scenario、Template | おかしん |
12/5 | make 基本操作編 機能紹介:Connections | ばるす |
12/6 | make 基本操作編 機能紹介:Webhooks | たにあん |
12/7 | make 基本操作編 機能紹介:DataStores、DataStructures | おかしん |
12/8 | make 基本操作編 機能紹介:Devices | ばるす |
12/9 | make 基本操作編 機能紹介:Functions | たにあん |
12/10 | make 基本操作編 機能紹介:CustomApps | おかしん |
12/11 | make 基本操作編 機能紹介:Flow Control,Tools,Text parser | ばるす |
12/12 | make ドキュメント動線の話:ResourceHub | たにあん |
12/13 | make 検証:Make Bridge | おかしん |
12/14 | make 検証:Make REST API | ばるす |
12/15 | make 検証:AI Search | たにあん |
12/16 | make Community Hub:Overview | おかしん |
12/17 | make Community Hub:Academy Courses,Blog Articles | ばるす |
12/18 | make Community Hub:Showcase,CustomApps | たにあん |
12/19 | makeの管理運用の話:Github連携 | おかしん |
12/20 | makeの管理運用の話:実行ログと再実行と停止中リクエスト滞留 | ばるす |
12/21 | makeの管理運用の話:Connection権限管理 | たにあん |
12/22 | makeで作ってみた事例:(未定) | おかしん |
12/23 | makeで作ってみた事例:(未定) | ばるす |
12/24 | makeで作ってみた事例:(未定) | たにあん |
12/25 | makeの総論を語る | ばるす |
はじめに
どうも。おかしんさんが多忙につき、意思を受け継いだたにあんです。12/27(金)からタイムスリップしてきました。
今日はmakeでReacji Channelerをつくります。
Reacji Channelerって?
Slack 公式のアレです。スタンプ押したら特定のチャンネルに通知されるアレ。ぼくは「リアク字ってネーミングどうなん?」ってずっと思ってます。
どうやら公式のReacji Channelerだと、スレッド内でスタンプを押しても動かないらしいのでワークするように無理やり作り直してみました。今回はパブリック・プライベートチャンネル、DM全対応です。
概要
Scenario全体画面です。思ったよりシンプルですよね?試行錯誤している間、モジュールが15個ぐらいになった瞬間もありましたが、これで十分でした。
スタンプを押すと以下のような投稿が自分のtimeに流れてきます。公式のReacjiと同じはずです。プライベートチャンネルやDMの投稿の場合、URLが投下された後に「メッセージを表示する」か確認されます。チャンネルを確認できる方、全員に見えてしまうのでご注意を。
大まかな流れは以下の通り。
- SlackからEvent SubscriptionsでWebhookをmakeで受信
- ついたスタンプを消して、受け取ったデータから必要な情報を取得
- Slackへ送信(リンクの展開含む)
以降で解説します。
解説
前提
SlackのEvent Subscriptionsについては公式ドキュメントをご覧ください。それでは解説。
Webhook受信
以下の部分の解説です。
SlackのEvent Subscriptionsで「reactions_added」イベントをきっかけに、Webhookを受信します。
ちなみに、今回はユーザーがスタンプを押したら自動で処理させるようにしたいので、「Subscribe to events on behalf of users」に対象イベントを追加します。
Webhookを受信したら、特定の条件に基づいて処理を進めるか判定します。URL Verificationもしくは(reactions_addedイベント&特定のSlackユーザー&特定のスタンプ)どちらかに一致した場合、次のモジュールを実行します。画像は条件設定の内容です。
Webhook responseはEvent SubscriptionsのChallenge Request用です。
Webhookデータから必要な情報を取得
以下の部分解説です。
以下2つのAPIを呼び出しています。
- Remove Reaction
- reactions.remove APIを呼び出しています。
- スタンプを残したくないためスタンプを押したら削除します。
- 高速でスタンプが削除された場合エラーになってしまうので、Resumeでエラーハンドリングしてます。
- Get Permalink
- chat.getPermalink APIを呼び出しています。
- Permalinkを取得するため専用APIです。
Slackメッセージの送信
最後はSlackに投稿するためにCreate a Messageモジュールで、Permalinkを送信します。
なお、「Unfurl primarily text-based content」を有効化しており、リンクを展開してくれます。
Tips
Slack Connectionsの設定
Slackの認証にはuserとbotの2種類あります。Reacji Channelerで投稿される内容も自分のアカウントから投稿されるようにしたかったのでuserで設定しています。botでも構わないということであればbotでどうぞ。
一部のモジュールについては、userのみ認証可能といった制約もありますが、今回利用したモジュールではuser/botどちらでも可能です。
SlackのScope設定
makeのScenario内でSlackと接続する場合、Connectionsを作成します。Connectionsの画面からSlack Appsに許可するScopeを設定できます。今回は以下のようなScopeを設定しています。
chat:writeはURLを投稿するために必要な権限、reactions:writeはスタンプ削除、channels:readとgroups:readはスタンプが付いた投稿を取得するために必要な権限って感じです。
上述のScopeを指定するとなぜか以下の権限が許可されてます。userで認証すると複数の権限が一緒についてくるのかもしれませんが投稿時点では詳細不明です。時間ある時に調べておきます。厳密に設定したい場合はSlack Botに接続して、Scopeを設定していただければ問題ないと思います。
わざわざ「Make an API Call」使ってるのは?
「Remove a Reaction」というモジュールは以下の画像の通り、Channel Typeを指定しなければいけません。なんでこんなことになっているのかは、よくわかりません。
ちなみに、chat.getPermalinkは「Make an API Call」モジュールで呼び出すしかないです。
リンクの展開について
正直、挙動は安定していないような感触です。Scenario作成当初、リンクが正しく展開されないこともありました。おそらくScope設定によってパブリック・プライベートチャンネルごとの挙動が変わると推察しているのですが、原因はよくわかりません。
ちなみに、以下の公式ドキュメントは無視してOKです。
Slack API – Unfurling links in messages
概要としては、Event Subscriptionsでlinks_sharedイベントを取得することで、指定された特定ドメインのリンクを展開してくれるという話です。対象となるリンクのドメインを指定する必要がありますが、slack.comを含むリンクは指定できないので不要です。
おわりに
今回の内容も無料で実現できるはずなので、ご興味ある方はぜひどうぞ。ただし、わざわざReacji Channelerを作るだけで、挙動が安定せずわけわからんのでやらない方がオススメ。人柱になった人もいるんだなぁと思って、読んでいただけたのであれば嬉しみ。
それではまた年明けたらブログでお会いしましょう。良いお年を。