Получение, обработка и отправка сообщений из очереди RabbitMQ в канал Teams

17.02.22

Интеграция - Внешние источники данных

Статья о том, как можно получать сообщения из очередей RabbitMQ, обрабатывать эти сообщения и отправлять их в каналы Teams

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Получение, обработка и отправка сообщений из очереди RabbitMQ в канал Teams:
.zip 1,02Kb
4 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Работая в большом проекте, с огромным числом пользователей, для поддержки критически важно получать оповещения о проблемах как можно быстрее. Не все системы мониторинга могут предоставить инструменты для мониторинга сложных бизнес процессов из коробки. Многое специфическое приходится писать самостоятельно. Для того, что бы быть уверенным, что в случае проблемы заинтересованные сотрудники получат сообщения, приняли решение использовать RabbitMQ. В очереди помещаем сообщения, которые являются результатом работы самописных скриптов, которые по сложной логике генерят сообщения в случае отклонения каких-либо показателей бизнес процессов от нормы. 

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

  1. Получает сообщения из очереди RMQ.
  2. Обрабатывает полученное сообщение и отправляет сообщения в канал в Teams.

 

Получение сообщений из очереди:

Для начала требуется настроить входящий веб перехватчик в канале Teams:

1. Зайдем в настройки канала Teams

 

 

2. Добавим "Входящий веб-перехватчик"

 

 

Добавляем имя соединителя, получаем ссылку и сохраняем ее. Ссылку на соединитель нужно будет указать в файле config.py

Если Входящий веб-перехватчик  уже добавлялся, то ссылку на него можно найти в "УПРАВЛЕНИЕ" - "Настроено"

 

Заполним значения переменных в конфигурационном файлике.

Файл config.py выглядит так:

# rmq
rmq_server = 'имя сервера rabbitmq'
rmq_port = порт
rmq_queue_name = 'имя очереди'
rmq_user_name = 'имя пользователя'
rmq_user_password = 'пароль пользователя'
# teams
teams_channel = 'url адрес настроенного соединителя в канале Teams'
# service
service_name = 'Имя службы'
service_display_name = 'Видимое имя службы'

 

Для получения сообщения из нужной очереди требуется выполнить следующий код

# Импортируем нужные модули
import pika
import pymsteams
import time
# Импортируем файл конфигурации
import config
 
 
# Задаем имя пользователя и пароль для Connection
credentials = pika.PlainCredentials(config.rmq_user_name, config.rmq_user_password)
# Создаем Connection с RMQ
connection = pika.BlockingConnection(pika.ConnectionParameters(host=config.rmq_server, port=config.rmq_port, credentials=credentials))
# Создаем оболочку channel для взаимодействия с RabbitMQ, реализующую методы и поведение для канала AMQP
channel = connection.channel()
# Получаем method_frame, header_frame и body, нас будут интересовать наличие method_frame и содержимое body
method_frame, header_frame, body = channel.basic_get(config.rmq_queue_name)

 

Обработка и отправка сообщений:

Для отправки сообщения в Teams требуется выполнить следующий код

# Начинаем бесконечный цикл
while 1:
# Проверяем наличие method_frame
    if method_frame:
        # Разбираем бинарную строку в body и делаем из нее словарь. Здесь может быть все, что угодно, мое сообщение удобнее сделать словарем
        body = dict((a.strip(), b.strip()) for a, b in (element.split('":') for element in body.decode("utf-8").split(',"')))
        # Задаем адрес соединителя с каналом в Teams
        teams_channel = config.teams_channel
        # Подключаемся к каналу
        myTeamsMessage = pymsteams.connectorcard(hookurl=teams_channel, verify=False)
        # Редактируем текст: убираем лишние слэши и меняем символы юникода, у которых удвоились слэши. Здесь тоже может быть все, что угодно
        myTeamsMessage.text(str(body["message"]).replace('\\r', '\r').replace('\\n', '\n').replace('\\u0027', "'").replace('\\u003e', '>'))
        # Задаем цвет текста
        myTeamsMessage.color("#003333")
        # Задаем заголовок сообщения
        myTeamsMessage.title("¡alarm!")
        # Отправляем сообщение
        myTeamsMessage.send()
        # Сообщаем RMQ, что мы забрали сообщение, после этого сообщение из очереди удаляется
        channel.basic_ack(method_frame.delivery_tag)
        # Спим 10 секунд
        time.sleep(10)
    else:
        # Если method_frame нет спим 10 секунд
        time.sleep(10)

 

