IT技術関連Slack

Slack:Web APIを利用して投稿を取得する

Slack

はじめに

こんにちは、シルです。
今回はAPIメソッドを使用して、会話の履歴(メッセージやイベント)を取得します。

どのような使い方ができるのか

  • データ分析
    チャンネル内の投稿内容を分析し、統計情報を取得する場合。
  • バックアップ
    重要なチャンネルの投稿を定期的にバックアップする場合。
  • モニタリング
    特定のキーワードやフレーズを含む投稿を監視し、リアルタイムで通知するシステムを構築する場合。
  • カスタム通知
    特定の条件に基づいてカスタム通知を設定し、特定のチャンネルの投稿に対してアクションを取る場合。

conversations.historyについて

今回は、「conversations.history」メソッドを利用します。
以下にSlack公式の解説ページの内容を簡単にまとめます。

参考:Slack | conversations.history method

エンドポイント

  • POST https://slack.com/api/conversations.history

スコープ

  • Bot User OAuth Tokens
    channels:history,
    groups:history,
    im:history,
    mpim:history
    ⇨今回はBot User OAuth Tokensを利用
  • User OAuth Tokens
    channels:history,
    groups:history,
    im:history,
    mpim:history

各スコープの詳細

このConversations APIメソッドを使用する際に必要なスコープは、操作しているチャンネルの種類によって異なります。
そのチャンネルの種類に対応したスコープが必要です。


Conversations APIについては、こちらのページが参考になります。
参考:https://api.slack.com/apis/conversations-api

Content types

  • application/x-www-form-urlencoded 
  • application/json

Rate Limites

Feature/APILimitNotes
Web API Tier 350+ per minuteTier 3 methods allow a larger number of requests and are typically attached to methods with paginating collections of conversations or users. Sporadic bursts are welcome.
参考:Slack | Rate Limites

Limit(制限)について

Web API Tier 3に該当します。
1分間に50以上のリクエスト制限があります。この制限を超えるリクエストを送信すると、SlackのAPIはエラーを返します。

Notes(注意事項)について

Tier 3 メソッドは、他のTierよりも多くのAPIリクエストを処理できる能力があります。
これにより、アプリケーションがより多くのデータを迅速に取得することができます。

投稿を取得する

事前準備

詳細なアプリの作成手順は、「Slack | Web APIを使用してメッセージを投稿する」を参照して下さい。

① https://api.slack.com/apps/にアクセスし、アプリを選択します。
  まずは、アプリにScopeを追加します。
  今回はパブリックチャンネルに対して実行するので、以下のように「channels:history」が追加されていればOK

② 実行したいチャンネルにアプリを追加しておきます。

投稿を取得する

JavaScriptで実行します。

① Node.jsでAxiosを使用する方法で紹介します。
  「npm install axios」でパッケージをインストールし、実行コマンド「node xxxx.js」を実行します。
   ・「channelId」には、投稿したいチャンネルのチャンネルIDを入力してください。
   ・「token」には、Bot User OAuth Tokenを入力してください。

const axios = require("axios");
const fs = require("fs");

// ここにあなたのSlack APIトークンを設定してください
const token = "xoxb-your-slack-token";

// ここに取得したいチャンネルIDを設定してください
const channelId = "CXXXXXXXXXX";

// チャンネルの投稿データを取得する関数
async function fetchConversationsHistory(channel) {
  try {
    const params = {
      channel: channel,
    };
    const response = await axios.post(
      "https://slack.com/api/conversations.history",
      params,
      {
        headers: {
          "Content-Type": "application/json",
          Authorization: `Bearer ${token}`,
        },
      }
    );

    if (response.data.ok) {
      console.log("Channel History:", response.data.messages);
      // 取得したデータをJSONファイルに保存
      saveDataToFile(response.data.messages, "channel_history.json");
    } else {
      console.error("Error fetching channel history:", response.data.error);
    }
  } catch (error) {
    console.error("Axios error:", error);
  }
}

// データをJSONファイルに保存する関数
function saveDataToFile(data, filename) {
  fs.writeFile(filename, JSON.stringify(data, null, 2), "utf8", (err) => {
    if (err) {
      console.error("Error saving data to file:", err);
    } else {
      console.log(`Data saved to ${filename}`);
    }
  });
}

// チャンネルの投稿データを取得してファイルに保存
fetchConversationsHistory(channelId);

