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


Разработка на языке Python 3 (для web-приложений используем Django Framework) Rocket Chat Server - бесплатный корпоративный мессенджер Мое портфолио, сертификаты и разработки
api gita gita-dev.ru message rocket rocketchat rocket chat rocket.chat ubuntu web
 
 

* В этом блоге я описываю свою повседневную рабочую практику, поэтому все статьи в блоге написаны лично мной и при копировании их на свой сайт пожалуйста указывайте ссылку на страницу откуда вы скопировали.
* Если какая-то статья вам помогла, то вы можете дать мне немного денег вместо простого спасибо (ссылка на форму поддержки проекта внизу страницы), если вы что-то не поняли или у вас что-то не получается, то вы можете нанять меня и я вам все подробно расскажу (расценки и ссылки в конце статьи).


(последние правки 4 дня, 13 часов)

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

Для работы с 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,
        },
    },
}

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

Моя официальная страница на FaceBook
Мой микроблог в твиттер

RocketChat - Установка и настройка из репозитария (не docker)

RocketChat - Установка и настройка из репозитария (не docker)

Рано или поздно вам все равно придет в голову мысль о внутреннем корпоративном мессенджере полностью вам подконтрольном и настраиваемом. Я перепробовал много различных мессенджеров и в конце концов пришел к мнению, что Rocket.Chat подходит на эту роль лучше других. В типовом решении описанном на сайте Rocket.Chat вам просто предложат использовать подготовленный Docker-контейнер, но я честно говоря недолюбливаю докеры и мне ближе полностью подконтрольные мне контейнеры LXD.


Тестирование GIT-версии Rocket.Chat (Обновление Rocket.Chat)

Тестирование GIT-версии Rocket.Chat (Обновление Rocket.Chat)

Я активно использую в своей работе Rocket.Chat и честно говоря меня все устраивает, но недавно мне преподнесли небольшой сюрприз объявив мобильную версию для Android устаревшей фактически принудительно ее обновив, точнее они навязчиво рекомендовали обновиться при каждом запуске приложения и однажды я все же случайно нажал на обновление и в общем зря я это сделал ...


Настройка Nginx-Front для работы с Rocket.Chat

Настройка Nginx-Front для работы с Rocket.Chat

В прошлой статье я рассказывал, что у меня после очередного обновления сломался клиент Rocket.Chat для Android и я думал, что это связано с устаревшей версией серверной части, но как оказалось на самом деле это было связано с некорректной конфигурацией Nginx.


Использование Rocket.Chat для создания чата оперативных оповещений

Использование Rocket.Chat для создания чата оперативных оповещений

В предыдущей статье, под названием использование Rocket.Chat для создания чата оперативных оповещений я рассматривал простейший пример того как можно отправить сообщение в приватный чат Rocket.Chat. На самом деле в своих проектах я использую несколько модифицированную версию этого решения, более адаптированную к продакшн-решениям. Сегодня я как раз и хотел бы поговорить о том как я модифицировал рассмотренное ранее API для реализации так называемого оперативного чата.


Настройка отправки оповещений Zabbix в чат Rocket.Chat

Настройка отправки оповещений Zabbix в чат Rocket.Chat

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


Как вы наверное понимаете, бесплатно сейчас работать никто не будет и если ответ на ваш вопрос потребует больше трех минут времени и вам требуется полноценная консультация, то расценки на мои услуги представленны ниже.


Есть вопросы?
Спрашивайте и я обязательно вам отвечу!

* Поля обязательные для заполнения .