Создание службы Windows

Для того, что бы данный код выполнялся как служба Windows, требуется использовать библиотеки pywin32 и добавить код для объявления, запуска и остановки службы. Окончательно код должен выглядеть так

import pika
import pymsteams
import time
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import config
 
 
class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = config.service_name
    _svc_display_name_ = config.service_display_name
 
    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)
 
    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
 
    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()
 
    def main(self):
        # Здесь находится код из п.1 и п. 2 инструкции
        while 1:
            credentials = pika.PlainCredentials(config.rmq_user_name, config.rmq_user_password)
            connection = pika.BlockingConnection(pika.ConnectionParameters(
                host=config.rmq_server, port=config.rmq_port, credentials=credentials))
            channel = connection.channel()
            method_frame, header_frame, body = channel.basic_get(config.rmq_queue_name)
            if method_frame:
                body = dict((a.strip(), b.strip()) for a, b in (element.split('":') for element in body.decode("utf-8").split(',"')))
                teams_channel = config.teams_channel
                myTeamsMessage = pymsteams.connectorcard(hookurl=teams_channel, verify=False)
                myTeamsMessage.text(str(body["message"]).replace('\\r', '\r').replace('\\n', '\n').replace('\\u0027', "'").replace('\\u003e', '>'))
                myTeamsMessage.color("#003333")
                myTeamsMessage.title("¡alarm!")
                myTeamsMessage.send()
                channel.basic_ack(method_frame.delivery_tag)
                channel.basic_ack(method_frame.delivery_tag)
                connection.close()
                time.sleep(10)
            else:
                connection.close()
                time.sleep(10)
 
 
if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

 

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

<"путь к python.exe"> <"путь к python файлу со скриптом"> install

При запуске возможны проблемы, т.к. в папке, где находится "pythonservice.exe", по умолчанию это "C:\Program Files\Python<XX>\Lib\site-packages\win32" может не быть библиотек python<XX>.dll, pythoncom<XX>.dll и pywintypes<XX>.dll.

XX - версия Python(например python39.dll, pythoncom39.dll, pywintypes39.dll)

Эти файлы можно найти в папках:
python<XX>.dll  - C:\Program Files\Python<XX>

pythoncom<XX>.dll и pywintypes<XX>.dll - C:\Program Files\Python<XX>\Lib\site-packages\pywin32_system32

Достаточно просто скопировать эти файлы  в папку "C:\Program Files\Python<XX>\Lib\site-packages\win32"

Вступайте в нашу телеграмм-группу Инфостарт

Teams rmq rabbit python pywin32 pika pymsteams

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    30742    44    49    

46

Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

31720 руб.

27.03.2025    82756    56    42    

67

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

05.10.2022    13297    15    8    

16

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

122000 руб.

19.08.2020    29439    27    3    

28

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (Базовая, ПРОФ, КОРП, ФРЕШ (тонкий клиент)).

17080 руб.

19.12.2016    53726    122    107    

83

Внешние источники данных Программист Бизнес-аналитик 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Обработка для выгрузки данных из подготовленных СКД в фоновом режиме в базу ClickHouseDB, PostgreSQL, MySQL, в шину данных с поддержкой REST API (CSV, JSON. SQL), в локальные файлы (CSV, JSON, XLS, XLSX) или в Google Sheets. Это дополнительная подключаемая обработка.

18000 руб.

21.08.2024    8618    22    4    

19

Внешние источники данных Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Розница 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Платные (руб)

Быстро и легко. Выгрузка всех элементов и групп номенклатуры (с их иерархией), кроме помеченных на удаление. Без использования COM-объектов.

4880 руб.

16.08.2023    3845    7    8    

9
Для отправки сообщения требуется регистрация/авторизация