② ファイルが出力され、中身を確認すると、取得できていることがわかります。

取得したデータを見てみる

先ほどのプログラムを実行し、出力されたファイルの内容を確認します。
投稿内容には、以下のような種類があるのでそれぞれの特徴を見てみます。

  • 招待メッセージ
  • BOTによる投稿メッセージ
  • ピン留め
  • メッセージとリアクション
  • ファイル投稿

招待メッセージ

招待メッセージは、誰かがチャンネルに招待された際に、自動で投稿されるメッセージです。
以下が出力されたデータです。

  {
    "subtype": "channel_join",
    "user": "UXXXXXXXXXX", // 投稿したユーザー
    "text": "<@UXXXXXXXXXX>さんがチャンネルに参加しました", // メッセージ
    "inviter": "UXXXXXXXXXX", // 招待したユーザー
    "type": "message",
    "ts": "1234567890.123456" // 投稿されたタイムスタンプ
  },
  {
    "subtype": "channel_join",
    "user": "UXXXXXXXXXX",
    "text": "<@UXXXXXXXXXX>さんがチャンネルに参加しました",
    "type": "message",
    "ts": "1234567890.123456"
  }

以下はチャンネル上での表示です。

BOTによる投稿メッセージ

SlackのWebAPIを使用し、投稿したメッセージです。

  {
    "user": "UXXXXXXXXXX", // 投稿したユーザー
    "type": "message",
    "ts": "1234567890.123456", // 投稿したタイムスタンプ
    "bot_id": "BXXXXXXXXXX",
    "app_id": "AXXXXXXXXXX",
    "text": "テスト投稿", // メッセージ
    "team": "TXXXXXXXXXX", // チームID
    "bot_profile": {
      "id": "BXXXXXXXXXX",
      "app_id": "AXXXXXXXXXX",
      "name": "Service App",
      "icons": {
        "image_36": "https://a.slack-edge.com/80588/img/plugins/app/bot_36.png",
        "image_48": "https://a.slack-edge.com/80588/img/plugins/app/bot_48.png",
        "image_72": "https://a.slack-edge.com/80588/img/plugins/app/service_72.png"
      },
      "deleted": false,
      "updated": 1714900159,
      "team_id": "TXXXXXXXXXX"
    },
    "blocks": [
      {
        "type": "rich_text",
        "block_id": "kmIwi",
        "elements": [
          {
            "type": "rich_text_section",
            "elements": [
              {
                "type": "text",
                "text": "テスト投稿"
              }
            ]
          }
        ]
      }
    ]
  },

以下はチャンネル上での表示です。

ピン留め

ピン留めされた投稿です。

  {
    "user": "UXXXXXXXXXX ",
    "type": "message",
    "ts": "1234567890.123456",
    "client_msg_id": "20566ca8-5c7b-425f-bfb2-7b670976cd36",
    "text": "テスト。\nピン留めしたい投稿。\nピン留めしたい投稿。",
    "team": "TXXXXXXXXXX",
    "blocks": [
      {
        "type": "rich_text",
        "block_id": "LHP6h",
        "elements": [
          {
            "type": "rich_text_section",
            "elements": [
              {
                "type": "text",
                "text": "テスト。\nピン留めしたい投稿。\nピン留めしたい投稿。"
              }
            ]
          }
        ]
      }
    ],
    // 以下はピン留めに関する要素
    "pinned_to": [
      "CXXXXXXXXXX"
    ],
    "pinned_info": {
      "channel": "CXXXXXXXXXX",
      "pinned_by": "UXXXXXXXXXX",
      "pinned_ts": 1716131022
    }
  },

以下はチャンネル上での表示です。

メッセージとリアクション

ユーザーが投稿したメッセージとリアクションです。

{
    "user": "UXXXXXXXXXX",
    "type": "message",
    "ts": "1234567890.123456",
    "client_msg_id": "08b6e171-de50-425a-a218-a443dc7af6a0",
    "text": "テスト。\nリアクションを付与する。",
    "team": "TXXXXXXXXXX",
    "blocks": [
      {
        "type": "rich_text",
        "block_id": "I3D54",
        "elements": [
          {
            "type": "rich_text_section",
            "elements": [
              {
                "type": "text",
                "text": "テスト。\nリアクションを付与する。"
              }
            ]
          }
        ]
      }
    ],
    // 以下はリアクションに関する要素
    "reactions": [
      {
        "name": "+1",
        "users": [
          "UXXXXXXXXXX"
        ],
        "count": 1
      }
    ]
  },

