RocketChatで長期間メッセージを保管せず運用したいケースがあります。チャットメッセージが溜りまくってメールと同じような状態は避けたいしチャット結論をwikiにまとめるよう促す意味もあります。
REST
/api/v1/channels.messages
を使用します。
ゴッそり持って来るには便利です。
出力はdataframe
RocketChat投稿用ヘルパー関数を別途作っていますのでDataFrameで返すようにしています。
ちょっとだけ注意
RocketChatでのAPI取得件数はデフォルトで上限設定があります。この緩和を行うかoffsetでループするかといった対応が必要となります。
import requests
import pandas as pd
import datetime
import dateutil.parser
from pprint import pprint
# API パラメータたち
HEADERS ={
'X-Auth-Token': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'X-User-Id': 'xxxxxxxxxxtZDz',
'Content-Type': 'application/json',
}
params = (
('roomId', 'GENERAL'),
)
# メッセージ保管期間
LIMIT = 1
# ヘルパー関数定義
'''ISO -> datetime型 '''
def ISOtimeToDatetime(target):
JST = datetime.timezone(datetime.timedelta(hours=+9), 'JST')
return dateutil.parser.parse(target).astimezone(JST)
def judgeRocketChatMessage(target_date, limit):
'''保存期間判定 '''
today = datetime.date.today()
diff_date = datetime.timedelta(limit)
__DEBUG__ = False
if __DEBUG__:
print(target_date.date())
print(today)
print(diff_date)
print(today - target_date.date())
return (today - target_date.date() > diff_date)
# リクエスト実行
## TODO try〜except処理
response = requests.get('http://xxx.xxx.xxx.xxx:3000/api/v1/channels.messages',
headers=HEADERS,
params=params)
# 結果確認
pprint(response)
pprint(len(response.json()['messages']))
# 削除対象判定結果をDataFrameで返す
_list = []
for _ in response.json()['messages']:
# TODO _['_updatedAt']と今時刻との比較を
# このタイミングで行い削除対象を確定する方が効率が良い
_list.append([_['rid'],
_['_id'],
ISOtimeToDatetime(_['_updatedAt']),
judgeRocketChatMessage(ISOtimeToDatetime(_['_updatedAt']), LIMIT),
_['msg']])
# DataFrame化
df = pd.DataFrame(_list)
df.columns = ['チャンネル','MSG_ID','更新時間','削除対象','MSG']
結果はこちらから
df.head(5)
df.query('削除対象 == True').head(5)