Мой блог - Отправка оповещений Django-приложения в приватный чат Rocket.Chat

Отправка оповещений Django-приложения в приватный чат Rocket.Chat

Вчера я подумал, что если я все же вернулся к использованию Rocket.Chat и он меня уже не так бесит как предыдущие версии, то можно настроить систему оповещений о событиях на сайте и сбоях в работе Django-приложения в приватный чат Rocket.Chat. Для Python быстро нашелся вполне работоспособный модуль который идеально подошел для отправки сообщений в приватные чаты.

Фотография автора

Автор: Антон Черноусов
Опубликовано: 2 месяца, 1 неделя (последние правки: 0 минут назад) - 0 комментариев
Категории записи: Django, Python, RocketChat, Системное администрирование


Для работы с Rocket.Chat API можно использовать модуль rocket-python и официальный гит-хаб этого проекта расположен по адресу https://github.com/dstegelman/rocket-python.

Python-модуль для интеграции с Rocket.Chat API

Обратите внимание, что в модуле реализовано не все Rocket.Char API, а лишь его небольшая часть, но для моих задач этого вполне достаточно (и еще проект ищет автора кому его можно передать). Итак, давайте ознакомимся с модулем.

Установка модуля rocket-python

Установка выполняется командой:

# pip install rocket-python

Выше приведена команда для второй версии Python, а для Python3 в дистрибутиве Ubuntu Linux используется команда:

# pip3 install rocket-python

Инициализация модуля

Перед началом выполнения API-вызовов необходимо инициализировать экземпляр API-подключения которое и будет использоваться (и от имени этого пользователя будут отправляться сообщения). Этого пользователя естественно потребуется создать и назначить ему группу доступа bot. Для создания пользователя перейдите в раздел "Администрирование -> пользователи" и нажмите значок + в верхнем правом углу (все это производится в web-интерфейсе управления Rocket.Chat).

Создание пользователя Rocket.Chat

Не забудьте назначить пользователю только группу доступа bot, дополнительно выберите галочку "подтвержден" и снимите галочку требуется смена пароля.

Назначение прав доступа для бота Rocket.Chat

Наш бот создан и мы можем использовать следующую конструкцию для инициализации соединения:

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')

Рассмотрим использование подробнее, для того чтобы вы могли легко использовать такие оповещения в своих проектах. Во первых, создайте приватный чат и добавьте в него созданного выше бота и других пользователей которые будут этот чат просматривать.

Создание приватного чата в Rocket.Chat

И обязательно настройте оповещения для приватного чата, так как по умолчанию вы получаете оповещения только о сообщениях где вы отмечены. Измените режим оповещения, на сообщения о всех новых сообщениях в чате.

Смена режима оповещений в приватном чате Rocket.Chat

Теперь инфраструктура подготовлена и казалось бы можно уже отправлять сообщение, но вы наверное обратили внимание, что для отправки сообщений используется не имя чата, а его идентификатор и это логично ведь чат можно переименовать, а его 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,
        },
    },
}

Вот теперь это похоже на настоящий продакшн.

Пожалуйста, оцените мою статью (всего оценок 0, средняя оценка 4.00):

Комментарии к статье:

Пока комментариев нет

Оставьте комментарий:

обязательно

обязательно (не публикуется)

необязательно

обязательно

обязательно