以下はチャンネル上での表示です。

ファイル投稿

画像ファイルの投稿です。

{
    "text": "files.png",
    "files": [
      {
        "id": "FXXXXXXXXXX",
        "created": 1714997709,
        "timestamp": 1714997709,
        "name": "files.png",
        "title": "files",
        "mimetype": "image/png",
        "filetype": "png",
        "pretty_type": "PNG",
        "user": "UXXXXXXXXXX",
        "user_team": "TXXXXXXXXXX",
        "editable": false,
        "size": 592064,
        "mode": "hosted",
        "is_external": false,
        "external_type": "",
        "is_public": true,
        "public_url_shared": false,
        "display_as_bot": false,
        "username": "",
        "url_private": "https://files.slack.com/files-pri/TXXXXXXXXXX-FXXXXXXXXXX/files.png",
        "url_private_download": "https://files.slack.com/files-pri/TXXXXXXXXXX-FXXXXXXXXXX/download/files.png",
        "media_display_type": "unknown",
        "thumb_64": "https://files.slack.com/files-tmb/TXXXXXXXXXX-FXXXXXXXXXX-2c6504fc0b/files_64.png",
        "thumb_80": "https://files.slack.com/files-tmb/TXXXXXXXXXX-FXXXXXXXXXX-2c6504fc0b/files_80.png",
        "thumb_360": "https://files.slack.com/files-tmb/TXXXXXXXXXX-FXXXXXXXXXX-2c6504fc0b/files_360.png",
        "thumb_360_w": 360,
        "thumb_360_h": 206,
        "thumb_480": "https://files.slack.com/files-tmb/TXXXXXXXXXX-FXXXXXXXXXX-2c6504fc0b/files_480.png",
        "thumb_480_w": 480,
        "thumb_480_h": 275,
        "thumb_160": "https://files.slack.com/files-tmb/TXXXXXXXXXX-FXXXXXXXXXX-2c6504fc0b/files_160.png",
        "thumb_720": "https://files.slack.com/files-tmb/TXXXXXXXXXX-FXXXXXXXXXX-2c6504fc0b/files_720.png",
        "thumb_720_w": 720,
        "thumb_720_h": 412,
        "thumb_800": "https://files.slack.com/files-tmb/TXXXXXXXXXX-FXXXXXXXXXX-2c6504fc0b/files_800.png",
        "thumb_800_w": 800,
        "thumb_800_h": 458,
        "thumb_960": "https://files.slack.com/files-tmb/TXXXXXXXXXX-FXXXXXXXXXX-2c6504fc0b/files_960.png",
        "thumb_960_w": 960,
        "thumb_960_h": 549,
        "thumb_1024": "https://files.slack.com/files-tmb/TXXXXXXXXXX-FXXXXXXXXXX-2c6504fc0b/files_1024.png",
        "thumb_1024_w": 1024,
        "thumb_1024_h": 586,
        "original_w": 1920,
        "original_h": 1098,
        "thumb_tiny": "AwAbADCqBUiLTRU8I53HovNAFmGFwMkYqwDtHJqokjMwxux1JNLJLu+Vc5PfFJO42TPNjpVaSZjxmkkbHQE1CM5JPU0xDFqcOIxt3AEdaii++KnwM5wKTVwQ9WJQE9aaWpDTTTAGNRk0pphoA//Z",
        "permalink": "https://silblog-community.slack.com/files/UXXXXXXXXXX/FXXXXXXXXXX/files.png",
        "permalink_public": "https://slack-files.com/TXXXXXXXXXX-FXXXXXXXXXX-8874a4d2ba",
        "is_starred": false,
        "has_rich_preview": false,
        "file_access": "visible"
      }
    ],
    "upload": true,
    "user": "UXXXXXXXXXX",
    "display_as_bot": false,
    "blocks": [
      {
        "type": "rich_text",
        "block_id": "jheCh",
        "elements": [
          {
            "type": "rich_text_section",
            "elements": [
              {
                "type": "text",
                "text": "files.png"
              }
            ]
          }
        ]
      }
    ],
    "type": "message",
    "ts": "1234567890.123456",
    "bot_id": "BXXXXXXXXXX",
    "app_id": "AXXXXXXXXXX"
  },

以下はチャンネル上での表示です。

コメント

タイトルとURLをコピーしました