
前の記事で、Slackのメッセージのtokenを手に入れました。この記事では、Slackのメッセージの取得に必要なもう一つの引数である、channelを手に入れ、Slackからメッセージを取得します。
Q. さっきのプログラムにtokenを貼ったら動く? A. まだ。チャンネルを選ばなきゃいけない。
さて、Slack のメッセージ履歴を取得する | DevelopersIO には
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())
と書いてあります。4行目のtokenに、先ほど手に入れたurlを入れて、このPythonプログラムを実行すると…
{'ok': False, 'error': 'channel_not_found'}
うまくいきません。しかしchannel_not_found であることが分かりました。プログラムをよく見ると、"channel" : "C022M6U7G4F"と何か設定されています。Slack のメッセージ履歴を取得する | DevelopersIOの著者が使っているチャンネルの情報のようで、そのチャンネルはもちろん私のworkspaceにはないので自分のチャンネルを指定すべきだと予想をつけます(というか、それ以外はいじらなくて良さそうだし)。
ということで、もしまだ作っていないならslackのチャンネルを作りましょう。
チャンネルを作成する | Slackにしたがって作りました。
Q. チャンネルはどう選ぶの? A. GUIのチャンネルで右クリックしてリンクをコピーすると末尾にあるConversation IDを使おう
そういえばさっきC1234567890みたいなのが必要って言っていたな…と思いながら、よく読むと、Conversation ID to fetch history for.と書いてあるので、「Slack Conversation ID」で検索するとSlack — APIに使う「チャンネルID」を取得する方法 - Qiitaが見つかり、チャンネル名で右クリックして[リンクをコピー]を押すと末尾にConversation IDがありました。

黒塗りが2カ所ありますが、右側の方です。これをPythonコードに入れれば、コードが完成してそうです。
Q. tokenもscopeもチャンネルも設定した。今度こそ動く? A. まだ。チャンネル側にも許可が必要
Conversation IDを11行目に入力して改めてPythonファイルを実行すると…
{'ok': False, 'error': 'not_in_channel'}
うまくいきません。しかしchannel_not_foundではないので、channelは見つかったのでしょう。前進しています。ところでエラーが起きたらまずエラーメッセージで検索することになっているので、「not_in_channel slack」と検索してSlackアプリ制作超入門:最初のBotメッセージを送信するまで | Akashic Recordsを見ます。チャンネルにアプリを追加しなければいけないようです。
Slackアプリのチャンネルで右クリックし、「チャンネル詳細を開く」をクリックし、色んなタブを移動すると[インテグレーション]タブに下のような表示を見つけます。

これでアプリを追加できそうです(この表示でできなかったら文句を言います)。575というアプリを追加し、先ほどのPythonプログラムを実行すると…
{'ok': True, 'messages': [{'type': 'message', 'subtype': 'channel_join', 'ts':...
取得できました! 上記の長いjsonファイルを眺めてmessagesの中にいわゆるメッセージ本文が入ってそうなことを確認して最後を
json_channel_history = res.json()
print(json_channel_history)
for message in json_channel_history["messages"]:
print(message)
とすればメッセージ本文だけが取り出せました。
プログラムを実行すれば、メッセージ本文が取り出せるようになりました。ところが、大量のメッセージを受信してしまいます。次の記事では、必要なメッセージ、つまり1分以内のメッセージだけを取り出します。