Pythonを使った、Slackからのメッセージ取得3/3

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

© 2019- estie, inc.