Для работы с Rocket.Chat API можно использовать модуль rocket-python и официальный гит-хаб этого проекта расположен по адресу https://github.com/dstegelman/rocket-python.
Обратите внимание, что в модуле реализовано не все Rocket.Char API, а лишь его небольшая часть, но для моих задач этого вполне достаточно (и еще проект ищет автора кому его можно передать). Итак, давайте ознакомимся с модулем.
Установка модуля rocket-python
Установка выполняется командой:
# pip install rocket-python
Выше приведена команда для второй версии Python, а для Python3 в дистрибутиве Ubuntu Linux используется команда:
# pip3 install rocket-python
Инициализация модуля
Перед началом выполнения API-вызовов необходимо инициализировать экземпляр API-подключения которое и будет использоваться (и от имени этого пользователя будут отправляться сообщения). Этого пользователя естественно потребуется создать и назначить ему группу доступа bot. Для создания пользователя перейдите в раздел "Администрирование -> пользователи" и нажмите значок + в верхнем правом углу (все это производится в web-интерфейсе управления Rocket.Chat).
Не забудьте назначить пользователю только группу доступа bot, дополнительно выберите галочку "подтвержден" и снимите галочку требуется смена пароля.
Наш бот создан и мы можем использовать следующую конструкцию для инициализации соединения:
from rocketchat.api import RocketChatAPI api = RocketChatAPI(settings={'username': 'rocket-bot', 'password': 'SuperPassword', 'domain': 'https://chat.gita-dev.ru'})
Отправка сообщений в приватные чаты
После инициализации соединения мы можем использовать API-вызовы, выбор API-вызовов поддерживаемых модулем небольшой, но как я уже сказал их вполне достаточно для реализации разного рода оповещений на любой вкус и цвет. Я использую Pytnon-модуль Rocket.Chat прежде всего для оперативного реагирования на комментарии и запросы с формы обратной связи и для этого используется вызов вида:
api.send_message('message', 'room_id')
Рассмотрим использование подробнее, для того чтобы вы могли легко использовать такие оповещения в своих проектах. Во первых, создайте приватный чат и добавьте в него созданного выше бота и других пользователей которые будут этот чат просматривать.
И обязательно настройте оповещения для приватного чата, так как по умолчанию вы получаете оповещения только о сообщениях где вы отмечены. Измените режим оповещения, на сообщения о всех новых сообщениях в чате.
Теперь инфраструктура подготовлена и казалось бы можно уже отправлять сообщение, но вы наверное обратили внимание, что для отправки сообщений используется не имя чата, а его идентификатор и это логично ведь чат можно переименовать, а его ID-будет всегда одним и нам надо лишь определить его идентификатор.
Для этого служит другой API-вызов:
api.get_private_rooms()
Private_rooms, это естественно приватные чаты, а public - публичные.
api.get_public_rooms()
В результате выполнения этого вызова вы получаете массив пар значений вида имя чата - его идентификатор:
[{'name': 'GITA-DEV-errors', 'id': 'pLMGBWRKue8op72'}, {'name': 'GITA-DEV-messages', 'id': 'AfoertgENbJFohc8pA'}, {'name': 'SYS-reports', 'id': 'gertyuFM725rit3w'}]
Именно этот идентификатор и используется для отправки сообщений:
api.send_message('Тестовое сообщение', 'pLMGBWRKue8op72')
Разного прода HTML-тэги не поддерживается, перенос строки осуществляется классическим \n, а ссылки обрабатываются автоматически.
Логирование Django-сбоев в Rocket.Chat
Обычно в проде я использую следующую конструкцию:
# Настройка логирования LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': '/var/log/gita-dev-debug.log', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'WARNING', 'propagate': True, }, }, }
При таком подходе мы оставляем штатный функционал оповещений о сбоях в работе на электронную почту и дополнительно ведем лог в файле /var/log/gita-dev-debug.log, но мне этого показалось мало и я решил задействовать дополнительно оповещения о сбоях в приватный чат Rocket.Chat.
Для этого нам потребуется написать свой обработчик событий:
from django.conf import settings from rocketchat.api import RocketChatAPI from logging import Handler import json from datetime import datetime def RocketSendMessage (message, to=settings.PORTAL_MESSAGE_ROOM_ID): api = RocketChatAPI(settings={'username': settings.ROCKET_USER, 'password': settings.ROCKET_PASSWORD, 'domain': 'https://chat.gita-dev.ru'}) print (api.get_private_rooms()) api.send_message(message, to) return True class RocketHandler(Handler,object): def __init__(self): super(RocketHandler, self).__init__() def parse_record_to_json(self, record): created = datetime.fromtimestamp(record.created) return { 'timestamp': created.strftime('%m/%d/%Y %H:%M:%S'), 'method': record.funcName, 'level': record.levelname, 'line': record.lineno, 'module': record.module, 'message': record.getMessage(), 'path': record.pathname, } def emit(self,record): RocketSendMessage (str(self.parse_record_to_json(record)), to=settings.PORTAL_ERROR_ROOM_ID)
И перписать логер, так чтобы задействовать дополнительные оповещения в Rocket.Chat
# Настройка логирования LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': '/var/log/gita-dev-debug.log', }, 'rocketchat': { 'level': 'DEBUG', 'class': 'personal_cabinet.rocket_chat.RocketHandler', }, }, 'loggers': { 'django': { 'handlers': ['file','rocketchat'], 'level': 'WARNING', 'propagate': True, }, }, }
Вот теперь это похоже на настоящий продакшн.