Python Slack SDK を選んだ理由
この記事を書いている2021年4月現在、Slack を操作するために Python を使うなら Python Slack SDK が最善ではないかと思います。また変わるかもしれませんが、わざわざ古いものを使うメリットはありません。
Python Slack SDK はドキュメントが非常に充実しています。
また、https://api.slack.com/ にある Python のサンプルコードも Python Slack SDK を使うものになっています。
やりたいこと
- 古い Slack の投稿を一括削除したい
また、前提条件として次の三つがあります。
- 対象チャンネルの全ての投稿について既に削除権限がある
- 対象チャンネルはあらかじめ特定されている
- 使うのは自分だけ
コードを書く前の準備
Slack API のトークンを手に入れる必要があります。
古い投稿を削除するので、どれが古いのかを探す権限が必要です。
また、当然に削除権限も必要です。
そうなると、Web API だけ使えれば十分で、User として動けばいいことになります。
必要なメソッドは、
conversations.history
https://api.slack.com/methods/conversations.history
と
chat.delete
https://api.slack.com/methods/chat.delete
だけです。
そして、この二つを使うために必要な権限は、channels:history と chat:write の二つです。
User Token Scopes にこの二つの権限を設定し、ワークスペースにインストールすると、User OAuth Token を入手できます。
コードを書く
エラー処理やログの記録などは省略しています。必要に応じて追加しましょう。
import os
import time
from slack_sdk import WebClient
# トークンは環境変数に入れておくものとする
client = WebClient(token=os.environ.get("SLACK_USER_OAUTH_TOKEN"))
# チャンネル ID も実行時に与える方がいいかもしれない
channel_id = "C1234567890"
# 30日よりも古いものを削除する場合
late_ts = str(int(time.time()) - 60 * 60 * 24 * 30)
# 指定したタイムスタンプより古いものだけを取得する
result = client.conversations_history(channel=channel_id, latest=late_ts)
conversation_history = result['messages']
for x in conversation_history:
client.chat_delete(channel=channel_id, ts=x['ts'])
print("{} deleted".format(x['ts']))
エラー処理を省いたとはいえ、非常に短いコードで済みます。
追記: ファイルの削除
files.list と files.delete を使えば、ほぼ同じ方法で一定の日付より前のファイルを削除することが可能です。タイムスタンプの与えかたが少しだけ違います。