【RocketChat】【Python】チャンネル内のメッセージ数に上限を設ける
はじめに
RocketChatのチャンネルに、
長文メッセージがたくさんたまると、
ブラウザが悲鳴をあげて応答しなくなります。
RocketChatのUIでの設定方法が見当たらなかったので、
REST APIを使って、
指定したメッセージ数の上限超えたら
古いメッセージ削除するpythonスクリプト書きました!
事前準備
- REST API用のユーザ作成
RocketChatのUIから、api-user作りました。
まぁ、自分のアカウント使ってもよかったんだけど。
- userIdとauthTokenの取得
curlでRocket.Chat Documentation - Loginを叩いて、
api-userのuserIdとauthTokenを調べます。
スクリプト内で変数に定義する用です。
- roomIdの取得
curlでRocket.Chat Documentation - Channel Listを叩いて、
対象のチャンネルのroomIdを調べます。
上に同じく、変数に定義する用です。
複数チャンネルあると、
ぶわぁぁって出てきたので、
grepして探すとよいです。
Pythonスクリプト
出来上がったスクリプトはこちら。
xxxxxxxxxxxxxxxxxに、
事前準備で用意したIDやらトークンを置き換えてください。
#!/usr/bin/env python # -*- coding: utf-8 -*- import requests import json # RocketChatのURL定義 url = 'http://<rocketchat>/api/v1/' # api-userで操作するためのID・トークンをヘッダーとして定義 userid = 'xxxxxxxxxxxxxxxxx' authtoken = 'xxxxxxxxxxxxxxxxx' headers = {'X-Auth-Token':authtoken, 'X-User-Id':userid, 'Content-type':'application/json'} # 対象のチャンネルのIDを定義 roomid = 'xxxxxxxxxxxxxxxxx' def main(): # redmine_qaチャンネルの最大メッセージ数定義 max_message = 10 # redmine_qaのメッセージ数取得 now_msgs = countNowMsg() print("now_msgs:"+ str(now_msgs)) # redmine_qaがmax_messageを超えていた場合、古いメッセージから削除 delete_messages = ( now_msgs-max_message ) print("delete_messages:"+ str(delete_messages)) if delete_messages > 0: for i in range(delete_messages): target_msg = getOldMsgId() payload = {'roomId':roomid, 'msgId':target_msg} response = requests.post( url + 'chat.delete', headers=headers, data=json.dumps(payload), params={'key':'value'} ) print(target_msg+":"+str(response.status_code)) print(str(delete_messages) + "messages is deleted") else: pass # メッセージ数を取得する関数 def countNowMsg(): response = requests.get( url + 'channels.history?roomId=' + roomid, headers=headers, params={'key':'value'} ) channel_history = response.json() msgs_cnt = len(channel_history["messages"]) return msgs_cnt # 一番古いメッセージのIDを取得する def getOldMsgId(): response = requests.get( url + 'channels.history?roomId=' + roomid + '&count=1000', headers=headers, params={'key':'value'} ) channels_history = response.json() messages = channels_history["messages"] oldmsg = messages[-1] oldmsgid = oldmsg["_id"] return oldmsgid if __name__=='__main__': main()
これをcronで定期実行するようにしました。
まとめ
UIで実現できない!困った!ってなっても、
REST APIでなんとかなるもんですね。
pythonコーディングの面でも、
いい勉強になりました。