コーディング無し!Slackのカスタム絵文字を集計して定期的にチャンネルへ通知する #Alteryx
はじめに
弊社ではコミュニケーションツールとしてSlackを2019年1月から使い始めました。導入から4ヶ月経ちましたが、自作絵文字を登録できるカスタム絵文字の機能がそれはもう便利かつ楽しくて楽しくてしょうがないです。
カスタム絵文字があることでお礼のバリエーションが増えましたし……
気軽に挨拶もできるようになり、メンバー間のコミュニケーションがより円滑化されました!
いいことづくしのカスタム絵文字ですが、少しばかり問題点も出てきました。導入して4ヶ月、弊社のカスタム絵文字は2019年5月20日現在で3082件まで爆増したのです。
カスタム絵文字で川柳を詠むチャンスを虎視眈々と伺っている私としては、新規登録された絵文字は確実に把握しておかなければなりません。
この課題を解決すべく、以下の処理を実装します。
- Slack APIを使用してカスタム絵文字一覧を取得
- 新規登録絵文字を取得、削除絵文字件数、カスタム絵文字総数を集計
- 1日1回、結果をSlackチャンネルへ通知する
タイトルにもある通り、これらの処理をコードで書かずAlteryxのみで実現します。
もくじ
Slack APIを使用してカスタム絵文字一覧を取得
Slack Appを作成
今回使用したAPIはカスタム絵文字を一覧で取得するemoji.listです。「ん?」と思った方もいるかもしれませんが、たしかにプログラムを書いて同様の処理をさせる場合はカスタム絵文字に変更が加えられた場合に指定のURLへイベントを通知するemoji_changed eventの方が便利です。今回はコーディング無しで作成するため、emoji.listの方を採用しています。(emoji_changed eventを使って同様の処理をAlteryxで実現する場合は、Server APIを呼び出すプログラムの作成が必要となります…)
SlackでAPIを使用するには以下URLよりSlack Appを作成する必要があります。
[Create a Slack App]をクリックします。
Slack Appの名前、Slack Appを導入するワークスペースを選択し、[Create App]をクリックすると作成されます。
Appが作成されたら[Display Information]よりアイコン画像・名前・説明・背景色が変更できるので、適宜可愛くしておきましょう。
機能を持たせるため、目的に合ったスコープを設定します。[Basic Information]の[Add features and functionality]で必要なスコープを選択します。
今回のケースでは、以下の機能が必要となります。
- Slackのカスタム絵文字を読み込む→Permissions
- Slackチャンネルへ投稿する→Incoming Webhooks
Incoming Webhooks(Slackへメッセージをポストする)
まずはIncoming Webhooksから設定します。
[Add New Webhook to Workspace]をクリックします。
投稿先のチャンネルを指定して「許可する」を押すと……
Webhook URLが生成されました。このURLがSlackにメッセージを送る処理で必要となりますのでいつでもCOPYできるようにしておきましょう。
Permissions(カスタム絵文字のリストを取得する)
続いてはPermissionsの設定です。ここでカスタム絵文字のリストを取得するための設定を実施します。
[Select Permission Scopes]から[emoji:read]のAPIを選択してSave Changesで保存します。
[OAuth Access Token]の値がTokenとなるので保存しておきます。
カスタム絵文字リストを取得するために必要なURLは以下のリンクから取得可能です。
先ほど取得したTokenを入力し、Test Methodを押すと以下部分にURLが表示されます。
Alteryxでワークフローを作成
ここまでSlack側の準備ができたら次はAlteryxでワークフローを作ります。今回作成したワークフローの全容は以下の通りです。
処理内容は以下の通りです。
- Slack APIから新規のカスタム絵文字リスト・前回保存したカスタム絵文字リストをS3から取得し、2件のリストを結合
- 削除された絵文字数をカウント
- 新規追加された絵文字を取得
- 全カスタム絵文字リストの件数をカウント
- 今回取得したカスタム絵文字リストをS3にアップロード
- Slackチャンネルへポスト
Slack APIから新規のカスタム絵文字リスト・前回保存したカスタム絵文字リストをS3から取得し、2件のリストを結合
とにもかくにもまずはカスタム絵文字のリストを取得しましょう。
S3からダウンロード
一度カスタム絵文字リストを出力し、S3にアップロードしたものをAmazon S3 Downloadツールで取得します。
Slack APIからリストを取得
前項「Permissions(カスタム絵文字のリストを取得する)」で取得したURLの出番がやってきました。Text Inputツールで以下のような形で値を入れます。
DownloadツールでURLを指定します。OutputにはStringを指定し、カスタム絵文字のエイリアス名に日本語が入っている場合は文字コードをUTF-8にしておきましょう。
あとはJSON形式で取得したリストをJSON Parseツールで処理しやすいようパースして、
カスタム絵文字だけを取得するため、[JSON Name]がemoji.
で始まっているものを取得します。加えて、別名登録されたエイリアスではないものを指定するために[JSON_ValueString]でalias:
から始まるものを除外しています。
上記で取得したカスタム絵文字リスト2つをJoinツールを使って[JSON_Name]をキーとして結合させます。
削除された絵文字数をカウント
前回実行時のカスタム絵文字リストには存在しているが、今回実行時のリストには存在していない絵文字こそが削除された絵文字となります。つまり、JoinツールのLアンカーからの出力結果が削除された絵文字としてカウントすべきものです。Count Recordsツールを接続して件数を取得しましょう。
SlackへポストするためのJSON生成
件数がカウントできたら、Slackにポストする文言をJSON形式で生成しましょう。SlackへポストするためのJSON形式はいろいろありますが、もっともシンプルなものがtext
を使ったメッセージです。
{"text":"ポストする内容"}
削除件数と組み合わせて以下のようなメッセージが表示されるようFormulaツールで設定します。
Selectツールを使い、生成したJSONだけを後続へ流すように設定します。
新規追加された絵文字を取得
今回のメインとなる処理です。そもそも新規絵文字の取得がしたくてこのワークフローを作り始め、ゴールデンウィークもAlteryxを触っていたのです。前回実行時のカスタム絵文字リストには存在せず、今回実行時のリストには存在している絵文字が新規追加されたものですので、JoinツールのRアンカーから出力された結果を処理します。
Formulaツールで絵文字名の形式を整える
Slackで絵文字を表示させる:絵文字名:
の形式にするため、emoji.絵文字名
となっている値をFormulaツールで変換します。
新規登録絵文字が無い場合の処理もする
新規登録絵文字が無い場合でもエラーにならないような処理をします。Count Recordsツールで件数をカウントし、Append Fieldsツールで件数と新規絵文字リストを合体させます。
Append Fieldsツールはデフォルトで16レコード以上の場合はエラーになる設定となっています。エラーとならないようAllow All Appends
を指定しておきましょう。
件数が0だった場合、[JSON Name]に「なし」と表示されるようにFormulaツールを使って設定します。後続の処理でデータを縦持ちに変換するため、[emoji]項目に「emoji」という値を入れておく処理もここで実施しておきます。
JSON形式に変換する
Cruss Tubツールで横持ちのデータを縦持ちに変換します。分析や可視化をする際はデータが縦持ちになっていることが鉄則です!Cross Tubツールではデフォルトでサイズの上限が2048byteと指定されていますので、あまりにもカスタム絵文字が多い場合はここで切り捨てられていくので注意してください。
SlackにポストするためのJSONをFormulaツールで生成します。ここでの処理となるポイントは以下の通り。
DateTimeToday()
で実行日付を表示- 太字で強調したいメッセージを
*
で囲む ¥n
でメッセージの改行
全カスタム絵文字リストの件数をカウント
カスタム絵文字の総数も把握したいのでカウントしましょう。別名で登録されたエイリアス名を除いた件数をカウントするため、前項「Slack APIからリストを取得」編でFilterツールを使って絞った件数にCount Recordsツールを繋げます。
これまでと同様、SlackにポストするためのJSONを生成し、SelectツールでJSONだけを選択します。
今回取得したカスタム絵文字リストをS3にアップロード
今回実行して得た結果を次回実行時に読み込みできるようS3へアップロードしておきます。いつ時点のリストなのか判断できるよう、実行日付をFormulaツールで生成し、Amazon S3 Uploadツールでアップロードします。
Slackチャンネルへポスト
材料が揃ったらいよいよ最後はSlackチャンネルへポストしましょう。まずはUnionツールを使ってこれまでに生成した3つのJSONデータを結合します。
前項「Incoming Webhooks(Slackへメッセージをポストする)」編で取得したWebhook URLをText Inputツールに入力し、Append Fieldsツールで結合させます。
最後にDownloadツールを使ってSlackへポストします。設定内容は以下の通り。
- Basicタブ
- Text Inputツールで入力したWebhook URLを指定
- Outputに
Blob
を指定
- Headerタブ
- Addより以下項目を追加
- Name:
Content-type
- Value:
application/json
- Name:
- Addより以下項目を追加
- Payloadタブ
- HTTP Action:
POST
- Take Query String/Body from Fields: emoji(JSONが格納されている項目を指定)
- HTTP Action:
Slackチャンネルにポストされた結果
ワークフローを実行すると、こんな感じでメッセージがポストされます。
ただの犬の絵文字に見えますが、:confusedpuppy:
で登録された、首を傾げる可愛いワンちゃんの絵文字です。何を言っているのかわからないメッセージへのリアクションに最適ですね。
おわりに
コーディングなしですが、Slackのカスタム絵文字リストを取得してチャンネルへポストするところまでAlteryxで実装できました。Alteryxで定期的にスケジュールしてパブリックチャンネルにポストするように設定したところ、新しい絵文字を使ったコミュニケーションが生まれるようになりました!無尽蔵に増えるSlackのカスタム絵文字にお悩みの方のお役に立てば嬉しいです。
参考資料
- 15,000個のカスタム絵文字を支える、Slack絵文字登録術 - Qiita
- AlteryxからSlackにテキストメッセージを送信する | DevelopersIO
- Slackで使用されたリアクション絵文字の回数をAlteryxで集計してTableauで可視化してみた(一部結果を公開) #Alteryx #Tableau | DevelopersIO
Alteryxの導入なら、クラスメソッドにおまかせください
日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。