見出し画像

GASでSlack絵文字(スタンプ)のランキングを投稿するbotを雑に作る

GASで作りたいなと思ったので、作ってみます。
Pythonでも作ってみたいけど、まずはGASで。

いいからまずはコードを見せろ、という人はこちらをどうぞ
https://github.com/ymgcmnk/Slack-emoji-ranking-bot




過去事例/類似事例

「Slack 絵文字 ランキング」「Slack スタンプ ランキング」「Slack スタンプ 集計」などで検索してみると、色々あるようです。

https://github.com/dondoko-susumu/slack-emoji-ranking

最終更新日 2018年06月22日投稿日 2018年06月21日 GASでSlackスタンプランキング

最終更新日 2022年09月30日投稿日 2020年05月24日GASでslackのスタンプ数を集計して順位付けし、結果をslack内のチャンネルに通知する

2021-12-01広報な私が初めて触ったPythonでslack絵文字ランキング作ってみた話


筆者環境

Slack:テスト用に個人で持っている無料ワークスペースで動作確認
ChatGPT:GPT4

作成の流れ

Disclaimer

趣味的に雑に作ったものなので、動作保証はいたしかねます。

このウェブサイトの情報は、一般的な情報提供の目的のみで提供されています。情報は、正確性や信頼性を保証するものではありません。
このウェブサイトの情報を利用することによって生じる損害について、筆者は一切の責任を負いません(負えません)。

AIに相談する

🧠が働かないのでAIに相談して作っていきます。
初回の回答で、まあまあいい感じのコードを回答してくれるんですが、色々突っ込んでいくと抜け漏れがあったりします。こちらの指定の仕方が悪いとも言えますが、例えば、下記のプロンプトで出力されたコードでは、会話内の絵文字は拾うが、リアクションとして押された絵文字はカウントしてなかったりしました。その辺りは、AIと会話を重ねつつ、修正していきました。

質問用プロンプト

Slackのワークスペースでの会話において、利用されている絵文字のランキングを第1位から第10位まで集計し、その集計結果を月に一度、特定のチャンネルに投稿するBotを作成したいです。
・Step by stepで教えてください。
・GAS(Google Apps Script)で作成したいです。
・GAS(Google Apps Script)はV8ランタイムに準拠してください。
・コードには必ずドキュメンテーションコメントを付けてください。
・私の提供する情報に不足がある場合は、それを補うために質問してください。

Chat GPTの回答

了解しました。Slackのワークスペースでの会話において、利用されている絵文字のランキングを集計し、その結果を月に一度特定のチャンネルに投稿するBotをGASで作成する手順を以下に示します。

ステップ1: Slack API Tokenの取得

  1. SlackのAPIページにアクセスします。

  2. "Your Apps"をクリックして新しいAppを作成します。

  3. 必要な権限(例: channels:history, chat:write, emoji:read)を追加します。

  4. "OAuth & Permissions"ページで"Install App to Workspace"をクリックして、ワークスペースにAppをインストールします。

  5. "OAuth & Permissions"ページから"OAuth Access Token"をコピーします。このトークンは後でGASに貼り付けるために使用します。

ステップ2: Google Apps Scriptのプロジェクトの作成

  1. Google Apps Scriptのダッシュボードにアクセスします。

  2. "新しいプロジェクト"をクリックして新しいプロジェクトを作成します。

ステップ3: コードの記述

以下のコードをGASのエディタに貼り付けます。※これはAIの生回答なので信用してはいけません。

/**
 * Slackのワークスペースでの会話において、利用されている絵文字のランキングを集計する関数。
 */
function collectEmojiRanking() {
  const SLACK_TOKEN = 'YOUR_SLACK_API_TOKEN'; // ステップ1で取得したトークンをセット
  const CHANNEL_ID = 'YOUR_CHANNEL_ID'; // 絵文字のランキングを投稿したいチャンネルのID

  // Slackの会話履歴を取得
  const url = `https://slack.com/api/conversations.history?token=${SLACK_TOKEN}&channel=${CHANNEL_ID}&limit=1000`;
  const response = UrlFetchApp.fetch(url);
  const messages = JSON.parse(response.getContentText()).messages;

  // 絵文字の使用回数を集計
  const emojiCounts = {};
  messages.forEach(message => {
    const emojis = message.text.match(/:(\w+):/g) || [];
    emojis.forEach(emoji => {
      if (!emojiCounts[emoji]) {
        emojiCounts[emoji] = 0;
      }
      emojiCounts[emoji]++;
    });
  });

  // 絵文字を使用回数でソートしてトップ10を取得
  const topEmojis = Object.entries(emojiCounts)
    .sort((a, b) => b[1] - a[1])
    .slice(0, 10)
    .map(([emoji, count]) => `${emoji}: ${count}回`).join('\n');

  // 結果をSlackチャンネルに投稿
  const payload = {
    token: SLACK_TOKEN,
    channel: CHANNEL_ID,
    text: `絵文字ランキング:\n${topEmojis}`
  };
  UrlFetchApp.fetch('https://slack.com/api/chat.postMessage', {
    method: 'post',
    payload: payload
  });
}

/**
 * 月に一度、特定の日時に上記の関数を実行するトリガーを設定する関数。
 */
function setMonthlyTrigger() {
  ScriptApp.newTrigger('collectEmojiRanking')
    .timeBased()
    .onMonthDay(1) // 月の1日に実行
    .atHour(9) // 9時に実行
    .create();
}

ステップ4: トリガーの設定

  1. GASエディタの左側の時計のアイコンをクリックして、トリガーのページにアクセスします。

  2. "トリガーを追加"をクリックして、setMonthlyTrigger関数を実行するトリガーを追加します。

以上で、毎月1日の9時にSlackのワークスペースでの会話において、利用されている絵文字のランキングを集計し、その結果を特定のチャンネルに投稿するBotの設定が完了しました。

注意: このコードは基本的なものであり、実際のワークスペースの状況や要件に応じてカスタマイズが必要な場合があります。

コード

GitHub

https://github.com/ymgcmnk/Slack-emoji-ranking-bot


使用したSlack API

  1. conversations.list

  2. conversations.history

  3. chat.postMessage

APIに基づくRequired scopes(Bot tokens)

リファレンス見りゃ書いてあるんだけどね。


うむむ

直近1ヶ月の計算とか、ランキングの計算のあたりが微妙な気がしているんですが、これで動いたので、一旦これでヨシとします。
なんせ僕ちゃん頭が悪いなりに頑張ってるんだぜ、そんな自分にしちゃあ上出来だ。

あ、ページネーションを考慮に入れてないな。入れました。

Slack APIを呼び出す時のトークンをヘッダーに書くのか、ペイロードに書くのか問題。

この辺を雑に眺めてると、やっぱヘッダーに書くと思うんだよなあ。

https://api.slack.com/start/quickstart

https://api.slack.com/web



賢明なる諸兄、諸姉、諸々においては、こうした方がいいんじゃね的なのあれば、ぜひ教えてください。



#Slack
#Bot
#SlackBot
#GAS


いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!