Slack APIとpythonを用いて一定期間より前のSlackのメッセージを削除するスクリプトの例を示す。 参考URLではlegacy Tokenを使用しているが、現在は使用できないので、OAuth Tokenを使用する必要があります。OAuth Tokenを利用するようにコードを修正しました。 また、chat.deleteメソッドとchannels.historyメソッドを使用しているが、channels.historyは使用できないので、conversations.historyメソッドを使用する必要がある。
参考にしたURL
from datetime import datetime #日付を扱うため
from time import sleep # 処理を一旦停止するため
import json # json形式のデータを扱うため
import re #正規表現の操作を行うため
import sys # システムに関する処理を行うため
import urllib.parse #URLを解析して構成要素を得るため
import urllib.request #URLを開くため
DELETE_URL = "https://slack.com/api/chat.delete" #メッセージを削除するためのSlackのAPIのURL
HISTORY_URL = "https://slack.com/api/conversations.history" #メッセージの履歴を得るためのSlackのAPIのURL
API_TOKEN = '*********************************' #メッセージに対する操作をする際に必要となるAPI_TOKEN※legacy Tokenは使用できないことに注意。各自で変更
TERM = 60 * 60 * 24 * 7 #1週間なので7を指定。ここの数字を変更することで、削除対象のメッセージの期間を変更できる
def clean_old_message(channel_id): #メッセージを削除するための関数
print('Start cleaning message at channel "{}".'.format(channel_id)) # どのチャンネルのメッセージを削除するのか表示する
current_ts = int(datetime.now().strftime('%s')) #現在の時刻を取得
messages = get_message_history(channel_id) #channel_idで指定したchannelのメッセージを取得する
for message in messages: #このfor文である期間以上より前のメッセージを自動的に削除する
if current_ts - int(re.sub(r'\.\d+$', '', message['ts'])) > TERM:
delete_message(channel_id, message['ts'])
sleep(1)
def get_message_history(channel_id): #メッセージの履歴を取得するための関数
params = {
'token': API_TOKEN, #使用するAPI_TOKENを指定する
'channel': channel_id, # メッセージ履歴を取得するchannelのidを指定する
'limit': 500 #メッセージを取得する件数の数を指定する
}
req_url = '{}?{}'.format(HISTORY_URL, urllib.parse.urlencode(params)) #HTTP requestを投げるためのURLを構成する
req = urllib.request.Request(req_url) #実際にそのURLにrequestを投げる
message_history = []
with urllib.request.urlopen(req) as res:
data = json.loads(res.read().decode("utf-8")) #utf-8でjsonのデータをデコードする
if 'messages' in data: # dataがレスポンスの文言に含まれているか確認する
message_history = data['messages']
return message_history
def delete_message(channel_id, message_ts): #メッセージを削除する関数
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
params = {
'token': API_TOKEN, #使用するAPI_TOKENを指定する
'channel': channel_id, # メッセージ履歴を削除するchannelのidを指定する
'ts': message_ts # 削除するメッセージのタイムスタンプを指定する
}
req_url = '{}?{}'.format(DELETE_URL, urllib.parse.urlencode(params)) #URLを構成する文字列を定義する
req = urllib.request.Request(req_url, headers=headers) # requestを投げる
with urllib.request.urlopen(req) as res:
data = json.loads(res.read().decode("utf-8"))
if 'ok' not in data or data['ok'] is not True:
print('Failed to delete message. ts: {}'.format(message_ts))
if __name__ == "__main__":
args = sys.argv
if len(args) < 2:
print("The first parameter for slack channel id is required.")
else:
clean_old_message(args[1])