自身がSlackで使ったリアクション上位 20位のランキングを出してくれるBotをnew Slack Platformで作ってみた

このエントリは 10X アドベントカレンダー2022 という企画の1日目(12/1)の記事です。

こんにちは、10Xでエンジニアリングマネージャーをしている 岡野(@operandoOS)です。

今回 10Xで初となるアドベントカレンダー企画の1日目をありがたく担当させていただきます💪

10XはStailer(ステイラー)という、スーパーマーケット・ドラッグストアなどのチェーンストアのオンライン事業立ち上げと成長に必要なすべてを備えたプラットフォームを開発しています。

なので、はじめに最近よく行くスーパーとよく買う商品の紹介をします!

最近よく行くスーパーは西友で、よく買う商品は「みなさまのお墨付き 塩味えだまめ 大容量 700g」です!

10X アドベントカレンダー2022ってなに?

株式会社10Xのメンバーが送る、2022年アドベントカレンダー企画です🎄 🎅 🎍

10xall.notion.site

アドベントカレンダーは12/1から12/25まで毎日ブログを投稿していくので通常ですが、10X アドベントカレンダーはなんと12/31まで投稿が続きます!

もはやアドベントカレンダーと言っていいのか謎な企画ですが、毎日10Xのメンバーが様々なテーマでブログを書いてくれるので、ぜひお楽しみに✨

12/31 最終日は10X CEOのyamottyさんがバシッと締めてくれるのも見所です!

さてさて、本題へ

いきおいでアドベントカレンダー 1日目を担当することになりましたが、何を書こうかと色々迷いました。

考えている最中に「そういえば、去年 Slackで使われているリアクションを集計してランキング出したなー」みたいなことを思い出しました。その集計結果をまとめた記事が以下になるので、ご興味があれば読んでみてください。

signal.diamond.jp

前回集計したのは全メンバーのリアクション利用履歴を合算したものでした。今回は自分が利用したリアクションを集計してランキング出してみよう!と思い立ち、過去書いたPythonスクリプトを掘り出すところからスタートしました。

Python...なるほど...わからん

過去書いたPythonスクリプトはサクッと見つかりましたが問題発生です💥

私は年に数回しかPythonを書きません。つまり、Pythonわからないんですよ。なぜ去年Pythonスクリプトを書いたのかもよく覚えてません。

でも今回もまずはPythonで書きます。

全メンバーのリアクション利用履歴を合算する実装

前回集計した時にはSlackのconversations.list APIを使いました。

api.slack.com

コードをGitHubで公開してますので詳細は割愛します。

github.com

自分が利用したリアクション履歴の取得

SlackのAPIを眺めていたところ reactions.list というまさに求めていたAPIがありました。

api.slack.com

このAPIを使えばいけそうと思い不慣れなPythonでコードを書き始めます。

集計範囲をどうするか

アドベントカレンダーネタだし集計範囲は2022年に行ったリアクションを対象にしよう!と思いコードを書いていたのですが、リアクションした日時が取得できないことがわかりました。

細かいことを考えるのが面倒になったので、全件取得する実装にしてみたところリアクション履歴の量が多く、1APIコールで1000件ずつ取得しても全件取得に2分程度がかかりました。

でも1ショットのスクリプトだしいいや!ってことで実装完了です🎉

完成したスクリプトGitHubで公開してます。

github.com

アプリケーションにしたい!Slack Botにしたい!

スクリプトが完成したのが 11/28です。この時点ではまだ記事は全く書いておらず、ひたすらコードを書いてました。

にもかかわらず、「このスクリプトをアプリケーションにしたい!Slack Botにしてみんなに楽しんでもらいたい!」と思ってしまったのです。

「でもアプリケーションを書いたとしてどこで動かせばいいんだ!もう時間がない!」と悩んでいたところあるワードが頭をよぎります。

「Slack Platformだ!」

New Slack Platform

今年の9月にPublic BetaになったSlackの「次世代プラットフォーム」があります。

それが何なのかを超ざっくり説明すると、実装したアプリケーションをSlackのCloudサーバにデプロイします。デプロイ先には実行環境が用意されているためデプロイしたらアプリケーションが動きます。いわゆるサーバーレスです。自身でAWS,GCPなりで実行環境の用意が不要になり最高です!

api.slack.com

SlackのDeveloper Relationsの方がとてもわかりやすい記事を書いてるので、詳細はこちらを参照してください。

qiita.com

なんもわからん...

アプリケーションを動かす環境の心配がなくなったとはいえ、Slack Platformの知識といえばDeno使う!くらいしかありませんでした。

カレンダーを見ると 11/29です。「まだあわてるような時間じゃない」仙道もそう言ってます。

まずはサンプルアプリケーションを動かすところからはじめるため、以下の記事を読みました。

developer.mamezou-tech.com

サンプルはSlack CLIの操作だけ動かすところまでいけるのでとても簡単でした👍

次はよりアプリケーションを実装する上での概念を知るために、以下の記事を読みました。

tech.travelbook.co.jp

