1分以内のSlackメッセージの取得

前の記事で、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「文が五・七・五かを判定する」を獲得します。

© 2019- estie, inc.