はじめに
こんにちは、シルです。
今回は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メソッドを使用する際に必要なスコープは、操作しているチャンネルの種類によって異なります。
そのチャンネルの種類に対応したスコープが必要です。
- channels:history
Slackアプリが追加されているパブリックチャンネルのメッセージや他のコンテンツを表示します。
参考:https://api.slack.com/scopes/channels:history - groups:history
Slackアプリが追加されているプライベートチャンネルのメッセージや他のコンテンツを表示します。
参考:https://api.slack.com/scopes/groups:history - im:history
Slackアプリが追加されているダイレクトメッセージのメッセージや他のコンテンツを表示します。
参考:https://api.slack.com/scopes/im:history - mpim:history
Slackアプリが追加されているグループダイレクトメッセージ(MPDM)のメッセージや他のコンテンツを表示します。
参考:https://api.slack.com/scopes/mpim:history
Conversations APIについては、こちらのページが参考になります。
参考:https://api.slack.com/apis/conversations-api
Content types
application/x-www-form-urlencodedapplication/json
Rate Limites
| Feature/API | Limit | Notes |
|---|---|---|
| Web API Tier 3 | 50+ per minute | Tier 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. |
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"
},
以下はチャンネル上での表示です。




コメント