Slack のメッセージ履歴を取得する

2021.05.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、森田です。

Slack APIを用いて、チャンネルの履歴を取得しようと試みたところ、以前と方法が変更になっておりました。

 

2021 2月以降 channels.historyの廃止

私が作成したコードでは、当初このchannels.historyを使用していました。

import requests

url = "https://slack.com/api/channels.history" 
token = "XXX"

header={
    "Authorization": "Bearer {}".format(token)
}

payload  = {
    "channel" : "C022M6U7G4F"
    }

res = requests.get(url, headers=header, params=payload)

print(res.json())

しかし、実行結果は、

[ERROR] This method is retired and can no longer be used. 
Please use conversations.history instead. 
Learn more: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api.

見てみると、conversations.historyに変わったよ、となっていますので、下記のように変更したところ上手く動作しました。

import requests

url = "https://slack.com/api/conversations.history" 
token = "XXX"

header={
    "Authorization": "Bearer {}".format(token)
}

payload  = {
    "channel" : "C022M6U7G4F"
    }

res = requests.get(url, headers=header, params=payload)

print(res.json())

API変更の詳細

スレッドメッセージ取得

channels.historyでは、スレッドのメッセージも一緒に返していましたが、conversations.historyではスレッドのメッセージは取得しません。

代わりに、conversations.replies としてAPIが提供されていますので、こちらを用いれば可能です。

import requests

url = "https://slack.com/api/conversations.replies" 
token = "XXX"

header={
    "Authorization": "Bearer {}".format(token)
}

payload  = {
    "channel" : "C022M6U7G4F",
    "ts" : "1622007981.001400"
    }

res = requests.get(url, headers=header, params=payload)

print(res.json())

実行結果

{
	"ok": true,
	"messages": [
		{
			"client_msg_id": "93e971cf-d7a3-498c-8280-2ac09f3a10a8",
			"type": "message",
			"text": "テスト!",
			"user": "U021JKQFJUC",
			"ts": "1622007981.001400",
			"team": "T021R3N359P",
			"blocks": [
				{
					"type": "rich_text",
					"block_id": "en=++",
					"elements": [
						{
							"type": "rich_text_section",
							"elements": [
								{
									"type": "text",
									"text": "テスト!"
								}
							]
						}
					]
				}
			],
			"thread_ts": "1622007981.001400",
			"reply_count": 1,
			"reply_users_count": 1,
			"latest_reply": "1622007986.001500",
			"reply_users": [
				"U021JKQFJUC"
			],
			"is_locked": false,
			"subscribed": false
		},
		{
			"client_msg_id": "4d50d26c-554f-4788-afda-f93941b646f4",
			"type": "message",
			"text": "いいね",
			"user": "U021JKQFJUC",
			"ts": "1622007986.001500",
			"team": "T021R3N359P",
			"blocks": [
				{
					"type": "rich_text",
					"block_id": "SZJ",
					"elements": [
						{
							"type": "rich_text_section",
							"elements": [
								{
									"type": "text",
									"text": "いいね"
								}
							]
						}
					]
				}
			],
			"thread_ts": "1622007981.001400",
			"parent_user_id": "U021JKQFJUC"
		}
	],
	"has_more": false
}

 

conversations.historyとconversations.repliesを組み合わせることで、以前のようなデータを作ることはできそうです!

最後に

Pythonでは、SDKもあるようです。