Slack botが投稿したメッセージだけまとめて消すスクリプトを作る

やりたいこと

動体検知ペットカメラ(Slackに動画を投稿)を設置したら誤検知含めてSlackにバンバン投稿しまくるのでメッセージ数上限にすぐに到達してしまったので消すゾ
でもBotが投稿したメッセージ以外は消さないようにしたいゾ

手順

1. Slack Botに権限を付与する

今回のスクリプトは、動体検知ペットカメラと同じSlack Bot①メッセージの履歴取得②メッセージ削除の2つを行うため、以下の権限を追加します。

  1. channels:history
  2. chat:write

2. スクリプトを作る

だいたい以下のような感じにしました。slack_sdkを使っています。
conversations_history によるメッセージ取得は最大100件ですが、 chat_delete は1件ずつしか消すことができません。
そのため、1件ずつちまちま消しているわけですが、1分に50回以上叩くとレートリミットに引っかかるので、引っかかったとき用のエラーハンドリングを用意しています。
レートリミットは SlackApiError としてレイズされるので、これを拾ってSleepとかすればとりあえずは動くものになります。

from slack_sdk import WebClient, errors

cid = "your_slack_channel_id"
wc = WebClient(token="your_slack_bot_token")

# 7日前までの日付
latest = datetime.now() - timedelta(days=7)

# 指定チャンネルのメッセージ履歴を取得
r = wc.conversations_history(channel=cid, latest=latest.timestamp())

for i in r["messages"]:
    # Slack Botによる投稿ではない場合消さない
    if i["user"] != "your_slack_bot_user_id":
        continue
    try:
        ri = wc.chat_delete(channel=cid, ts=i["ts"])
    except errors.SlackApiError:
        # APIリミットによるエラー、必要に応じてリトライなど

投稿者がSlack Botじゃないメッセージは消さないようにする処理ですが、Slack Botのuser_idが分かればそこから判別可能です。
user_idは auth.test を実行することで確認できます。↓からテスト実行するのが早いです。

api.slack.com

参考

api.slack.com

api.slack.com

api.slack.com