前の記事で、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分以内のメッセージだけを取り出します。