Pythonを使ったSlack APIで特定のチャンネルの特定のユーザーの一定期間経過しているメッセージを削除する方法


前提

Slack APIの登録方法及び、Slack APIの使用方法の説明は省略しています。
まだ、お済みでない方は下記URLより登録してください。
https://api.slack.com/

参考文献

目的

Slack APIで、特定のチャンネルの、特定のユーザーの、投稿されてから3日以上経過しているメッセージを削除する。

使用する言語

Python3.8.5

手順

①Slack APIで、特定のチャンネルのメッセージを取得し、その中のメッセージのタイムスタンプを取得する。
②メッセージのタイムスタンプの中から、Slack APIで、3日以上経過しているメッセージを削除する。

使用するSlack API

・特定のチャンネルのメッセージのタイムスタンプを取得するのは、conversations.history
https://api.slack.com/methods/conversations.history
・メッセージを削除するのは、chat.delete
https://api.slack.com/methods/chat.delete

ソースコード

# 必要なライブラリのインポート
import requests
from datetime import datetime
import re

# チャンネルを指定してメッセージを取得する
# Web APIのURL
url = "https://slack.com/api/conversations.history"
# ワークスペースのトークン
token = "ワークスペースのトークン"
# 対象のチャンネルのID
channel = "対象のチャンネルのID"

# 各メッセージのタイムスタンプの格納用のリスト
timestamplist = []

# 情報を辞書型にする
payload = {"token": token,  "channel": channel}
# チャンネル情報の取得
response = requests.get(url, params=payload)
# json形式に変換
message_json = response.json()

# メッセージのタイムスタンプをリストに格納していく
for m in message_json["messages"]:
    try:
        # user一覧のリストを作成(重複あり)
        timestamplist.append(m["ts"])
    # tsキーがない場合、KeyErrorとなるので例外処理
    except KeyError:
        pass
print(timestamplist)

# 今日の日付のタイムスタンプを取得
current_ts = int(datetime.now().strftime('%s'))
# チャンネルの特定のユーザーのメッセージを削除
for ts in timestamplist:
    # Web APIのURL
    url = "https://slack.com/api/chat.delete"
    # ワークスペースのトークン
    token = "ワークスペースのトークン"
    # 対象のチャンネルのID
    channel = "対象のチャンネルのID"
    # 3日前
    term = 60 * 60 * 24 * 3
    # タイムスタンプ
    ts = ts
    # ユーザーの指定
    as_user = "ユーザーのID"
    # 現在からタイムスタンプが3日以上経過している場合、メッセージを削除
    if current_ts - int(re.sub(r'\.\d+$', '', ts)) > term:
        payload = {"token": token,  "channel": channel,
                   "ts": ts, "as_user": as_user}
        response = requests.post(url, params=payload)
        json = response.json()

補足

as_user

上記のソースコードでは、変数as_userに特定のユーザーのIDを渡すことで、
対象期間内の特定のユーザーのメッセージを削除するようにしています。
ユーザーを指定しない場合は、対象期間内の全ユーザーのメッセージが削除されます。

変数term

Pythonでは、「秒 * 分 * 時間 * 日」とすることで、時間間隔を表すことができます。
例えば、1週間では、「60 * 60 * 24 * 7」と、12時間30分40秒では、「40 * 30 * 12」となります。
この数値を変えることで、削除の対象となるメッセージの範囲を変えることができます。

reモジュール

Pythonで正規表現の処理を行うための標準ライブラリ。
正規表現パターンによる文字列の抽出や置換、分割などができる。

subメソッド

マッチした部分を他の文字列に置換することができる。
使い方は以下の通り。
sub(r'置換したい文字列', '置換後の文字列', 対象のオブジェクト名)
今回のre.sub(r'\.\d+$', '', ts)の場合、
「tsにおいて、ドット以降末尾まで半角数字がある場合、空に変換(削除すると同義)する。」という意味になる。

参考文献

・Pythonドキュメント
https://docs.python.org/ja/3/library/re.html
・Pythonの正規表現モジュールreの使い方(match、search、subなど)
https://note.nkmk.me/python-re-match-search-findall-etc/

参考文献