「すごく詳細にまとまっていていい記事だな...Functions、Workflows、Triggers...なるほど...なんもわからん...」

アプリケーションの要件を整理する

そもそも作るべきアプリケーションの要件が決まっていないと、限られた時間の中で何を学べばいいのか定まらないことに気づき、実装したいアプリケーションの要件を整理し始めました。

リアクションランキング出してくれるBotさんの要件は以下です。

  • Botさんにメンションしたら動作する
  • 自分だけではなく、Botさんをメンションした人のリアクションを取得し集計、利用回数が多い順にソートする
  • 取得するリアクション履歴は直近利用の最大1000件まで(1APIコールで取得できる範囲にする。それ以上取得するとBotのレスポンスが遅い)
  • 利用回数が多いリアクション 上位 20位をSlackにBotさんが投稿する

Botにメンションしたメッセージをオウム返しするアプリケーションを作る

まずは "Botさんにメンションしたら動作する" の要件を実装します。

yusukebeさんが作っていたBotがまさにメンションしたら動作するアプリケーションだったので、これを参考に最初に作ったサンプルアプリケーションを改造しました。

github.com

実装できた時の喜びです!

11/30 7:59 AM 「完全に理解した」

11/30 7:59 AM。タイムリミットは近づいています...。

自分だけではなく、Botさんをメンションした人のリアクションを取得し集計、利用回数が多い順にソートする

reactions.list APIのリクエストパラメーターにuserが用意されており、これを設定してAPIコールすると設定したユーザーのリアクション履歴を取得できます。

Slack PlatformのアプリケーションはBotにメンションしたユーザーのIDを取得するような実装ができるため、それを利用しました。

あとは取得するリアクション履歴は直近利用の最大1000件までとするため limitパラメーターに1000と設定します。

これでBotにメンションしたユーザーのリアクション履歴を取得する実装ができたので、あとはAPIレスポンスをゴニョゴニョしてリアクションごとに利用回数を集計し、利用回数が多い順にソートします。

APIコールして、集計して、ソートする実装は元々Pythonスクリプトで実装していたので、それをTypeScriptで書き直す作業だったのですんなり実装できました。

利用回数が多いリアクション 上位 20位をSlackにBotさんが投稿する

利用回数が多い順にソート済みなので、そこから上位 20位を取り出すのはslice使えば楽勝です🏄🏼‍♀️

あとは上位 20位のランキングをちょこっと整形して、最後はランキングとしてBotさんにSlackに投稿してもらいます。メッセージを投稿する実装は公式SDKが用意してくれている Schema.slack.functions.SendMessageFunctionを使えば楽勝です😎

それ以外にも公式SDKで用意されているFunctionがあり、自身で実装しなくてもそれなりのことはできそうです。

api.slack.com

11/30 1:28 PM 「完全に勝利した」

11/30 1:28 PM。う、動いた!

みんなに試してもらう

自分以外の人がやってもちゃんと動くか確認するために、数名に試してもらい、問題なく動いてることが確認できました。

みんな自身がどんなリアクションをよく使っているか知るためにバシバシBotさんにメンションをしてくれて、randomチャンネルはランキングの投稿で埋め尽くされました。自身のリアクションランキングだけではなく、他者のランキングを見てわいわい言い合ってるrandomチャンネルをひたすら眺めていました。

みんながわいわい試している光景

この時「楽しく使ってくれてよかった。スクリプト止まりじゃなくてアプリケーションにしてよかった。アプリケーション開発、、、楽しい😂」と心から思った瞬間でした(仕事しろ)

slack deploy

ここまで作ったアプリケーションをローカルPCで動かしていましたが、このままだとPCが止まるとBotも止まってしまうため、アプリケーションをSlackのCloudサーバーにデプロイします。

slack deployコマンドを実行するとデプロイが完了し、あとはslack trigger create --trigger-def ./triggers/mention_trigger.tsコマンドを実行するだけで、SlackのCloudサーバーでアプリケーションが動くようになります。

一連の開発体験はとても良かったので、また機会があれば使ってみようと思いました。

あなたのSlackでもリアクションランキングBotをお楽しみいただけます

今回作ったリアクションランキングBotGitHubで公開しています。

github.com

実装の都合上 動かすために多少準備が必要ですが、READMEのSetup部分を一つずつやっていただけると、あなたのSlackでもリアクションランキングBotをお楽しみいただけます。

もしご興味があれば試していただけるととても嬉しいです!

何かうまくいかないことがあればissue等でご連絡いただければ、可能な範囲でサポートいたします。

おわりに

new Slack PlatformでリアクションランキングBotさんを作るまでの流れを長々と書きました。

細かい実装の説明をほぼ書いてないので、ご興味が方はGitHubに公開してるコードや公式ドキュメントを参照いただけると助かります🙏

明日 12/2 は @sota1235さんがとってもすばらしいブログを書いてくれるはずなので、お楽しみに😊

おまけ

10Xではエンジニアリングマネージャーの採用募集をしてます!少しでも興味がある方は、まずはカジュアル面談から話しましょう!

open.talentio.com

10x.co.jp