ぴよ丸水産

週末ファゴッティストによる技術ブログ

【RocketChat】【Python】チャンネル内のメッセージ数に上限を設ける

はじめに

RocketChatのチャンネルに、
長文メッセージがたくさんたまると、
ブラウザが悲鳴をあげて応答しなくなります。

RocketChatのUIでの設定方法が見当たらなかったので、
REST APIを使って、
指定したメッセージ数の上限超えたら
古いメッセージ削除するpythonスクリプト書きました!

事前準備

RocketChatのUIから、api-user作りました。
まぁ、自分のアカウント使ってもよかったんだけど。

  • userIdとauthTokenの取得

curlRocket.Chat Documentation - Loginを叩いて、
api-userのuserIdとauthTokenを調べます。
スクリプト内で変数に定義する用です。

  • roomIdの取得

curlRocket.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コーディングの面でも、
いい勉強になりました。

参考