make SaaS

作ってみた事例:自作Reacji Channeler

この記事は「make Advent Calendar 2024」22日目の記事です。

このアドベントカレンダーについて

このアドベントカレンダーは25日間でIPaaS製品の「make」について使い方や、実践を学べる連続ブログ企画です。

おかしん」「ばるす」「たにあん」の3名がリレー形式でお届けします。

25日間のスケジュールは以下の通りです。

日付内容担当
12/1話題のIPaaS製品「make」とはおかしん
12/2makeで作ってみたScenario紹介ばるす
12/3make 基本操作編 機能紹介:Organizationたにあん
12/4make 基本操作編 機能紹介:Scenario、Templateおかしん
12/5make 基本操作編 機能紹介:Connectionsばるす
12/6make 基本操作編 機能紹介:Webhooksたにあん
12/7make 基本操作編 機能紹介:DataStores、DataStructuresおかしん
12/8make 基本操作編 機能紹介:Devicesばるす
12/9make 基本操作編 機能紹介:Functionsたにあん
12/10make 基本操作編 機能紹介:CustomAppsおかしん
12/11make 基本操作編 機能紹介:Flow Control,Tools,Text parserばるす
12/12make ドキュメント動線の話:ResourceHubたにあん
12/13make 検証:Make Bridgeおかしん
12/14make 検証:Make REST APIばるす
12/15make 検証:AI Searchたにあん
12/16make Community Hub:Overviewおかしん
12/17make Community Hub:Academy Courses,Blog Articlesばるす
12/18make Community Hub:Showcase,CustomAppsたにあん
12/19makeの管理運用の話:Github連携おかしん
12/20makeの管理運用の話:実行ログと再実行と停止中リクエスト滞留ばるす
12/21makeの管理運用の話:Connection権限管理たにあん
12/22makeで作ってみた事例:(未定)おかしん
12/23makeで作ってみた事例:(未定)ばるす
12/24makeで作ってみた事例:(未定)たにあん
12/25makeの総論を語るばるす

はじめに

どうも。おかしんさんが多忙につき、意思を受け継いだたにあんです。12/27(金)からタイムスリップしてきました。

今日はmakeでReacji Channelerをつくります。

Reacji Channelerって?

Slack 公式のアレです。スタンプ押したら特定のチャンネルに通知されるアレ。ぼくは「リアク字ってネーミングどうなん?」ってずっと思ってます。

Slack – Slack 用リアク字チャンネラー

どうやら公式のReacji Channelerだと、スレッド内でスタンプを押しても動かないらしいのでワークするように無理やり作り直してみました。今回はパブリック・プライベートチャンネル、DM全対応です。

概要

Scenario全体画面です。思ったよりシンプルですよね?試行錯誤している間、モジュールが15個ぐらいになった瞬間もありましたが、これで十分でした。

スタンプを押すと以下のような投稿が自分のtimeに流れてきます。公式のReacjiと同じはずです。プライベートチャンネルやDMの投稿の場合、URLが投下された後に「メッセージを表示する」か確認されます。チャンネルを確認できる方、全員に見えてしまうのでご注意を。

大まかな流れは以下の通り。

  1. SlackからEvent SubscriptionsでWebhookをmakeで受信
  2. ついたスタンプを消して、受け取ったデータから必要な情報を取得
  3. 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を作るだけで、挙動が安定せずわけわからんのでやらない方がオススメ。人柱になった人もいるんだなぁと思って、読んでいただけたのであれば嬉しみ。

それではまた年明けたらブログでお会いしましょう。良いお年を。

参考

make – Slack

たにあん

2024年12月運用支援サービス(仮)のメンバーとして入社。
とりあえずやってみるをモットーにおしごとをしています。
好きなものは甘いもの。
嫌いなものは甘いものを食べていない時間。