やりたいこと
動体検知ペットカメラ(Slackに動画を投稿)を設置したら誤検知含めてSlackにバンバン投稿しまくるのでメッセージ数上限にすぐに到達してしまったので消すゾ
でもBotが投稿したメッセージ以外は消さないようにしたいゾ
手順
1. Slack Botに権限を付与する
今回のスクリプトは、動体検知ペットカメラと同じSlack Botで①メッセージの履歴取得②メッセージ削除の2つを行うため、以下の権限を追加します。
- channels:history
- 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
を実行することで確認できます。↓からテスト実行するのが早いです。