前の記事で、Slackのメッセージの取得できました。毎分動かそうと思うので、2分以上前のメッセージは必要ありません。そこで、この記事では1分以内のメッセージのみに絞って取得します。
Q. 毎分動かすけど、1分以内のメッセージだけにできない? A. oldest引数でできる
現状ではチャンネル内の大量のメッセージ(正確には新しい順に100件)を取り出してしまいます。1分ごとなら、60秒前以降のメッセージだけにすると良さそうです( ルールのスケジュール式 - Amazon CloudWatch Eventsによれば、「CloudWatch Events は、スケジュール式で秒レベルの精度を提供しません。」とのことなので、たまに取得漏れがあるかも知れません。どうしても575を逃してはいけない場合は2分前から取得して、未検出の575だけを抽出した方が良さそうです。)。
conversations.history method | Slackのoldestには「Only messages after this Unix timestamp will be included in results.」と書いてあります。UNIX時間を渡すとそれ以降のメッセージだけを手に入れられるので、「python UNIX時間」で検索し、python 現在時刻のUNIX時間(エポック秒)を取得する | mebeeを見つけます。
import time print(time.time() - 60)
とすると1分前(=60秒前)のUNIX時間が手に入っている様子が確認できます。channelのようにoldestを渡せば良さそうなので、実行するPythonファイルのpayloadにoldestを入れてみましょう。先頭近くに
import time
を追加し、payloadは
payload = { "channel" : "C0123456789", # ここはConversation IDを入れてください "oldest" : (time.time() - 60) }
に変更して次のプログラムになります。
import requests import time url = "https://slack.com/api/conversations.history" token = "xoxb-xxxxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxxxx..." # tokenを入れてください header={ "Authorization": "Bearer {}".format(token) } payload = { "channel" : "C0123456789", # Conversation IDを入れてください "oldest" : (time.time() - 60) } res = requests.get(url, headers=header, params=payload) json_channel_history = res.json() for message in json_channel_history["messages"]: print(message["text"])
Slackアプリから「直前のメッセージ」とメッセージを送り、すぐにPythonプログラムを実行すると「直前のメッセージ」が取得できます。1分以上待ってまた実行すると、直前のメッセージは表示されなくなりました。
散歩の結果、Slackからメッセージを取得するには「Slackのconversations.historyに、channel:history scopeが付与されたtokenとチャンネルのConversation IDを使ってHTTPのGETをすれば良い」なんて文が書けるようになりました。
能力1「Slackからメッセージを取得する」を獲得しました。
次の記事から、能力2「文が五・七・五かを判定する」を獲得します。