Оповещение Zabbix через Telegram

Процесс установки zabbix а так же дополнительных различных вспомогательных программ
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Оповещение Zabbix через Telegram

Сообщение Артём Мамзиков »

Уже есть не одна инструкция по установке оповещения заббикс в телеграмм, сделаю для заметки себе и свои изменения возможно пригодится кому-то еще.
3 Способа описано тут на serveradmin
Так как у меня версия zabbix 4.2 первый способ из коробки мне не подходит Администрирование -> Способы оповещений и выбирайте там Telegram Webhook. Его просто нет, есть он начиная с версии zabbix 5.

Создаем Телеграм Бота.
В контакты @BotFather и пишем ему сначала /start, потом /newbot.
Придумываем имя для бота и отправляем Например: @dst_bot
Сделано! Поздравляю с вашим новым ботом. Вы найдете его по адресу t.me/dst_bot .
Теперь вы можете добавить описание, раздел "О боте" и фотографию профиля для своего бота, список команд см. в разделе /справка.
Кстати, когда вы закончите создавать своего классного бота, свяжитесь с нашей службой поддержки ботов, если вам нужно лучшее имя пользователя для него.
Просто убедитесь, что бот полностью работоспособен, прежде чем вы это сделаете.
Используйте этот токен для доступа к HTTP API: 0000000000:AAH83NQPM4ejWj5IcrA6ICgwok9rmYfV-Gs
Имя бота и токен не настоящие выдуманные для примера.
Описание управления ботом
Показать
Храните свой токен в безопасности и храните его в безопасности, он может быть использован кем угодно для управления вашим ботом.
Описание API-интерфейса бота см. На этой странице: https://core.telegram.org/bots/api

Ботфатер, [08.12.2021 15:00]
Я могу помочь вам создавать телеграмм-ботов и управлять ими.
Если вы новичок в API ботов, пожалуйста, ознакомьтесь с руководством (https://core.telegram.org/bots).
Вы можете управлять мной, посылая эти команды:
/newbot - создайте нового бота
/mybots - отредактируйте своих ботов [бета-версия]

редактировать ботов
/setname - изменить имя бота
/setdescription - изменить описание бота
/setabouttext - изменить информацию о боте
/setuserpic - изменить фотографию профиля бота
/setcommands - изменить список команд
/deletebot - удалить бота

Настройки бота
/токен - сгенерировать токен авторизации
/отозвать - отозвать токен доступа бота
/setinline - переключить встроенный режим (https://core.telegram.org/bots/inline)
/setinlinegeo - переключение встроенных запросов на местоположение (https://core.telegram.org/bots/inline#l ... ed-results)
/setinlinefeedback - изменение встроенной обратной связи (https://core.telegram.org/bots/inline#c ... g-feedback) настройки
/setjoingroups - можно ли добавить вашего бота в группы?
/setprivacy - переключение режима конфиденциальности (https://core.telegram.org/bots#privacy-mode) в группах

Игры
/mygames - редактировать свои игры (https://core.telegram.org/bots/games ) [бета-версия]
/newgame - создать новую игру (https://core.telegram.org/bots/games)
/listgames - получить список ваших игр
/editgame - редактировать игру
/удалить игру - удалить существующую игру
Находим созданного бота и добавляем: @dst_bot к себе в личку, пишем /start и какой ни будь любой текст.

Начните чат с @myidbot Отправьте ему сообщение с командой /getid
Получаем id личного аккаунта. Чтобы его узнать, добавьте бота @my_id_bot и напишите ему /start

Проверяем работу бота
Слово bot и дальше token бота. Пишется все в одно слово.

Код: Выделить всё

curl --header 'Content-Type: application/json' --request 'POST' --data '{"chat_id":"ID-личного телеграм","text":"Проверяю отправку оповещений ботом"}' "https://api.telegram.org/bot0000000000:AAH83NQPM4ejWj5IcrA6ICgwok9rmYfV-Gs/sendMessage"
Должно придти личное сообщение от бота.

Предварительно создадим пользователей с правом только на чтение в самом zabbix и базе данных например read, они понадобятся чуть позже
Пример:
Пользователь на чтение веб интерфейса заббикс
Пользователь на чтение веб интерфейса заббикс
Пользователь на чтение веб интерфейса заббикс права на дашборды
Пользователь на чтение веб интерфейса заббикс права на дашборды
Для БД (кнопки будут удалить изменить и тд но работать не будут)
PhpMyAdmin пользователь права на чтение БД Zabbix
PhpMyAdmin пользователь права на чтение БД Zabbix
Так как у меня еще Debian9 x64 последняя версия python 3.5 а требовалась минимум 3.6 установка из исходного когда описана тут
Установка python source code на Debian

Переходим к первому скрипту от автора ableev Zabbix-in-Telegram
Получаем описание, различные контакты, Справку из 23 страниц, и сам скрипт для отправки уведомлений.

Предварительная подготовка если у вас еще не установлен python устанавливаем.
apt-get update
Ставим пакеты:
apt-get install python3-venv python3-pip python-virtualenv

В моем случае установка будет по следующему пути /usr/local/share/zabbix/alertscripts/ может быть /usr/lib/zabbix/alertscripts/ если вы не знаете смотрите в конфигурации заббикс сервера что у вас указано.

Переходим в папку
cd /usr/local/share/zabbix/alertscripts/
Загружаем
git clone https://github.com/ableev/Zabbix-in-Telegram
Переходим
cd /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram
можно удалить в ней папки .git , bash-old-version
Ставим модули:
(в моем случае я указываю pip3.9 install)
pip3 install -r requirements.txt
Либо если не ставится ставим вручную отдельно
pip3 install PySocks==1.6.8
pip3 install requests==2.20.0
pip3 install requests-oauthlib==0.6.2
pip3 install pyzabbix
pip3 install pysocks - если нужен прокси для подключения

Копируем файл с новым именем:
cp zbxtg_settings.example.py zbxtg_settings.py
Настраиваем конфигурацию
nano zbxtg_settings.py
Указываем следующее
Показать
путь /var/tmp/ изменен на /tmp/ zbx_tg_tmp_dir в настройка
True - включено
False - выключено
Проверка доступность должно быть код 200 для вашего zabbix
curl -sI http://localhost/zabbix/chart3.php | head -1
ответ должен быть 200 , но localhost - может быть недоступен нужен используем IP
Другие проверки

Код: Выделить всё

# -*- coding: utf-8 -*-

tg_key = "0000000000:AAH83NQPM4ejWj5IcrA6ICgwok9rmYfV-Gs"  # api-ключ telegram-бота

zbx_tg_prefix = "zbxtg"  # переменная для отделения текста от информации о скрипте
zbx_tg_tmp_dir = "/tmp/" + zbx_tg_prefix  # каталог для сохранения кэшей, идентификаторов, файлов cookie и т. Д.
zbx_tg_signature = False

zbx_tg_update_messages = True
zbx_tg_matches = {
    "problem": "PROBLEM: ",
    "ok": "OK: "
}

zbx_server = "http://192.168.175.111/zabbix/"  # полный url-адрес zabbix сервера
zbx_api_user = "read"
zbx_api_pass = "пароль"
zbx_api_verify = False  # True - не игнорировать самозаверяющие сертификаты, False - игнорировать

#zbx_server_version = 2  # для версии Zabbix 2.x
#zbx_server_version = 3  # для версии Zabbix 3.x, по умолчанию, еще не все обновились до 4.x
zbx_server_version = 4  # для версии Zabbix 4.x значение по умолчанию будет изменено в будущем с помощью этого

zbx_basic_auth = False
zbx_basic_auth_user = "[b]read[/b]"
zbx_basic_auth_pass = "[b]пароль[/b]"

proxy_to_zbx = None
proxy_to_tg = None

# proxy_to_zbx = "http://proxy.local:3128"
# proxy_to_tg = "https://proxy.local:3128"

# proxy_to_tg = "socks5://user1:password2@hostname:port" # socks5 с именем пользователя и паролем
# proxy_to_tg = "socks5://hostname:port" # socks5 без имени пользователя и пароля
# proxy_to_tg = "socks5h://hostname:port" # разрешение имени хоста на прокси-сервере SOCKS.
                                          # Это помогает, когда интернет-провайдер изменяет DNS-запросы.
                                          # Найдено здесь: https://stackoverflow.com/a/43266186/957508

google_maps_api_key = None  # возьми свой ключ для отправки местоположения устройств на карте, смотри https://developers.google.com/maps/documentation/geocoding/intro

zbx_tg_daemon_enabled = False
zbx_tg_daemon_enabled_ids = [6931850, ]
zbx_tg_daemon_enabled_users = ["ableev", ]
zbx_tg_daemon_enabled_chats = ["Zabbix in Telegram Script", ]

zbx_db_host = "localhost"
zbx_db_database = "zabbixdb"
zbx_db_user = "read"
zbx_db_password = "пароль"


emoji_map = {
    "Disaster": "🔥",
    "High": "🛑",
    "Average": "❗",
    "Warning": "⚠️",
    "Information": "ℹ️",
    "Not classified": "🔘",
    "OK": "✅",
    "PROBLEM": "❗",
    "info": "ℹ️",
    "WARNING": "⚠️",
    "DISASTER": "❌",
    "bomb": "💣",
    "fire": "🔥",
    "hankey": "💩",
}
В моем случае изменения в других файлах:
ZbxTgDaemon.py
Первая строка #!/usr/bin/env python3.9

zbxtg.py
Первая строка #!/usr/bin/env python3.9

Проверка от пользователя zabbix
su - zabbix -s /bin/bash

Проверка из командной строки:
По ИД:
/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/zbxtg.py "ID-Личный" "тест" "тестовое сообщение" --debug
По логину:
/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/zbxtg.py "@Логин-личный" "тест" "тестовое сообщение" --debug
Если получаем ошибку
User 'Логин-личный' needs to send some text bot in private Пользователю 'Логин-личный' необходимо отправить текстовое сообщение боту в частном порядке
Пишем боту любое сообщение и пробуем снова.

проверьте ваше подключение к телеграмме api:
curl https://api.telegram.org/bot${API_KEY}/getUpdates
curl https://api.telegram.org/bot0000000000: ... /getUpdate
если вы видите " User 'username' needs to send some text bot in private", это означает, что вы не отправляли сообщение своему боту

Отправить в чат:
zbxtg.py "Zabbix in Telegram" ololo ololo --group
Для записи ошибок в лог из заббикс zabbix_server.log добавить --debug
Выбрать ошибки из лога заббикс сервера: grep zbxtg.py zabbix_server.log

протестировать прокси-сервер:
curl -IL --socks5 host:port --proxy-user username:password https://api.telegram.org
установить pip install pysocks
проверить: pip freeze | grep -iE 'sock|req'

Проверка графика отправки:
./zbxtg.py "Логин-Личный" test "$(echo -e 'zbxtg;graphs: \nzbxtg;graphs_period=3600\nzbxtg;itemid:34939\nzbxtg;title:ololo')"
Проверка смайликов:
./zbxtg.py "Логин-Личный" "Test trigger with emoji" "Some {{info}} and {{ok}}. Omg, we have {{disaster}} in production. Looks like {{hankey}}, it's a {{problem}}. {{fire}} {{fire}} {{fire}}, {{bomb}}"

Получите chatid частного канала
Сохраните его вручную в uids.txt со случайным именем пользователя, например "123".
echo "name;private;-uidPrivateGroup" > uids.txt
Используйте "123" как телеграмму для любого пользовател
Скрипт не получит никакой информации о chat_id, если найдет chat_id в файле кеша

Как отправить сообщение в групповой чат
Пригласите своего бота в групповой чат
Упомяните своего бота: "/ start @ MyBot" в групповом чате, проверьте в командной строке.
Попробуйте пнуть его и пригласить еще раз, иногда платформа Telegram с этим не работает.

Переходим в zabbix: Администрирование > Способы оповещений > Создать способ оповещения
Имя: Telegram ableev персональных сообщений
Тип: Скрипт
Имя скрипта: Zabbix-in-Telegram/zbxtg.py
Параметры скрипта (входные аргументы в скрипт)
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
От версии zabbix 3.2
--group - для групповых оповещений использовать
--debug - Отладка (просмотр в логе заббикс сервера командой grep zbxtg.py zabbix_server.log)
--signature - Подпись бота для нескольких серверов zabbix
https://zabbix.localhost - Подпись бота для нескольких серверов zabbix
Подробнее о signature

Получаем
Telegram ableev персональных сообщений
Telegram ableev персональных сообщений
Имя: Telegram ableev для групповых сообщений
Тип: Скрипт
Имя скрипта: Zabbix-in-Telegram/zbxtg.py
Параметры скрипта (входные аргументы в скрипт)
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
От версии zabbix 3.2
--group - для групповых оповещений использовать
Telegram ableev для групповых сообщений
Telegram ableev для групповых сообщений
Способы оповещения созданы:
Telegram ableev Способы оповещения zabbix
Telegram ableev Способы оповещения zabbix
Сразу же можно протестировать сбоку нажимает Тест
Тестирование Telegram ableev персональных сообщений
Тестирование Telegram ableev персональных сообщений
Успешная отправка
Успешная отправка Тестирование Telegram ableev персональных сообщений
Успешная отправка Тестирование Telegram ableev персональных сообщений
Переходим в zabbix: Администрирование > Пользователи
Открываем текущего пользователя или создаем нового при необходимости и добавляем новый способ оповещения.
Выбираем Тип: наш созданный способ оповещения и указываем Отправлять на @Логин-Личный или группы, далее по вашему усмотрению.
Пример:
Zabbix Пользователь Добавление нового способа оповещения
Zabbix Пользователь Добавление нового способа оповещения
Переходим к последнему пункту создание действий
Настройка > Действия > Триггеры Создать Действие
Пишем имя: Telegram ableev
И добавляем условия например для теста
Важность триггеров равно Высокая
Активировано: V
Действия Отправка Telegram ableev
Действия Отправка Telegram ableev
Далее у нас идут 3 вкладки:
Операции
Операции восстановления
Операции обновления

Их нужно заполнить тем что мы хотим получать в сообщении какую информацию.
Действия Отправка Telegram ableev Операции
Действия Отправка Telegram ableev Операции
Тема по умолчанию: {{WARNING}} {HOST.NAME} - {TRIGGER.STATUS}: {TRIGGER.NAME}
Сообщение по умолчанию:
Последнее значение: {ITEM.VALUE1} ({TIME})
zbxtg;graphs
zbxtg;graphs_period=1800
zbxtg;graph_buttons
zbxtg;itemid:{ITEM.ID1}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
Важность триггера: {TRIGGER.SEVERITY}
Узел сети: {HOSTNAME} ({HOST.IP})
Описание:
{TRIGGER.DESCRIPTION}

Отправлять пользователям: выбираем пользователя
Отправлять только через: Telegram ableev персональных сообщений
Сообщение по умолчанию: V

Или сделаем чуть меньше
Тема: {{WARNING}} {HOST.NAME} ({HOST.IP}) - {TRIGGER.STATUS}:{TRIGGER.SEVERITY}: {TRIGGER.NAME}
Сообщение:
Последнее значение: {ITEM.VALUE1} ({TIME})
zbxtg;graphs
zbxtg;graphs_period=3600
zbxtg;graph_buttons
zbxtg;itemid:{ITEM.ID1},{ITEM.ID2}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
zbxtg;single_message
Описание:
{TRIGGER.DESCRIPTION}

Действия Отправка Telegram ableev Операции воосстановления
Действия Отправка Telegram ableev Операции воосстановления
Операции восстановления:
Тема по умолчанию: {{OK}} {HOST.NAME} - {TRIGGER.STATUS}: {TRIGGER.NAME}
Сообщение по умолчанию:
Server: {HOSTNAME} ({HOST.IP})
zbxtg;graphs_period:3600

Описание:
Проблема устранена!
Время устранения проблемы: {DATE} {TIME}

Отправить сообщение пользователям: выбираем пользователя

Или сделаем чуть меньше
Тема: {{OK}} {HOST.NAME} ({HOST.IP}) - {TRIGGER.STATUS}: {TRIGGER.NAME}
Сообщение:
zbxtg;graphs
zbxtg;graphs_period=3600
zbxtg;itemid:{ITEM.ID1},{ITEM.ID2}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
zbxtg;single_message
Проблема устранена: {DATE} {TIME}

Действия Отправка Telegram ableev Операции обновления
Действия Отправка Telegram ableev Операции обновления
Операции обновления
Тема по умолчанию: {{OK}} {HOST.NAME} - {TRIGGER.STATUS}: {TRIGGER.NAME}
Сообщение по умолчанию:
{USER.FULLNAME} подтвердил проблему {ACK.DATE} {ACK.TIME} со следующим сообщением:
{ACK.MESSAGE}Текущее состояние проблемы {EVENT.STATUS}

Отправить сообщение пользователям: выбираем пользователя при необходимости


Макросы Zabbix

Действия сообщения
{{WARNING}} {HOST.NAME} - {TRIGGER.STATUS}: {TRIGGER.NAME}

Последнее значение: {ITEM.VALUE1} ({TIME})
zbxtg;graphs - график
zbxtg;graphs_period=1800 - Периуд для просмотра графика
zbxtg;graphs_period:3600 - (1 час) графики восстановленных проблем с периодом устранения проблемы (по умолчанию - 3600 секунд)
zbxtg;graphs_width=700 -- задать ширину графиков (по умолчанию - 900 пикселей)
zbxtg;graphs_height=300 -- задать высоту графиков (по умолчанию - 300 пикселей)
zbxtg;graphs_age:{EVENT.AGE} - только для восстановления график на все время проблемы, "graphs_period" игнорируется
zbxtg;graph_buttons - получить графики с несколькими кнопками под ним (Интерактивный бот определит, какая кнопка была нажата, и отправит вам новый график с текущим идентификатором элемента.)
zbxtg;itemid:{ITEM.ID1} - идентификаторы элементов (из триггера) (без них вы не сможете получить данные истории)
zbxtg;itemid:{ITEM.ID1},{ITEM.ID2} - для нескольких элементов (использовать сложный триггер) (второй и следующий элементы должны быть в формуле)
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME} - подпись к графику
zbxtg;external_image:{ITEM.LASTVALUE2} - содержит действующий URL с изображением. изображение из другого источника вместо графика zabbix
zbxtg;location:{INVENTORY.LOCATION} - Адрес из местоположение узла работает с ключ API Google
zbxtg;lat:{INVENTORY.LOCATION.LAT} - Координаты, заполнить поля широты и долготы в узле
zbxtg;lon:{INVENTORY.LOCATION.LON} - Координаты, заполнить поля широты и долготы в узле
zbxtg;single_message график + текст одним сообщением (длина подписи ограничена 200 символами. 200 символов недостаточно для действия zabbix по умолчанию.)
zbxtg;debug - включает режим отладки, некоторые журналы и изображения будут сохранены в каталоге tmp (временное не влияет на версию python)
zbxtg;channel - позволяет отправлять на каналы
zbxtg;to:username1,username2,username3 - теперь вам не нужно создавать специальные профили и добавлять для них мультимедиа, используйте эту опцию в действии для отправки сообщений этим пользователям
zbxtg;to_group: Имя группы Один, Имя группы Два - то же самое, но для групп
Важность триггера: {TRIGGER.SEVERITY}
Узел сети: {HOSTNAME} ({HOST.IP})
Описание:
{TRIGGER.DESCRIPTION}
Для того чтобы передать виде смайлика, ставим двойные фигурные скобки
для темы сообщения {{{TRIGGER.SEVERITY}}}
{{OK}} Пример {{OK}} OK: {TRIGGER.NAME} on {HOSTNAME}
смайлики zbxtg_settings.py блок emoji_map =


Подтвердить событие с помощью скрипта
{{{TRIGGER.SEVERITY}}}{TRIGGER.NAME} on {HOSTNAME}

Last value: {ITEM.LASTVALUE1} ({TIME})
Started: {EVENT.TIME} {EVENT.DATE}
You can [acknowledge](http://192.168.175.111/zabbix/zabbix.ph ... ={EVENT.ID}) this event
zbxtg;markdown
zbxtg;graphs
zbxtg;graphs_period=10800
zbxtg;itemid:{ITEM.ID1}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}

В своем действии вы можете:использовать разметку + или HTML-форматирование .


Интерективное управление

включите zbx_tg_daemon_enabled = True в zbxtg_settings.py (если выключено ошибка You should enable daemon by adding 'zbx_tg_remote_control' in the configuration file)
добавьте свой user_id или никнейм (чтобы другие пользователи не могли получить никакой информации).
zbx_tg_daemon_enabled_ids = [XXXXXX, ]
zbx_tg_daemon_enabled_users = ["ableev", ]
zbx_tg_daemon_enabled_chats = ["Zabbix in Telegram Script", ]

Запустить бота в бесконечном цикле:
cd /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram
while true; do python3.9 ZbxTgDaemon.py; sleep 1; done
while - цикл выполняется пока условие истинно,
while [ условие ]
do
команда1
done
eсли вы закроете командную строку, скрипт умрет. Используйте скрипт в screen или tmux
SCREEN
Пример
screen -d -m script.sh - Это запустит отделённый (независящий) от терминала процесс. Можно отделить любую команду или процесс с помощью программы screen.
screen (свернуть ctrl a d)
screen -d -m -A -S ZbxTgDaemon `while true; do python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py; sleep 1; done`

Ctrl C - вернутся в командную строку. (процесс должен остатся запущенным)

Будет 3 процесса и 4 screen
ps -ux|grep -Ei "ZbxTgDaemon" - Команда запроса процессов
root 4340 0.0 0.2 107636 25448 pts/0 T 10:48 0:00 python3.9 ZbxTgDaemon.py
root 27149 0.0 0.0 29120 2704 ? Ss 16:05 0:00 SCREEN -d -m -A -S ZbxTgDaemon while true; do python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py; sleep 1; done
root 28287 2.3 0.2 108176 26616 pts/0 S 16:06 0:35 python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py

Ошибку ZbxTgDaemon.py for i, v in tmp_ts.iteritems(): AttributeError: 'dict' object has no attribute 'iteritems
Исправить в python3, используйте .items() вместо .iteritems()
Строка 117 print (md5sum)

Написать боту:
/triggers - показывает активные проблемы
/triggers host=www1 trigger=Nginx - фильтрует активные триггеры по хосту и триггеру

Ошибки:
Bad Request: can't parse entities in message text: Can't find end of the entity starting at byte offset - есть ошибки в форматировании
Пример жирный текст, вы устанавливаете *символы вокруг слова. Но если вы забыли закрыть это форматирование, Telegram не смог бы его проанализировать и отправить сообщение
Скрипт удаляет ваш "проблемный" символ (телеграмма вычисляет позицию) и пытается отправить сообщение еще раз.
Если вы видите такую ошибку в своих журналах, попробуйте исправить исходный текст действия.

Оригинальное переведеное Readme 15.12.2021
README
Показать

Код: Выделить всё

# Zabbix-in-Telegram
Уведомления Zabbix с графиками в Telegram

Присоединяйтесь к нам в нашей **группе Telegram** по этой ссылке: https://t.me/ZbxTg

Подписывайтесь на наш канал: https://t.me/Zabbix_in_Telegram

Оцените по [share.zabbix.com](https://share.zabbix.com): https://share.zabbix.com/cat-notifications/zabbix-in-telegram

### Особенности
- [x] Графики, основанные на последних данных, отправляются непосредственно в ваш мессенджер
- [x] Вы можете отправлять сообщения как в личных, так и в групповых/супергрупповых чатах
- [x] Поддержка каналов (только общедоступных, но вы можете сделать это и для частных, а также с помощью грязного взлома)
- [x] Сохраняет идентификатор чата как временный файл
- [x] Поддерживаются простая уценка и HTML
- [x] Эмодзи (вы можете использовать эмодзи вместо серьезности, см. [the wiki article](https://github.com/ableev/Zabbix-in-Telegram/wiki/Trigger-severity-as-Emoji)) (zabbix пока не поддерживает кодировку utf8mb4)
- [x] Карта местоположения

### Задачи
- Простое управление zabbix с помощью команд бота – в состоянии разработки
- Возможность отправки сложного графика или части экрана


### Настройка/Установка

**ЧИТАЙТЕ ВИКИ, ЕСЛИ У ВАС С ЧЕМ-ТО ПРОБЛЕМЫ**: https://github.com/ableev/Zabbix-in-Telegram/wiki

**Прежде всего**: Вам необходимо установить соответствующие модули для python, это необходимо для работы! </br>
                  Для этого введите `pip install -r requirements.txt` в вашей командной строке!

 * Положить`zbxtg.py `в вашем каталоге "alertscriptspath` путь задан внутри вашего "zabbix_server.conf`
 * Положить`zbxtg_group.py `в том же месте, если вы хотите отправлять сообщения в групповой чат (если вы используете версию Zabbix 2.x)
 * Создать`zbxtg_settings.py ` (скопируйте его из`zbxtg_settings.example.py `) с вашими настройками и сохраните их в том же каталоге, что и сценарий, см. Пример макета
  * Создайте бота в Telegram и получите ключ API: https://core.telegram.org/bots#creating-a-new-bot
  * Создайте пользователя только для чтения в веб-интерфейсе Zabbix (для получения графиков из zabbix)
  * Установите прокси-хост: порт в`zbxtg_settings.py `если вам нужен интернет-прокси (также поддерживается socks5, вики поможет вам)
 * Добавьте новые носители для Telegram в веб-интерфейс Zabbix с этими настройками:
 
<img src="https://i.imgur.com/Ytrbe4S.png" width="400px">

 * Добавьте еще один, если вы хотите отправлять сообщения в группу
 
<img src="http://i.imgur.com/OTq4aQd.png" width="400px">

 * **Обратите внимание, что Zabbix 3.0 имеет другие настройки для этого шага, смотрите его там**: https://github.com/ableev/Zabbix-in-Telegram/wiki/Working-with-Zabbix-3.0
 * Отправьте сообщение своему боту через Telegram, например "/start"
  * Если вы находитесь в групповом чате, начните разговор со своим ботом: `/start@ZbxTgDevBot`
 * Создайте новое действие, подобное этому:
```
Last value: {ITEM.LASTVALUE1} ({TIME})
zbxtg;graphs
zbxtg;graphs_period=10800
zbxtg;itemid:{ITEM.ID1}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
```

<img src="https://i.imgur.com/ZNKtBUX.png" width="400px">

 * Добавьте соответствующий тип носителя для вашего пользователя
  * Имя пользователя **ЧУВСТВИТЕЛЬНО К РЕГИСТРУ**
  * Если у вас нет имени пользователя, вы можете использовать свой идентификатор чата напрямую (и вам нужно погуглить, как его получить)
  * В групповых чатах нет URL-адресов, поэтому вам нужно указать имя группы в типе носителя
  * Сообщения для каналов следует отправлять как для частных чатов (просто сначала добавьте оба на свой канал и используйте имя пользователя канала, как если бы это был реальный пользователь)

  * Частный:

  <img src="https://i.imgur.com/GVDlTU5.png" width="400px">

  * Группа:

  <img src="https://i.imgur.com/TgcCqDf.png" width="400px">

#### Annotations
```
zbxtg;graphs -- включает прикрепленные графики
zbxtg;graphs_period=10800 -- установите период графиков (по умолчанию - 3600 секунд)
zbxtg;graphs_width=700 -- установите ширину графиков (по умолчанию - 900 пикселей)
zbxtg;graphs_height=300 -- установите высоту графиков (по умолчанию - 300 пикселей)
zbxtg;itemid:{ITEM.ID1} -- определите идентификатор элемента (из триггера) для присоединения
zbxtg;itemid:{ITEM.ID1},{ITEM.ID2},{ITEM.ID3} -- то же самое, но если вы хотите отправить два или более графика, используйте сложный триггер
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME} -- название графиков
zbxtg;debug -- включает режим отладки, некоторые журналы и изображения будут сохранены в каталоге tmp (временный не влияет на версию python)
zbxtg;channel -- позволяет отправлять по каналам
zbxtg;to:username1,username2,username3 -- теперь вам не нужно создавать выделенные профили и добавлять для них носители, используйте эту опцию в действии, чтобы отправлять сообщения этим пользователям
zbxtg;to_group:Group Name One,Group Name Two -- то же самое, но для групп
```

Вы можете использовать форматирование markdown или html в своем действии: https://core.telegram.org/bots/api#markdown-style + https://core.telegram.org/bots/api#html-style. 

#### Debug Отладка

* Вы можете использовать следующую команду для отправки сообщения из командной строки: </br>
`./zbxtg.py "@username" "первая часть сообщения" "вторая часть сообщения" --debug`
 * Вместо "@имя пользователя" замените свое имя пользователя в телеграмме **, А НЕ ваше имя** (с учетом регистра) ИЛИ идентификатор чата
 * Для `первой части сообщения" и "второй части сообщения" просто замените что-то вроде "тест" "тест" (для телеграммы это не имеет значения между темой и телом)
 * Вы можете пропустить "", если это одно слово для каждого параметра, они необязательны

---

![](http://i.imgur.com/1T4aHuf.png)
![](http://i.imgur.com/5ZPyvoe.png)

### Известные проблемы

#### MEDIA_CAPTION_TOO_LONG ЗАГОЛОВОК В СМИ СЛИШКОМ ДЛИННЫЙ
Если вы видите эту ошибку, это означает, что вы увеличили лимит заголовка на 200 символов (ограничение Telegram API).
Такие подписи будут автоматически сокращены до 200 символов.

#### Zabbix 3.0 and higher (3.2, 3.4, 4.0, 4.2, 4.4)
https://github.com/ableev/Zabbix-in-Telegram/wiki/Working-with-Zabbix-3.0
Скачать от 15.12.2021
Zabbix-in-Telegram.zip
Zabbix-in-Telegram.zip
(20.05 КБ) 40 скачиваний
Скачать от 31.03.2022 большая часть переведена на русский
Zabbix-in-Telegram-RU.zip
Zabbix-in-Telegram-RU.zip
(453.46 КБ) 35 скачиваний
Ошибки
Показать

Интерективное управление
включите zbx_tg_daemon_enabled = True в zbxtg_settings.py (если выключено ошибка You should enable daemon by adding 'zbx_tg_remote_control' in the configuration file)
добавьте свой user_id или никнейм (чтобы другие пользователи не могли получить никакой информации).
zbx_tg_daemon_enabled_ids = [XXXXXX, ]
zbx_tg_daemon_enabled_users = ["ableev", ]
zbx_tg_daemon_enabled_chats = ["Zabbix in Telegram Script", ]

Запустить бота в бесконечном цикле:
while true; do python3.9 ZbxTgDaemon.py; sleep 1; done
eсли вы закроете командную строку, скрипт умрет. Используйте скрипт в screen/`tmux.
SCREEN

ОШИБКИ
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(md5sum)?
File "/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py", line 117
print md5sum

я поправил так print (md5sum) ; еще установил pip3 install pyzabbix ; изменил 63 строку for i, v in tmp_ts.items(): связное с изменением python3.

Все стало запускаться но при запросе триггеров получаю: ZbxTgDaemon.py: Bad Request: message is too long
Хотя разбивка на сообщения есть.

-------------------------------------------------------------------------------------------------------------------------------------
Запрос для команды /triggers
В скрипте у нас есть такая строка запроса текущие триггеры на дашборте запрос
trigger.get(output="extend", monitored=True, filter={"value": 1}, sortfield="priority", sortorder="DESC",selectHosts="extend")

ВХОД API
curl --silent --show-error --insecure --header 'Content-Type: application/json-rpc' --data '{"jsonrpc": "2.0","method":"user.login","params":{"user": "Admin","password": "zabbix"},"id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php

ЗАПРОС ИЗ ZbxTgDaemon.py
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "trigger.get","params": {"output": "extend", "monitored": "True", "filter": {"value": 1}, "sortfield": "priority", "sortorder": "DESC", "selectHosts": "extend"},"auth":"301e8a26088db53ad46e0564819a38b4", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php

monitored - флаг Возврат только активированных триггеров, которые принадлежат узлам сети под наблюдением и содержат только активированные элементы данных.
"value": 1 (0 - (по умолчанию) ОК; 1 - проблема.)
sortfield": "priority" - Сортировка результата по заданным свойствам по важности
sortorder строка/массив DESC - по убыванию (ASC - по возрастанию)
selectHosts запрос Возврат узлов сети, которым принадлежит триггер, в свойстве hosts.

expandComment флаг Раскрытие макросов в описании к триггеру.
expandDescription флаг Раскрытие макросов в имени триггера.
expandExpression флаг Раскрытие функций и макросов в выражении триггера.
? флаг Раскрытие макросов в URL к триггеру

curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "trigger.get","params": {"output": "extend", "monitored": "True", "expandComment": "True", "expandDescription": "True", "expandExpression": "True", "filter": {"value": 1}, "sortfield": "priority", "sortorder": "DESC", "selectHosts": "extend"},"auth":"301e8a26088db53ad46e0564819a38b4", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php

С фильтром вывода без описания триггеров
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "trigger.get","params": {"output": ["triggerid","priority","status"], "monitored": "True", "expandComment": "True", "expandDescription": "True", "expandExpression": "True", "filter": {"value": 1}, "sortfield": "priority", "sortorder": "DESC", "selectHosts": "extend"},"auth":"301e8a26088db53ad46e0564819a38b4", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php

ВЫХОД API
curl --silent --show-error --insecure --header 'Content-Type: application/json-rpc' --data '{"jsonrpc": "2.0","method":"user.logout","params": [],"id": 1, "auth": "301e8a26088db53ad46e0564819a38b4"}' http://192.168.175.111/zabbix/api_jsonrpc.php

Просмотрим вывод через скрипт (в телеграмм будем отправлять Test, а выодить на экрн)
В скрипте нельзя отступать Tab отступаем пробелом, либо везде Tab иначе срипт будет ругаться!
Вначале выведем все активные триггеры на пенели

if triggers:
for t in triggers:
reply_text.append("Test")
print(triggers)
#print("Severity: {0}, Host: {1}, Trigger: {2}".format(t["priority"], t["hosts"][0]["host"].encode('utf-8'), t["description"].encode('utf-8')))

Запускаем скрипт while true; do python3.9 ZbxTgDaemon.py; sleep 1; done
Отправляем команду из телеграмма /triggers

В телеграмм прилетает Test столько раз сколько у нас триггеров на панели
В окне терминала получаем инфу об активных триггерах
Пример 2х триггеров сортировка по важности
Ответ в терминал
Показать
{'triggerid': '22114', 'expression': '{129237}<>2 or\r\n{129238}=1 or\r\n{129239}=0', 'description': 'UPSOutputStatus {HOST.NAME}({HOST.IP}){ITEM.LASTVALUE1}', 'url': '', 'status': '0', 'value': '1', 'priority': '4', 'lastchange': '1643888451', 'comments': 'состояние основного выхода ИБП\r\n1 ⇒ неизвестно (данные не поступают отключен)\r\n2 ⇒ на линии (нормальный рабочий режим)\r\n3 ⇒ на батарее\r\n4 ⇒ на Smart Boost (повышение напряжения)\r\n5 ⇒ спал по времени\r\n6 ⇒ обход программного обеспечения\r\n7 ⇒ выкл\r\n8 ⇒ перезагрузка\r\n9 ⇒ Обходной байпас\r\n10 ⇒ Обход аппаратного сбоя\r\n11 ⇒ спать до возвращения власти\r\n12 ⇒ on Smart Trim (понижение напряжения)\r\n13 ⇒ экологических Способов\r\n14 ⇒ горячих Резервов\r\n15 ⇒ на тесте батареи\r\n16 ⇒ чрезвычайных Статических Обходов\r\n17 ⇒ статических Резервов Обхода\r\n18 ⇒ режимов энергосбережения\r\n19 ⇒ Режим Режим Spot \r\n20 ⇒ e Преобразование\r\n21 ⇒ Режим Spot зарядного устройства\r\n22 ⇒ Режим Spot инвертора\r\n\r\n{ZBX-APC-UPS SNMPv1 2015-02-18:upsBasicOutputStatus.min(#3)}<>2 and {ZBX-APC-UPS SNMPv1 2015-02-18:upsBasicOutputStatus.min(#3)}<>12\r\n\r\nИли Нет данных более 10 минут\r\nНет сбора данных SNMP', 'error': '', 'templateid': '17635', 'type': '0', 'state': '0', 'flags': '0', 'recovery_mode': '0', 'recovery_expression': '', 'correlation_mode': '0', 'correlation_tag': '', 'manual_close': '1', 'details': '', 'hosts': [{'hostid': '10575', 'proxy_hostid': '0', 'host': 'APC22-Smart-UPS-2200', 'status': '0', 'disable_until': '0', 'error': '', 'available': '0', 'errors_from': '0', 'lastaccess': '0', 'ipmi_authtype': '-1', 'ipmi_privilege': '2', 'ipmi_username': '', 'ipmi_password': '', 'ipmi_disable_until': '0', 'ipmi_available': '0', 'snmp_disable_until': '0', 'snmp_available': '1', 'maintenanceid': '0', 'maintenance_status': '0', 'maintenance_type': '0', 'maintenance_from': '0', 'ipmi_errors_from': '0', 'snmp_errors_from': '0', 'ipmi_error': '', 'snmp_error': '', 'jmx_disable_until': '0', 'jmx_available': '0', 'jmx_errors_from': '0', 'jmx_error': '', 'name': 'UPS 22CHAGODA', 'flags': '0', 'templateid': '0', 'description': '', 'tls_connect': '1', 'tls_accept': '1', 'tls_issuer': '', 'tls_subject': '', 'tls_psk_identity': '', 'tls_psk': '', 'proxy_address': '', 'auto_compress': '1'}]},

{'triggerid': '75653', 'expression': '{132734}=0 or\r\n{132734}=1 or\r\n{132735}=1 and\r\n{132736}=1 or\r\n{132737}=1', 'description': 'Превышение квоты пользователя Zimbra login@DNS.ru {ITEM.VALUE}', 'url': '', 'status': '0', 'value': '1', 'priority': '4', 'lastchange': '1644545423', 'comments': 'Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})\r\n\r\nили нет данных 2 часа\r\n\r\nПроверка раз в 30 минут\r\n\r\nПервая строка выведет триггер в ошибку в любом случае при обнаружении\r\n{Zimbra-zabbix:emailquotauser["login@DNS.ru"].iregexp(\\@DNS)}=0 or', 'error': '', 'templateid': '0', 'type': '0', 'state': '0', 'flags': '4', 'recovery_mode': '0', 'recovery_expression': '', 'correlation_mode': '0', 'correlation_tag': '', 'manual_close': '1', 'details': '', 'hosts': [{'hostid': '10592', 'proxy_hostid': '0', 'host': 'DNS.ru', 'status': '0', 'disable_until': '0', 'error': '', 'available': '1', 'errors_from': '0', 'lastaccess': '0', 'ipmi_authtype': '-1', 'ipmi_privilege': '2', 'ipmi_username': '', 'ipmi_password': '', 'ipmi_disable_until': '0', 'ipmi_available': '0', 'snmp_disable_until': '0', 'snmp_available': '0', 'maintenanceid': '0', 'maintenance_status': '0', 'maintenance_type': '0', 'maintenance_from': '0', 'ipmi_errors_from': '0', 'snmp_errors_from': '0', 'ipmi_error': '', 'snmp_error': '', 'jmx_disable_until': '0', 'jmx_available': '0', 'jmx_errors_from': '0', 'jmx_error': '', 'name': 'Zimbra', 'flags': '0', 'templateid': '0', 'description': '', 'tls_connect': '1', 'tls_accept': '1', 'tls_issuer': '', 'tls_subject': '', 'tls_psk_identity': '', 'tls_psk': '', 'proxy_address': '', 'auto_compress': '1'}]},
Дальше пробуем с обработкой
format выбирает в строках значения priority приоритет это будет Severity: , далее hosts host имя узла будет Host: и description имя триггера будет Trigger: ,все остальное не берем если нужно добавляем нужные данные например описание триггеров comments
if triggers:
for t in triggers:
reply_text.append("Test")
#print(triggers)
print("Severity: {0}, Host: {1}, Trigger: {2}".format(t["priority"], t["hosts"][0]["host"].encode('utf-8'), t["description"].encode('utf-8')))

Получаем вывод пример тех же 2х триггеров
Severity: 4, Host: b'APC22-Smart-UPS-2200', Trigger: b'UPSOutputStatus {HOST.NAME}({HOST.IP}){ITEM.LASTVALUE1}'
Severity: 4, Host: b'DNS.ru', Trigger: b'\xd0\x9f\xd1\x80\xd0\xb5\xd0\xb2\xd1\x8b\xd1\x88\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xba\xd0\xb2\xd0\xbe\xd1\x82\xd1\x8b \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8f Zimbra login@DNS.ru {ITEM.VALUE}'

И весь Русский текст ломает кодирование в UTF-8 .encode('utf-8') ,убираем кодировку.

if triggers:
for t in triggers:
reply_text.append("Test")
#print(triggers)
print("Severity: {0}, Host: {1}, Trigger: {2}".format(t["priority"], t["hosts"][0]["host"], t["description"]))

И получаем нормальный читаемый Русский в ответе
Severity: 4, Host: APC22-Smart-UPS-2200, Trigger: UPSOutputStatus {HOST.NAME}({HOST.IP}){ITEM.LASTVALUE1}
Severity: 4, Host: DNS.ru, Trigger: Превышение квоты пользователя Zimbra login@DNS.ru

Пример кодировок python3.9
>>> b'Connection: \xd0\x92\xd1\x8b\xd1\x81\xd0\xbe\xd0\xba\xd0\xb0\xd1\x8f \xd1\x87\xd0\xb0\xd1\x81\xd1\x82\xd0\xbe\xd1\x82\xd0\xb0 \xd0\xbe\xd1\x88\xd0\xb8\xd0\xb1\xd0\xbe\xd0\xba'.decode("utf-8", "replace")
'Connection: Высокая частота ошибок'
>>> 'текст'.encode('utf-8')
b'\xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82'
>>> 'test'.encode('utf-8')
b'test'

Далее ответ должен преобразоватся через zbxtg.py

Пример вывод в файл
f = open('/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/test.txt',"w")
c = reply_text
f.write(c)
Скрипт с важностью и смайликами и разбивкой сообщений
ZbxTgDaemon.py

Код: Выделить всё

#!/usr/bin/env python3.9
# coding: utf-8

import sys
import os
import hashlib
import re
import time
from os.path import dirname
import zbxtg_settings
import zbxtg
from pyzabbix import ZabbixAPI, ZabbixAPIException

# Текущий путь где лежит скрипт
dir_path = os.path.dirname(os.path.realpath(__file__))
dir_script = ("{0}/ZbxTgDaemon.py".format(dir_path))

# Важность триггеров из priority
emoji_map = {
    "5": "Чрезвычайная❌🔥",
    "4": "Высокая🛑",
    "3": "Средняя❗",
    "2": "Предупреждение⚠️",
    "1": "Информацияℹ️",
    "0": "Не классифицировано🔘",
}


class zabbixApi():
    def __init__(self, server, user, password):
        self.api = ZabbixAPI(server)
        self.user = user
        self.password = password

    def login(self):
        self.api.login(self.user, self.password)

    def triggers_active(self):
        return self.api.trigger.get(output="extend", monitored=True, expandComment=True, expandDescription=True, expandExpression=True, filter={"value": 1}, sortfield="priority", sortorder="DESC", selectHosts="extend")



def print_message(string):
    string = str(string) + "\n"
    filename = sys.argv[0].split("/")[-1]
    sys.stderr.write(filename + ": " + string)


def file_write(filename, text):
    with open(filename, "w") as fd:
        fd.write(str(text))
    return True


def file_read(filename):
    with open(filename, 'r') as fd:
        text = fd.readlines()
    return text


def main():
    TelegramAPI = zbxtg.TelegramAPI
    ZabbixWeb = zbxtg.ZabbixWeb
    tmp_dir = zbxtg_settings.zbx_tg_tmp_dir

    if not zbxtg_settings.zbx_tg_daemon_enabled:
        print("Вы должны включить демона, добавив 'zbx_tg_remote_control' в файл конфигурации")
        sys.exit(1)

    tmp_uids = tmp_dir + "/uids.txt"
    tmp_ts = {
        "message_id": tmp_dir + "/daemon_message_id.txt",
        "update_offset": tmp_dir + "/update_offset.txt",
    }

    for i, v in tmp_ts.items():
        if not os.path.exists(v):
            print_message("{0} не существует, создаю новый...".format(v))
            file_write(v, "0")
            print_message("{0} успешно создано".format(v))

    message_id_last = file_read(tmp_ts["message_id"])[0].strip()
    if message_id_last:
        message_id_last = int(message_id_last)

    update_id = file_read(tmp_ts["update_offset"])

    tg = TelegramAPI(key=zbxtg_settings.tg_key)
    if zbxtg_settings.proxy_to_tg:
        proxy_to_tg = zbxtg_settings.proxy_to_tg
        if not proxy_to_tg.find("http") and not proxy_to_tg.find("socks"):
            proxy_to_tg = "https://" + proxy_to_tg
        tg.proxies = {
            "https": "{0}".format(zbxtg_settings.proxy_to_tg),
        }
    zbx = ZabbixWeb(server=zbxtg_settings.zbx_server, username=zbxtg_settings.zbx_api_user,
                    password=zbxtg_settings.zbx_api_pass)
    if zbxtg_settings.proxy_to_zbx:
        zbx.proxies = {"http": "http://{0}/".format(zbxtg_settings.proxy_to_zbx)}

    try:
        zbx_api_verify = zbxtg_settings.zbx_api_verify
        zbx.verify = zbx_api_verify
    except:
        pass

    zbxapi = zabbixApi(zbxtg_settings.zbx_server, zbxtg_settings.zbx_api_user, zbxtg_settings.zbx_api_pass)
    zbxapi.login()

    print(tg.get_me())

    #hosts = zbxdb.db_query("SELECT hostid, host FROM hosts")

    commands = [
        '/triggers',
        '/help',
        # '/graph',
        # '/history',
        # '/screen'
    ]

    def md5(fname):
        hash_md5 = hashlib.md5()
	#алгоритм определения контрольной суммы
        with open(fname, 'rb') as f:
	    #последовательно берём блоки файла определенного размера
           # for chunk in iter(lambda: f.read(4095), b''):
            while chunk := f.read(4095):
		#накопительно калькулируем контрольную сумму файла
                hash_md5.update(chunk)
        return hash_md5.hexdigest()

    md5sum = md5(dir_script)
    print (md5sum)

    try:
        while True:
            time.sleep(1)
            md5sum_new = md5(dir_script)
            if md5sum != md5sum_new:
                sys.exit(1)
            tg.update_offset = update_id
            updates = tg.get_updates()
            if not updates["result"]:
                continue
            for m in updates["result"]:
                if "message" not in m:
                    continue
                update_id_last = m["update_id"]
                tg.update_offset = update_id_last
                if m["message"]["from"]["id"] not in zbxtg_settings.zbx_tg_daemon_enabled_ids:
                    file_write(tmp_ts["update_offset"], update_id_last)
                    continue
                    print('К черту это дерьмо, я не собираюсь отвечать кому-то, кто не из белого списка')
                else:
                    if not "text" in m["message"]:
                        continue
                    text = m["message"]["text"]
                    to = m["message"]["from"]["id"]
                    reply_text = list()
                    if m["message"]["message_id"] > message_id_last:
                        if re.search(r"^/(start|help)", text):
                            reply_text.append('Привет, это бот ZbxTgDaemon.')
                            reply_text.append('https://github.com/ableev/Zabbix-in-Telegram')
                            reply_text.append('Если вам нужна помощь, вы можете обратиться за ней в группу @ZbxTg')
                            reply_text.append('Доступные команды:')
                            reply_text.append(', '.join(commands))
                            tg.disable_web_page_preview = True
                        if re.search(r"^/triggers", text):
                            triggers = zbxapi.triggers_active()
                            if triggers:
                                tg_text_emoji = []
                                for t in triggers:
                                    #reply_text.append("tetst")
                                    tg_text = ("Важность:{0}, Узел сети: {1}, Триггер: {2}".format(t["priority"], t["hosts"][0]["host"], t["description"]))
                                    #print(tg_text)

                                    # Меняем значение на текст и смайлик
                                    l_new = tg_text
                                    for k, v in emoji_map.items():
                                        l_new = l_new.replace('Важность:'+k, 'Важность:'+v)
                                    tg_text = l_new
                                    #print(tg_text)
                                    reply_text.append(tg_text)
                            else:
                                reply_text.append('Никаких триггеров нет, хорошего дня!')
                        if not reply_text:
                            reply_text = "['Я не знаю, что с этим делать']"

                        # Экранируем ''' чтоб посчитать все символы в строке, иначе разбивает и считает строки ', '
                        reply = ("'''{0}'''".format(reply_text))
                        #print(reply)
                        # Если сообщение больше 4095 символов разобъем его
                        # range(старт, стоп, шаг) , len() возвращает количество элементов (длину) в объект
                        for x in range(0, len(reply), 2000):
                         # Срез отсчет от 0 первый x-начало второй х+2000 (последний символ не входит в вывод)
                         text=reply[x:x+2000]
                         #print(text)
                         #print(x)
                         # Больше не нужны тройные кавычки убираем вначале и конце строки а так же скобки
                         strok=text.strip("'[]")
                         # Добавим для каждого блока [ ] - тип данных списка
                         #reply_textw= "['"+strok+"']"
                         reply_textw=strok
                         # Делим на строки по параметру ', '
                         reply_text = reply_textw.rsplit("', '")

                         if tg.send_message(to, reply_text):
                            print(reply_text)
                            with open(tmp_ts["message_id"], "w") as message_id_file:
                               message_id_file.write(str(m["message"]["message_id"]))
                            message_id_last = m["message"]["message_id"]
                            tg.disable_web_page_preview = False
                file_write(tmp_ts["update_offset"], update_id_last)
    except KeyboardInterrupt:
        print("Выход...")


if __name__ == "__main__":
    main()

Попытка следить за запущеным скриптом через крон или заббикс при помощи скрипта
ZbxTgDaemon.sh

Код: Выделить всё

#!/bin/bash


function check(){
#Просмотр запущенных процессов выбор PID
#ps -ef|grep -E "SCREEN"|sed -e '/'grep'/d'|| awk '{print $2}'
#ps -ef|grep -E "SCREEN .*ZbxTgDaemon while .*ZbxTgDaemon.py"|sed -e '/'grep'/d'| awk '{print $2}'
# Главное чтоб был процесс
dirzbxtgdaemon=`ps -ef|grep -E "python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py"|sed -e '/'grep'/d'| awk '{print $2}'`
#ps -ef|grep -E "python3.9 ZbxTgDaemon.py"|sed -e '/'grep'/d'| awk '{print $2}'

# Запускаем блок проверки процесса
terms
}


function terms(){
# Количество процессов удалить пустую строку
numproc=$(echo "${dirzbxtgdaemon}"|grep -Ev "^$"|wc -l)

# Проверим что запущен всего 1 процесс если нет выполним
if [ "$numproc" -eq "1" ]; then exit 1; else

# Если количество процессов больше 1 , завершаем все лишние
if [ "$numproc" -gt "1" ]; then
# Скроем 1 процесс, и Завершим все лишние процессы
for prockill in $(echo "${dirzbxtgdaemon}"|awk NR\>1); do
#kill "${prockill}"
#kill -15 "${prockill}"
kill -9 "${prockill}"
#kill -9 "${prockill}"
#kill -TERM "${prockill}"
#kill -KILL "${prockill}"
done
# Повторная проверка
check
fi

# Процессов 0 запускаем процесс
if [ "$numproc" -lt "1" ]; then
# Существует ли файл лога
if [ -e /tmp/zbxtg/daemon_message_id.txt ]; then
echo "OK  /tmp/zbxtg/daemon_message_id.txt"
else
mkdir /tmp/zbxtg &&echo "1" >> /tmp/zbxtg/daemon_message_id.txt &&chmod 777 /tmp/zbxtg/daemon_message_id.txt
fi
# Запускаем сервис
systemctl stop zbxtg.service
sleep 3
systemctl start zbxtg.service
#/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py
# while - цикл выполняется пока условие истинно
#while true; do python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py; sleep 1; done
#screen -d -m -A -S ZbxTgDaemon `while true; do python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py; sleep 1; done`
# Повторная проверка
check
fi

fi
}

# Запускаем проверку
check
После я решил сделать Systemd
/etc/systemd/system/ — юниты, созданные системным администратором
zbxtg.service

Код: Выделить всё

# Скрипт для ответа в телеграмм zabbix
# /etc/systemd/system/ — юниты, созданные системным администратором

[Unit]
# Описание юнита
Description=Zabbix-Telegram
# Запускаем после запуска следующих сервисов
After=multi-user.target rescue.service rescue.target
After=apache2.service
After=mysql.service
After=mariadb.service
After=zabbix-server.service
After=zabbix-agent.service
# Для запуска сервиса необходим запущенный сервис
#Requires=mysql.service
Requires=multi-user.target
# Для запуска сервиса желателен запущенный сервиc
#Wants=

#Conflicts=rescue.service rescue.target
#AllowIsolate=yes

[Service]
# По умолчанию: systemd предполагает, что служба будет запущена незамедлительно.
# Процесс при этом не должен разветвляться. Не используйте этот тип, если другие службы зависят от очередности при запуске данной службы.
Type=simple

# systemd предполагает, что служба запускается однократно и процесс разветвляется с завершением родительского процесса. Данный тип используется для запуска классических демонов.
#Type=forking

# Запустить один раз, когда остальное будет запущенно
#Type=idle

#Type=oneshot

# Чтобы systemd могла отслеживать основной процесс:
PIDFile=/tmp/zbxtg.pid

# Рабочий каталог, он делается текущим перед запуском стартап команд (эмулирует команду "cd /путь")
WorkingDirectory=/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram

# Пользователь и группа, под которым надо стартовать сервис
User=root
Group=root

#umask - инвертированный chmod (chmod 777 укажите umask 000, chmod 700 umask 077)
#UMask=077

# Переменные окружения:
Environment=PATH=/usr/bin:/usr/local/bin
#Environment=NODE_ENV=production
#Environment=RACK_ENV=production

# Запрет на убийство сервиса вследствие нехватки памяти и срабатывания механизма OOM -1000 полный запрет
OOMScoreAdjust=-100

# Команды на старт/стоп и релоад сервиса
ExecStart=/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py
#ExecStop=
#ExecReload=

#Таймаут в секундах, сколько ждать system отработки старт/стоп команд.
TimeoutSec=40

# Попросим systemd автоматически рестартовать наш сервис, если он вдруг перестанет работать.
# Контроль ведется по наличию процесса из PID файла
Restart=always
# указываем, что бинарь нужно запустить снова, если он умрет
#Restart=on-failure
# указываем, что перед повторным запуском нужно подождать 10 секунд.
#RestartSec=10s

[Install]
# Уровень запуска
# multi-user.target или runlevel3.target соответствует нашему привычному runlevel=3 
WantedBy=multi-user.target
#WantedBy=default.target
#WantedBy=installer.target
Перечитаем сервисы
systemctl daemon-reload
Пробуем запустить
systemctl start zbxtg.service
service zbxtg start
Просмотреть статус
systemctl status zbxtg.service
service zbxtg status

добавляем ее в автозагрузку
systemctl enable zbxtg.service

Количество запущенных процессов Для Ответа в Zabbix-in-Telegram
Количество запущенных процессов Для Ответа в Zabbix-in-Telegram
Триггер Процесс ZbxTgDaemon
Триггер Процесс ZbxTgDaemon
Триггер Процесс ZbxTgDaemon
Триггер Процесс ZbxTgDaemon
Дейтсивия Операции ZbxTgDaemon - Для ответа в телеграмм на запросы
Дейтсивия Операции ZbxTgDaemon - Для ответа в телеграмм на запросы
количество слов: 4051
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Оповещение Zabbix через Telegram

Сообщение Артём Мамзиков »

Рассмотрим еще один скрипт.

Оповещение Zabbix через Telegram способ от xxsokolov Zabbix-Notification-Telegram

Оф. Zabbix-Notification-Telegram
Инструкция
Общая инструкция

Для версии python3 (3.5.3-1) была следующая ошибка
Ошибка
Показать
получаю ошибку
Traceback (most recent call last):
File "/usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram/zbxTelegram.py", line 12, in <module>
import telebot
File "/usr/local/share/zabbix/alertscripts/venv/lib/python3.5/site-packages/telebot/__init__.py", line 575
e.args = e.args + (f'Typed middleware handler "{typed_middleware_handler.__qualname__}"',)
^
SyntaxError: invalid syntax
У меня будут использоваться немного другие пути
/usr/lib/zabbix/alertscripts/venv/bin/python: неверный интерпретатор: Нет такого файла или каталога
Правим в файле конфигурации пути nano zbxTelegram_config.py и zbxTelegram.py
на /usr/local/lib/python3.9/venv/bin/python
Так же другие пути в моем случае поправим на
/usr/local/share/zabbix/alertscripts/

Переходим в каталог:
cd /usr/local/share/zabbix/alertscripts/
Скачиваем:
git clone https://github.com/xxsokolov/Zabbix-Not ... legram.git

Обновим:
apt-get update
Ставим пакет:
apt-get install python3-venv python3-pip
Возможно потребуется пакет визуализации
Показать
apt-get install python-virtualenv (запуск virtualenv venv --python=python3 | source venv/bin/activate)

или еще пару команд
pip install virtualenv virtualenvwrapper
easy_install virtualenv virtualenvwrapper
питон 3, то он ставит pip3. Чтобы установить virtualenv и virtualenvwrapper используйте :
pip3 install virtualenv virtualenvwrapper
Создадим виртуальное окружение (будет создан каталок venv в текущей папке):
Создадим в той же папке что и сам питон, не вижу смысла ставить в папку с кучей файлов которую сканирует заббикс.
Переходим:
cd /usr/local/lib/python3.9/
Выполняем команду:
python3.9 -m venv venv
Активируем виртуальное окружение:
source venv/bin/activate
Переходим:
cd /usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram
тут у нас есть файл .requirements в котором прописаны библиотеки к установке
Можно обновится: pip3.9 install --upgrade pip
Установим библиотеки:
pip3.9 install -r .requirements
Либо если не ставится ставим вручную отдельно
pip3.9 install wheel
pip3.9 install pyTelegramBotAPI
pip3.9 install pillow
pip3.9 install pysocks
pip3.9 install xmltodict
pip3.9 install requests

Для удаления если что то не так ставится
pip3.9 uninstall wheel
pip3.9 uninstall pyTelegramBotAPI
pip3.9 uninstall pillow
pip3.9 uninstall pysocks
pip3.9 uninstall xmltodict

Деактивируем виртуальное окружение:
deactivate

В текущей папке /usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram можно удалить папку .git

Копируем файл с новым именем:
cp zbxTelegram_config.example.py zbxTelegram_config.py
Выдаем права:
chown -R zabbix:zabbix zbxTelegram.py zbxTelegram_config.py zbxTelegram_files/
Разрешим выполнять файл скрипта:
chmod +x zbxTelegram.py
Редактируем конфигурационный файл:
nano zbxTelegram_config.py

Первая строка в моем случае будет: #!/usr/local/lib/python3.9/venv/bin/python
Расположение:
config_cache_file = '/usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram/zbxTelegram_files/id.cache'
config_log_file = '/usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram/zbxTelegram_files/znt.log'
Токен API
tg_token = '0000000000:AAH83NQPM4ejWj5IcrA6ICgwok9rmYfV-Gs'

watermark_font = '/usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram/zbxTelegram_files/ArialMT.ttf'
Подключение
zabbix_api_url = 'http://192.168.175.111/zabbix/'
zabbix_api_login = 'read'
zabbix_api_pass = 'Пароль'

В файле zbxTelegram.py и argparser.py
Первая строка так же: #!/usr/local/lib/python3.9/venv/bin/python

После настройки тестируем проверяем отправку следующими командами:
Тестовая отправка из консоли
/usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram/zbxTelegram.py @Пользователь или группа test test
слова test менять нельзя. Именно они инициируют отправку тестового сообщения
От пользователя заббикс
su - zabbix -s /bin/bash или sudo su - zabbix
zabbix@ZABBIXSERVER:~$ /usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram/zbxTelegram.py @Пользователь или групп test test

Если сделано все верно, придет сообщение в телеграмм.

Переходим в Веб интерфейс Заббикса.
Администрирование > Способы оповещений > Создать способ оповещения
Имя: Telegram zbxTelegram.py
Тип: Скрипт
Имя скрипта: zbxTelegram.py
Параметры скрипта:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
Zabbix Способы оповещения Telegram Notification xxsokolov
Zabbix Способы оповещения Telegram Notification xxsokolov
Проверяем Данный способ Тестом
Zabbix Способы оповещения Telegram Notification xxsokolov Тест
Zabbix Способы оповещения Telegram Notification xxsokolov Тест
Настройка > Действия > Создать действие
На в кладке действие все стандартно задаете условия на которое будет выполнятся данное действие отправки сообщения
Например для теста:
Имя: Telegram Notification xxsokolov
Условия:
Важность триггеров равно Черезвычайная Аварийная
Важность триггеров равно Высокая
Активировано: V
Действие Zabbix Telegram Notification xxsokolov
Действие Zabbix Telegram Notification xxsokolov
Вкладка операции
Тема по умолчанию: {Problem} {TRIGGER.SEVERITY} {{TRIGGER.SEVERITY}}: {EVENT.NAME}

Вкладка Операции восстановления:
Тема по умолчанию: {Resolved} {TRIGGER.SEVERITY} {{TRIGGER.SEVERITY}} {EVENT.NAME}

Вкладка Операции обновления
Тема по умолчанию: {Update} {TRIGGER.SEVERITY} {{TRIGGER.SEVERITY}} {EVENT.NAME}

Где можно внести правки и изменения (для макросов/переменных)
Для {Problem} - мапинг значений Problem\Resolved\Update в emoji (config: zabbix_status_emoji_map)
Для {{TRIGGER.SEVERITY}} - мапинг значений Severity в emoji (config: zabbix_status_emoji_map)


Операции Сообщение по умолчанию
Сообщение по умолчанию: копируется xml конфиг полностью, который приведен в файле actions.example. Копируйте его 1 в 1. actions.example

Можно попробовать настроить параметры отправки
True - включено
False - выключено

<graphs>True</graphs> - Добавление изображения графика в сообщение.

<hostlinks>True</hostlinks> - Добавление линка (сылки) на "Узел сети" (host) в сообщение.

<graphlinks>True</graphlinks> - Добавление линка (ссылки url) на History график "Элемент данных" (item) в сообщение.

<acklinks>True</acklinks> - Обратные ссылки

<eventlinks>True</eventlinks> - Ссылки на события

<triggerlinks>True</triggerlinks> - Прикрепить ссылку url из триггера в сообщение.

<tag>True</tag> - Прикрепить все теги в сообщение

<tags></tags> - Передача списка тэгов из триггера {EVENT.TAGS}

<eventtag>True</eventtag> - Добавление тэгов события в сообщение.

<eventidtag>True</eventidtag> - Идентификатора события Добавление тэгa c eventid в сообщение.

<itemidtag>True</itemidtag> - Идентификатора элемента Добавление тэгa c itemid в сообщение.

<triggeridtag>True</triggeridtag> - Идентификатора триггера Добавление тэгa c triggerid в сообщение.

<actionidtag>True</actionidtag> - Идентификатора действия Добавление тэгa c actionid в сообщение.

<hostidtag>True</hostidtag> - Тег идентификатора хоста Добавление тэгa c hostid в сообщение.

<zntsettingstag>True</zntsettingstag> - Тег настроек znt

<zntmentions>True</zntmentions> - Упоминания znt

<keyboard>True</keyboard> - Клавиатура Добавление кнопок к сообщению.

<graphs_period>default</graphs_period> - Период за который присылается изображение графика в секундах. 10800

<host>{HOST.HOST}</host> - Макрос имени узла сети.

<itemid>{ITEM.ID1} {ITEM.ID2} {ITEM.ID3} {ITEM.ID4}</itemid> - Индификаторы Макросы ИД элементов данных.

<itemid></itemid> - Передача itemid {ITEM.ID1}

<triggerid>{TRIGGER.ID}</triggerid> - Макрос ИД триггера. {TRIGGER.ID}

<eventid>{EVENT.ID}</eventid> - Макрос ИД события. {EVENT.ID}

<actionid>{ACTION.ID}</actionid> - Макрос ИД действия. {ACTION.ID}

<hostid>{HOST.ID}</hostid> - Макрос ИД узла сети.

<title><![CDATA[{HOST.HOST} - {EVENT.NAME}]]></title> - Шаблон формирования заголовка изображения графика из макросов: имя узла сети и имя события. {HOST.HOST} - {EVENT.NAME}

<title></title> - Заголовок графика {HOST.HOST} - {EVENT.NAME}

<triggerurl><![CDATA[{TRIGGER.URL}]]></triggerurl> - Макрос URL триггера. {TRIGGER.URL}

<eventtags><![CDATA[{EVENT.TAGS}]]></eventtags> - Макрос тэгов события разделенных запятой. Макрос объединяет теги из узла сети, шаблона, триггера.

<![CDATA[]]>: В XML документах фрагмент, помещенный внутрь CDATA, — это часть содержания элемента, которая помечена для парсера как содержащая только символьные данные, а не разметку. CDATA — это просто альтернативный синтаксис для отображения символьных данных, нет никакой смысловой разницы между символьными данными, которые объявлены как CDATA и символьными данными, которые объявлены в обычном синтаксисе и где «<» и «>» будут представлены как «<» и «>», соответственно.

Оф. Поддерживаемые макросы
Действие Операции Zabbix Telegram Notification xxsokolov
Действие Операции Zabbix Telegram Notification xxsokolov
Операция

Код: Выделить всё

<?xml version="1.0" encoding="UTF-8" ?>
<root>
	<body>
		<messages>
<![CDATA[
Узел сети: {HOST.HOST} [{HOST.IP}]
Последнее значение: {ITEM.LASTVALUE1} ({TIME})
Продолжительность: {EVENT.AGE}]]>
		</messages>
	</body>
	<settings>
		<graphs>True</graphs>
		<hostlinks>True</hostlinks>
		<graphlinks>True</graphlinks>
		<acklinks>True</acklinks>
		<eventlinks>True</eventlinks>
		<triggerlinks>True</triggerlinks>
		<eventtag>True</eventtag>
		<eventidtag>True</eventidtag>
		<itemidtag>True</itemidtag>
		<triggeridtag>True</triggeridtag>
		<actionidtag>True</actionidtag>
		<hostidtag>True</hostidtag>
		<zntsettingstag>True</zntsettingstag>
		<zntmentions>True</zntmentions>
		<keyboard>True</keyboard>
		<graphs_period>default</graphs_period>
		<host>{HOST.HOST}</host>
		<itemid>{ITEM.ID1} {ITEM.ID2} {ITEM.ID3} {ITEM.ID4}</itemid>
		<triggerid>{TRIGGER.ID}</triggerid>
		<eventid>{EVENT.ID}</eventid>
		<actionid>{ACTION.ID}</actionid>
		<hostid>{HOST.ID}</hostid>
		<title><![CDATA[{HOST.HOST} - {EVENT.NAME}]]></title>
		<triggerurl><![CDATA[{TRIGGER.URL}]]></triggerurl>
		<eventtags><![CDATA[{EVENT.TAGS}]]></eventtags>
	</settings>
</root>
Восстановление

Код: Выделить всё

<?xml version="1.0" encoding="UTF-8" ?>
<root>
	<body>
		<messages>
<![CDATA[
Узел сети: {HOST.HOST} [{HOST.IP}]
Последнее значение: {ITEM.LASTVALUE1} ({TIME})
Продолжительность: {EVENT.AGE}
Проблема была решена {EVENT.RECOVERY.TIME} на {EVENT.RECOVERY.DATE}
Название проблемы: {EVENT.NAME}]]>
</messages>
	</body>
	<settings>
		<graphs>True</graphs>
		<hostlinks>True</hostlinks>
		<graphlinks>True</graphlinks>
		<acklinks>True</acklinks>
		<eventlinks>True</eventlinks>
		<triggerlinks>True</triggerlinks>
		<eventtag>True</eventtag>
		<eventidtag>True</eventidtag>
		<itemidtag>True</itemidtag>
		<triggeridtag>True</triggeridtag>
		<actionidtag>True</actionidtag>
		<hostidtag>True</hostidtag>
		<zntsettingstag>True</zntsettingstag>
		<zntmentions>True</zntmentions>
		<keyboard>True</keyboard>
		<graphs_period>default</graphs_period>
		<host>{HOST.HOST}</host>
		<itemid>{ITEM.ID1} {ITEM.ID2} {ITEM.ID3} {ITEM.ID4}</itemid>
		<triggerid>{TRIGGER.ID}</triggerid>
		<eventid>{EVENT.ID}</eventid>
		<actionid>{ACTION.ID}</actionid>
		<hostid>{HOST.ID}</hostid>
		<title><![CDATA[{HOST.HOST} - {EVENT.NAME}]]></title>
		<triggerurl><![CDATA[{TRIGGER.URL}]]></triggerurl>
		<eventtags><![CDATA[{EVENT.TAGS}]]></eventtags>
	</settings>
</root>
В самом простом рабочем варианте контент из файла actions.example копируется в настройку оповещения, поле Default message
Она состоит из основных секций:
<body>
<messages>
Текст сообщения
</messages>
</body>

<settings>
Настройки
</settings>

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

Минимальный
Операция

Код: Выделить всё

<?xml version="1.0" encoding="UTF-8" ?>
<root>
	<body>
		<messages>
<![CDATA[{HOST.HOST} [{HOST.IP}]
{ITEM.LASTVALUE1} ({TIME}),{EVENT.AGE}]]>
		</messages>
	</body>
	<settings>
		<graphs>False</graphs>
		<hostlinks>False</hostlinks>
		<graphlinks>False</graphlinks>
		<acklinks>False</acklinks>
		<eventlinks>False</eventlinks>
		<triggerlinks>False</triggerlinks>
		<eventtag>False</eventtag>
		<eventidtag>False</eventidtag>
		<itemidtag>False</itemidtag>
		<triggeridtag>False</triggeridtag>
		<actionidtag>False</actionidtag>
		<hostidtag>False</hostidtag>
		<zntsettingstag>False</zntsettingstag>
		<zntmentions>False</zntmentions>
		<keyboard>False</keyboard>
		<graphs_period>default</graphs_period>
		<host></host>
		<itemid>{ITEM.ID1}</itemid>
		<triggerid></triggerid>
		<eventid></eventid>
		<actionid></actionid>
		<hostid></hostid>
		<title></title>
		<triggerurl></triggerurl>
		<eventtags></eventtags>
	</settings>
</root>
Восстановление

Код: Выделить всё

<?xml version="1.0" encoding="UTF-8" ?>
<root>
	<body>
		<messages>
<![CDATA[
{HOST.HOST} [{HOST.IP}]
{ITEM.LASTVALUE1} ({TIME})
{EVENT.AGE}, {EVENT.RECOVERY.TIME} {EVENT.RECOVERY.DATE}]]>
</messages>
	</body>
	<settings>
		<graphs>False</graphs>
		<hostlinks>False</hostlinks>
		<graphlinks>False</graphlinks>
		<acklinks>False</acklinks>
		<eventlinks>False</eventlinks>
		<triggerlinks>False</triggerlinks>
		<eventtag>False</eventtag>
		<eventidtag>False</eventidtag>
		<itemidtag>False</itemidtag>
		<triggeridtag>False</triggeridtag>
		<actionidtag>False</actionidtag>
		<hostidtag>False</hostidtag>
		<zntsettingstag>False</zntsettingstag>
		<zntmentions>False</zntmentions>
		<keyboard>False</keyboard>
		<graphs_period>default</graphs_period>
		<host>{HOST.HOST}</host>
		<itemid>{ITEM.ID1}</itemid>
		<triggerid></triggerid>
		<eventid></eventid>
		<actionid></actionid>
		<hostid></hostid>
		<title></title>
		<triggerurl></triggerurl>
		<eventtags></eventtags>
	</settings>
</root>
Можно задать Теги в триггеры:
trigger_settings_tag Имя тэга для обработки значений параметров. 'ZNTSettings'
trigger_settings_tag_no_graph Значение тэга 'ZNTSettings' при котором изображение графика не будет добавлено в сообщение. 'no_graph'
trigger_settings_tag_no_alert Значение тэга 'ZNTSettings' при котором сообщение отправлено не будет.
В лог файл будет добавлено событие об отмене отправки сообщения. 'no_alert'
trigger_settings_tag_not_notify Значение тэга 'ZNTSettings' при котором сообщение будет отправляет беззвучно.
Пользователи iOS не получат уведомления, пользователи Android получат уведомление без звука. 'not_notify'
trigger_info_mentions_tag Тэг упоминания юзера 'ZNTMentions'
trigger_settings_tag_graph_normal 'graph_normal'
trigger_settings_tag_graph_stacked 'graph_stacked'
trigger_settings_tag_graph_pie 'graph_pie'
trigger_settings_tag_graph_exploded 'graph_exploded'
trigger_settings_tag_graph_period Значение тэга 'ZNTSettings' при котором будет задан период за какой присылать изображение графика. Указывается после разделителя = в секундах.
Приоритет: tag, xml, config* 'period='

Просмотреть Логи:
Ведется минимальный log
nano /usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram/zbxTelegram_files/znt.log
отправка, добавления в cash файл, изменение группы в суппергруппу, ошибки, дебаг.
При необходимости:
config_debug_mode = True включить более детальный log
config_exc_info = True включить полный Traceback ошибок

Оринигальный README от 15.12.2021
README
Показать

Код: Выделить всё

# <p align="center">Zabbix Notification Telegram
<p align="center">Нотификатор оповещений в Telegram для <a href="https://www.zabbix.com/features#notification target="_blank"" >Zabbix</a>.<br>
Легкая установка, гибкая настройка, информативные сообщения.
<p align="center"><a href="https://www.zabbix.com/integrations/telegram#tab:3rd_party" target="_blank">Popular на www.zabbix.com</a> и <a href="https://share.zabbix.com/zabbix-tools-and-utilities/cat-notifications/zabbix-notification-telegram">share.zabbix.com</a>
<br>
<img alt="AppVeyor" src="https://img.shields.io/github/last-commit/xxsokolov/Zabbix-Notification-Telegram">
<img alt="AppVeyor" src="https://img.shields.io/badge/python-3-blue">
<img alt="AppVeyor" src="https://img.shields.io/github/license/xxsokolov/Zabbix-Notification-Telegram">


* [Возможности](#возможности)
* [Планы](#планы)
* [С чего начать](#с-чего-начать)
   * [Установка из source](#установка-из-source-git-requires)
* [Создаем первое оповещение](#создаем-первое-оповещение)
  * [Получаем API token](#получаем-api-token)
* [Настраиваем нотификатор](#настраиваем-нотификатор)
  * [Конфигурационный файл](#конфигурационный-файл)
  * [XML разметка](#xml-разметка)
  * [Тэги ZNTSettings](#тэги-zntsettings)
* [Логирование](#логирование)
* [F.A.Q.](#faq)
* [Последние значимые изменения](#последние-значимые-изменения)
* [Помощь](#помощь)

## Возможности
- Графики, информативные заголовки, ссылки<a href="#note1" id="note1ref"><sup>1</sup></a>, тэги<a href="#note2" id="note2ref"><sup>2</sup></a> и упоминания объединены в **одно сообщение**.
- Формирование и обновление cash файла (privat, group, group -> supergroup)<a href="#note3" id="note3ref"><sup>3</sup></a>
- Гибкая настройка через конфигурационный файл, XML разметку в <a href="https://www.zabbix.com/documentation/current/manual/config/notifications/action" target="_blank">действиях триггеров</a> и Trigger Tags<a href="#note4" id="note4ref"><sup>4</sup></a>
- Маппинг Emoji статуса и важности события.
- Наложение watermark на изображение.
- Обьединение графиков в альбом.

## Планы
- Обработка быстрых команд ботом <img alt="AppVeyor" src="https://img.shields.io/static/v1?label=status&message=beta&color=yellow?logo=appveyor">
- Отправка метрик по запросу от бота <img alt="AppVeyor" src="https://img.shields.io/static/v1?label=status&message=beta&color=yellow?logo=appveyor">

## С чего начать
Для работы потребуется Python 3+ и Zabbix 3+.
#### Установка из source (git requires)*:
```
$ cd /usr/lib/zabbix/alertscripts
$ git clone https://github.com/xxsokolov/Zabbix-Notification-Telegram.git .
```
После этого нотификатор практически готов к работе, потребуется еще несколько шагов.

*Подробную инструкцию вы можете найти на wiki*: <a href="https://github.com/xxsokolov/Zabbix-Notification-Telegram/wiki/Установка-нотификатора-Zabbix-Notification-Telegram" target="_blank">RU</a>, ENG (vacant)

## Создаем первое оповещение
### Получаем API token
Получили <a href="https://core.telegram.org/bots#botfather" target="_blank">API token от @BotFather</a> который будем использовать в <a href="https://github.com/xxsokolov/Zabbix-Notification-Telegram/blob/master/zbxTelegram_config.example.py" target="_blank">zbxTelegram_config.py</a>: <a href="https://github.com/xxsokolov/Zabbix-Notification-Telegram/blob/master/zbxTelegram_config.example.py#L19" target="_blank">tg_token</a>.

*Если у Вас нет бота, я расскажу как это сделать:* <a href="https://github.com/xxsokolov/Zabbix-Notification-Telegram/wiki/Регистрация-нового-бота-в-Telegram" target="_blank">RU</a>, ENG (vacant)

## Настраиваем нотификатор
### Конфигурационный файл
Основная конфигурация нотификатора производится через файл [zbxTelegram_config.py](https://github.com/xxsokolov/Zabbix-Notification-Telegram/blob/master/zbxTelegram_config.example.py). 

Давайте разберем каждый параметр подробно:
|Имя|Аргумент(ы)|Описание|По умолчанию|
|---|-----------|--------|------------|
|config_debug_mode|bool|Логирование в режиме debug| False|
|config_exc_info|bool|Более детальный режим debug|False|
|config_cache_file|string|Абсолютный путь до cash файла|```/usr/lib/zabbix/alertscripts/zbxTelegram_files/id.cache```|
|config_log_file|string|Абсолютный путь до log файла|```/usr/lib/zabbix/alertscripts/zbxTelegram_files/znt.log```|
|tg_proxy|bool|Использовать прокси для отправки сообщений в Telegram|True|
|tg_proxy_server|dict|Ссылка до Вашего прокси|```{'https': 'socks5://username:password@domen:port'}```
|tg_token|string|Тот самый token, который Вы получали у <a href="https://core.telegram.org/bots#botfather" target="_blank">@BotFather</a>|```123123123123:ADDDD_er9beG-fGx33ktYqFkUpAdUtWe2s```|
|watermark|bool|Наносить ватермарку на изображение графика|True|
|watermark_label|string|Текст наносимый на изображение графика|'Dmitry Sokolov (https://github.com/xxsokolov)'|
|watermark_font|string|Путь до файла шрифта|```/usr/lib/zabbix/alertscripts/zbxTelegram_files/ArialMT.ttf```|
|watermark_minimal_height|string|Минимальный размер изображения графика для нанесения ватермарки|30|
|watermark_fill|string||255|
|watermark_rotate|string||0|
|watermark_expand|bool||True|
|watermark_text_color|string|Цвет текста в RGB|(60, 60, 60)|
|body_messages|string|Шаблон формирование тела сообщения.<br>*Сообщение состоит из: subject, body, links, tags, mentions|
|body_messages_cut_symbol|bool|Урезать тело сообщения|True|
|body_messages_max_symbol|string|Максимальное кол-во символов в теле сообщения|600|
|body_messages_title|string|Шаблон формирования заголовка изображения графика.  *```{title}``` формируется из секции xml```<title></title>``` и ```<graphs_period></graphs_period>```или ```graphs_period_default``` в конфиг файле*|```{title} ({period_hour}h)```|
|body_messages_url|bool|Добавление линков в сообщение|True|
|body_messages_url_notes = True|bool|Добавление линка из триггера в сообщение|True|
|body_messages_url_graphs = True|bool|Добавление линка на график "Элемент данных" (item) в сообщение|True|
|body_messages_url_host = True|bool|Добавление линка на "Узел сети" (host) в сообщение|True|
|body_messages_url_ack = True|bool|Добавление линка на <a href="https://www.zabbix.com/documentation/current/ru/manual/acknowledges" target="_blank">"Подтверждение проблем"</a> в сообщение|True|
|body_messages_url_event = True|bool|Добавление линка на <a href="https://www.zabbix.com/documentation/3.0/manual/web_interface/frontend_sections/monitoring/events" target="_blank">"Детали события"</a> в сообщение|True|
|body_messages_url_template|sting|Шаблон формирование линка|```<a href="{url}">{icon}</a>```|
|body_messages_url_delimiter|sting|Разделитель между линками|'&nbsp; '|
|body_messages_url_emoji_no_url|emoji|Иконка при отсутствии <a href="https://www.zabbix.com/documentation/current/ru/manual/config/triggers/trigger" target="_blank">URL</a> в триггере|➖|
|body_messages_url_emoji_notes|emoji|Иконка ссылки URL в триггере|ℹ️|
|body_messages_url_emoji_graphs|emoji|Иконка ссылки на график "Элемент данных" (item)|📊|
|body_messages_url_emoji_host|emoji|Иконка ссылки на "Узел сети" (host)|📟|
|body_messages_url_emoji_ack|emoji|Иконка ссылки на
|body_messages_url_emoji_event|emoji|Иконка ссылки на <a href="https://www.zabbix.com/documentation/3.0/manual/web_interface/frontend_sections/monitoring/events" target="_blank">"Детали события"</a>|📋|
|body_messages_tags|bool|Добавление всех тэгов в сообщение|True|
|body_messages_tags_event|||True|
|body_messages_tags_eventid|bool|Добавление eventid тэгов в сообщение|True|
|body_messages_tags_itemid|bool|Добавление itemid тэгов в сообщение|True|
|body_messages_tags_triggerid|bool|Добавление triggerid тэгов в сообщение|True|
|body_messages_tags_actionid|bool|Добавление actionid тэгов в сообщение|True|
|body_messages_tags_hostid|bool|Добавление hostnid тэгов в сообщение|True|
|body_messages_tags_trigger_settings|bool||True|
|body_messages_mentions_settings|bool||True|
|body_messages_tags_no|sting|Тег при отсутствии тэга в узле сети|```#no_tags```|
|body_messages_tags_delimiter|sting|Разделитель между тэгами|'&nbsp; '|
|body_messages_tags_prefix_eventid|sting|Шаблон формирования тэга eventid|```eid_```|
|body_messages_tags_prefix_itemid|sting|Шаблон формирования тэга itemid|```iid_```|
|body_messages_tags_prefix_triggerid|sting|Шаблон формирования тэга triggerid|```tid_```|
|body_messages_tags_prefix_actionid|sting|Шаблон формирования тэга actionid|```aid_```|
|body_messages_tags_prefix_hostid|sting|Шаблон формирования тэга hostidid|```hid_```|
|trigger_settings_tag|sting||'ZNTSettings'|
|trigger_settings_tag_no_graph|sting||'no_graph'|
|trigger_settings_tag_no_alert|sting||'no_alert'|
|trigger_settings_tag_not_notify|sting||'not_notify'|
|trigger_settings_tag_graph_normal|sting||'graph_normal'|
|trigger_settings_tag_graph_stacked|sting||'graph_stacked'|
|trigger_settings_tag_graph_pie|sting||'graph_pie'|
|trigger_settings_tag_graph_exploded|sting||'graph_exploded'|
|trigger_settings_tag_graph_period|sting||'period='|
|trigger_info_mentions_tag|sting||'ZNTMentions'|
|zabbix_keyboard|bool|Добавление кнопок к сообщению. <br>(*В стадии разработки*)|False|
|zabbix_keyboard_button_message|sting|Имя кнопки "Добавить сообщение к событию"|```Message```|
|zabbix_keyboard_button_acknowledge|sting|Имя кнопки "Подтверждение события"|```Acknowledge```|
|zabbix_keyboard_button_history|sting|Имя кнопки "Прислать сообщение (пять последних событий)" по данному элементу данных|```History```|
|zabbix_keyboard_row_width|int|Количество кнопок в строке|3|
|zabbix_api_url|sting|Урл до Zabbix сервера|```http://127.0.0.1/zabbix/```|
|zabbix_api_login|sting|Учетная запись|```Admin```|
|zabbix_api_pass|sting|Пароль|```zabbix```|
|zabbix_graph|bool|Добавление изображения графика к сообщению|True|
|zabbix_graph_period_default|int|Период за который присылается изображение графика в секундах.|43200|
|zabbix_graph_chart|sting|Шаблон формирования линка до chart3.php|<a href="https://github.com/xxsokolov/Zabbix-Notification-Telegram/blob/master/zbxTelegram_config.example.py#L89" target="_blank">Default</a>|
|zabbix_host_link|sting|Шаблон формирования линка до узла сети|```{zabbix_server}zabbix.php?action=search&search={host}```|
|zabbix_graph_link|sting|Шаблон формирования линка до графика "Элемент данных" (item)|```{zabbix_server}history.php?action=showgraph&itemids[]={itemid}&from=now-{range_time}```|
|zabbix_ack_link|sting|Шаблон формирования линка до <a href="https://www.zabbix.com/documentation/current/ru/manual/acknowledges" target="_blank">"Подтверждение проблем"</a>|```{zabbix_server}zabbix.php?action=acknowledge.edit&eventids[0]={eventid}```|
|zabbix_event_link|sting|Шаблон формирования линка до <a href="https://www.zabbix.com/documentation/3.0/manual/web_interface/frontend_sections/monitoring/events" target="_blank">"Детали события"</a>|```{zabbix_server}tr_events.php?triggerid={triggerid}&eventid={eventid}```|
|zabbix_status_emoji_map|dict|Словарь соответствия типа события и emoji|{"Problem": "🚨", "Resolved": "✅", "Update": "🚧", "Not classified": "⁉️", "Information": "💙", "Warning": "💛",n"Average": "🧡", "High": "❤️", "Disaster": "💔", "Test": "🚽💩"}|

### XML разметка
Дополнительная конфигурация производится через XML разметку([пример](https://github.com/xxsokolov/Zabbix-Notification-Telegram/blob/master/actions.example)) в <a href="https://www.zabbix.com/documentation/current/manual/config/notifications/action" target="_blank">Zabbix Action</a>.

Также разберем эти параметры:
|Имя|Аргумент(ы)|Описание|По умолчанию|
|---|-----------|--------|------------|
|```<messages></messages>```|string||<a href="https://github.com/xxsokolov/Zabbix-Notification-Telegram/blob/master/actions.example#L4" target="_blank">Default</a>|
|```<graphs></graphs>```|bool|Добавление изображения графика в сообщение.|True|
|```<hostlinks></hostlinks>```|bool|Добавление линка на "Узел сети" (host) в сообщение.|True|
|```<graphlinks></graphlinks>```|bool|Добавление линка на график "Элемент данных" (item) в сообщение.|True|
|```<triggerlinks></triggerlinks>```|bool|Добавление линка из триггера в сообщение.|True|
|```<tag></tag>```|bool|Добавление всех тэгов в сообщение.|True|
|```<eventtag></eventtag>```|bool|Добавление тэгов события в сообщение.|True|
|```<eventidtag></eventidtag>```|bool|Добавление тэгa c eventid в сообщение.|True|
|```<itemidtag></itemidtag>```|bool|Добавление тэгa c itemid в сообщение.|True|
|```<triggeridtag></triggeridtag>```|bool|Добавление тэгa c triggerid в сообщение.|True|
|```<actionidtag></actionidtag>```|bool|Добавление тэгa c actionid в сообщение.|True|
|```<hostidtag></hostidtag>```|bool|Добавление тэгa c hostid в сообщение.|True|
|```<zntsettingstag></zntsettingstag>```|bool||True|
|```<zntmentions></zntmentions>```|bool||True|
|```<keyboard></keyboard>```|bool|Добавление кнопок к сообщению.<br>(*В стадии разработки*).|True|
|```<graphs_period></graphs_period>```|string|Период за который присылается изображение графика в секундах.|10800|
|```<host></host>```|string|Макрос имени узла сети.|{HOST.HOST}|
|```<itemid></itemid>```|string|Макросы ИД элементов данных.|{ITEM.ID1} {ITEM.ID2} {ITEM.ID3} {ITEM.ID4}|
|```<triggerid></triggerid>```|string|Макрос ИД триггера.|{TRIGGER.ID}|
|```<eventid></eventid>```|string|Макрос ИД события.|{EVENT.ID}|
|```<actionid></actionid>```|string|Макрос ИД действия.|{ACTION.ID}|
|```<hostid></hostid>```|string|Макрос ИД узла сети.|{HOST.ID}|
|```<title><![CDATA[]]></title>```|string|Шаблон формирования заголовка изображения графика из макросов: имя узла сети и имя события.|{HOST.HOST} - {EVENT.NAME}|
|```<triggerurl><![CDATA[]]></triggerurl>```|string|Макрос URL триггера.|{TRIGGER.URL}|
|```<eventtags><![CDATA[]]></eventtags>```|string|Макрос тэгов события разделенных запятой. Макрос объединяет теги из узла сети, шаблона, триггера.|{EVENT.TAGS}|

*<a href="https://www.zabbix.com/documentation/current/ru/manual/appendix/macros/supported_by_location" target="_blank">Полный список поддерживаемых макросов в Zabbix</a>*

```<![CDATA[]]>```:
_В XML документах фрагмент, помещенный внутрь CDATA, — это часть содержания элемента, которая помечена для парсера как содержащая только символьные данные, а не разметку. CDATA — это просто альтернативный синтаксис для отображения символьных данных, нет никакой смысловой разницы между символьными данными, которые объявлены как CDATA и символьными данными, которые объявлены в обычном синтаксисе и где «<» и «>» будут представлены как «&lt;» и «&gt;», соответственно. (<a href="https://ru.wikipedia.org/wiki/CDATA" target="_blank">Wikipedia</a>)_

### Тэги ZNTSettings+ 
Более детальную настройку нотификатора можно произвести через тэги в <a href="https://www.zabbix.com/documentation/current/ru/manual/config/event_correlation/trigger/event_tags" target="_blank">триггерах</a>.

Разберем эти параметры:
|Имя|Описание|По умолчанию|
|---|--------|------------|
|trigger_settings_tag|Имя тэга для обработки значений параметров.|'ZNTSettings'|
|trigger_settings_tag_no_graph|Значение тэга 'ZNTSettings' при котором изображение графика не будет добавлено в сообщение.|'no_graph'|
|trigger_settings_tag_no_alert|Значение тэга 'ZNTSettings' при котором сообщение отправлено не будет.<br>*В [лог файл](#логирование) будет добавлено событие об отмене отправки сообщения.*|'no_alert'|
|trigger_settings_tag_not_notify|Значение тэга 'ZNTSettings' при котором сообщение будет отправляет беззвучно.<br>*Пользователи iOS не получат уведомления, пользователи Android получат уведомление без звука.*|'not_notify'|
|trigger_settings_tag_graph_normal||'graph_normal'|
|trigger_settings_tag_graph_stacked||'graph_stacked'|
|trigger_settings_tag_graph_pie||'graph_pie'|
|trigger_settings_tag_graph_exploded||'graph_exploded'|
|trigger_settings_tag_graph_period|Значение тэга 'ZNTSettings' при котором будет задан период за какой присылать изображение графика. Указывается после разделителя ```=``` в секундах.<br>Приоритет: tag, xml, config*|'period='|

|Имя|Описание|По умолчанию|
|---|--------|------------|
|trigger_info_mentions_tag|Тэг упоминания юзера|'ZNTMentions'|

<details><summary>Пример:</summary>
  <img src="https://i.imgur.com/vKQWZ7V.png" alt="Kitten"	title="A cute kitten" width="100%"/>
</details>


## Логирование

Все основные события (отправка, добавления в cash файл, изменение группы в суппергруппу, ошибки, дебаг) логируются в файле ```znt.log```, Вы можете его найти по умолчанию ```/usr/lib/zabbix/alertscripts/zbxTelegram_files/znt.log``` (<a href="https://github.com/xxsokolov/Zabbix-Notification-Telegram/blob/master/zbxTelegram_config.example.py#L15" target="_blank">config_log_file</a>])
Поддерживаются три режима логирования:
1. Обычный(по-умолчанию), ведется минимальный log об операциях в нотификаторе;
2. <a href="https://github.com/xxsokolov/Zabbix-Notification-Telegram/blob/master/zbxTelegram_config.example.py#L12" target="_blank">Debug</a>], более детальный log, требуется только для анализа ошибок в работе нотификатора *(по-умолчанию False)*;
3. <a href="https://github.com/xxsokolov/Zabbix-Notification-Telegram/blob/master/zbxTelegram_config.example.py#L13" target="_blank">exc_info</a>], полный Traceback ошибок *(по-умолчанию False)*;

## F.A.Q.
#### Оповещение не приходит в группу или в личку


## Последние значимые изменения

* Добавлены и изменены переменные в конфиг файле.
* Изменен XML.


## Помощь

* Welcome! <a href="https://t.me/ZbxNTg" target="_blank">ZNTGroup</a> и <a href="https://t.me/ZNTChannel" target="_blank">ZNTChannel</a>.


---
<a id="note1" href="#note1ref"><sup>1</sup></a>Формирование списка urls в теле сообщения для быстрого перехода в разделы Zabbix (Trigger, History, Event, Acknowledget, Host)<br>
<a id="note2" href="#note2ref"><sup>2</sup></a> Формирование списка tags в теле сообщения для быстрого поиска событий в Telegram (Trigger Tags, Eventid, Itemid, Triggeid, Actionid)<br>
<a id="note3" href="#note3ref"><sup>3</sup></a> Кеш файл это json массив содержащий имена юзуров, групп, суппергруп и их идентификаторы(ИД). Безопасность Telegram не позволяет напрямую писать по имени, только по ИД. Чтобы получить данный ИД надо написать лично Вашему боту или бот должен быть добавлен в группу . Только после этого нотификатор "подключается" к боту и получает все обновления которые произошли у бота (getUpdates). Далее мы находим никнейм или имя групп, куда решили отправить нотификацию, и их ИД, которые и кладем в cash файл.
<a href="https://core.telegram.org/bots/faq#what-messages-will-my-bot-get" target="_blank">FAQ Telegram</a><br>
<a id="note4" href="#note4ref"><sup>4</sup></a> Управление через Trigger Tags (Не прикреплять график, не отправлять уведомление, без push в Telegram *dev* и т.п.)
zbxTelegram_config.py
Показать

Код: Выделить всё

#!/usr/local/lib/python3.9/venv/bin/python
# -*- coding: utf-8 -*-
########################
#    Sokolov Dmitry    #
# xx.sokolov@gmail.com #
#  https://t.me/ZbxNTg #
########################
# Подробные инструкции по всем параметрам на https://github.com/xxsokolov/Zabbix-Notification-Telegram
__author__ = "Sokolov Dmitry"
__maintainer__ = "Sokolov Dmitry"
__license__ = "MIT"

# True - включено ; False - выключено

# Логирование в режиме debug
config_debug_mode = False
# Более детальный режим debug
config_exc_info = False
# Абсолютный путь до cash файла
config_cache_file = '/usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram/zbxTelegram_files/id.cache'
# Абсолютный путь до log файла
config_log_file = '/usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram/zbxTelegram_files/znt.log'

# Использовать прокси для отправки сообщений в Telegram
tg_proxy = False
# Ссылка до Вашего прокси
tg_proxy_server = {'https': 'socks5://username:password@domen:port'}
# Тот самый token, который Вы получали у @BotFather
tg_token = '0000000000:AAH83NQPM4ejWj5IcrA6ICgwok9rmYfV-Gs'

# Наносить ватермарку на изображение графика
watermark = True
# Текст наносимый на изображение графика
watermark_label = 'Dmitry Sokolov (https://github.com/xxsokolov)'
# Путь до файла шрифта
watermark_font = '/usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram/zbxTelegram_files/ArialMT.ttf'
# Минимальный размер изображения графика для нанесения ватермарки
watermark_minimal_height = 30
watermark_fill = 255
watermark_rotate = 0
watermark_expand = True
# Цвет текста в RGB
watermark_text_color = (60, 60, 60)

# Шаблон формирование тела сообщения. *Сообщение состоит из: subject, body, links, tags, mentions
body_messages = '<b>{subject}</b>{body}{links}{tags}{mentions}'
# Урезать тело сообщения
body_messages_cut_symbol = True
# Максимальное кол-во символов в теле сообщения
body_messages_max_symbol = 600
# Шаблон формирования заголовка изображения графика. {title} формируется из секции xml<title></title> и <graphs_period></graphs_period>или graphs_period_default в конфиг файле
body_messages_title = '{title} ({period_time})'

# Добавление линков в сообщение
body_messages_url = True
# Добавление линка из триггера в сообщение
body_messages_url_notes = True
# Добавление линка на график "Элемент данных" (item) в сообщение
body_messages_url_graphs = True
# Добавление линка на "Узел сети" (host) в сообщение
body_messages_url_host = True
# Добавление линка на "Подтверждение проблем" в сообщение
body_messages_url_ack = True
# Добавление линка на "Детали события" в сообщение
body_messages_url_event = True
# Шаблон формирование линка
body_messages_url_template = '<a href="{url}">{icon}</a>'
# Разделитель между линками
body_messages_url_delimiter = ' '
# Иконка при отсутствии URL в триггере (иконка тире -)
body_messages_url_emoji_no_url = '➖'
# Иконка ссылки URL в триггере (знак восклицания в квадратике)
body_messages_url_emoji_notes = 'ℹ️'  # URL-адрес в триггере
# Иконка ссылки на график "Элемент данных" (item) (иконка графика) 
body_messages_url_emoji_graphs = '📊'  # Элемент графика истории URL-адресов
# Иконка ссылки на "Узел сети" (host) (иконка пейджер)
body_messages_url_emoji_host = '📟'  # Узел URL-адреса
# Иконка ссылки на
body_messages_url_emoji_ack = '✉️'  # Проблема с обновлением URL-адреса
# Иконка ссылки на "Детали события" 
body_messages_url_emoji_event = '📋'  # URL-адрес в событии

# Добавление всех тэгов в сообщение
body_messages_tags = True
body_messages_tags_event = True
# Добавление eventid тэгов в сообщение
body_messages_tags_eventid = True
# Добавление itemid тэгов в сообщение
body_messages_tags_itemid = True
# Добавление triggerid тэгов в сообщение
body_messages_tags_triggerid = True
# Добавление actionid тэгов в сообщение
body_messages_tags_actionid = True
# Добавление hostnid тэгов в сообщение
body_messages_tags_hostid = True
body_messages_tags_trigger_settings = True
body_messages_mentions_settings = True
#Тег при отсутствии тэга в узле сети
body_messages_tags_no = '#no_tags'
# Разделитель между тэгами
body_messages_tags_delimiter = ' '
# Шаблон формирования тэга eventid
body_messages_tags_prefix_eventid = 'eid_'
#  	Шаблон формирования тэга itemid
body_messages_tags_prefix_itemid = 'iid_'
# Шаблон формирования тэга triggerid
body_messages_tags_prefix_triggerid = 'tid_'
# Шаблон формирования тэга actionid
body_messages_tags_prefix_actionid = 'aid_'
# Шаблон формирования тэга hostidid
body_messages_tags_prefix_hostid = 'hid_'

trigger_settings_tag = 'ZNTSettings'
trigger_settings_tag_no_graph = 'no_graph'
trigger_settings_tag_no_alert = 'no_alert'
trigger_settings_tag_not_notify = 'not_notify'
trigger_settings_tag_graph_normal = 'graph_normal'
trigger_settings_tag_graph_stacked = 'graph_stacked'
trigger_settings_tag_graph_pie = 'graph_pie'
trigger_settings_tag_graph_exploded = 'graph_exploded'
trigger_settings_tag_graph_period = 'period='  # period=43200

trigger_info_mentions_tag = 'ZNTMentions'

# Добавление кнопок к сообщению.
zabbix_keyboard = False
# Имя кнопки "Добавить сообщение к событию"
zabbix_keyboard_button_message = 'Message'
# Имя кнопки "Подтверждение события"
zabbix_keyboard_button_acknowledge = 'Acknowledge'
# Имя кнопки "Прислать сообщение (пять последних событий)" по данному элементу данных
zabbix_keyboard_button_history = 'History'
# Количество кнопок в строке
zabbix_keyboard_row_width = 3

# Урл до Zabbix сервера
zabbix_api_url = 'http://192.168.175.111/zabbix/'
# Учетная запись
zabbix_api_login = 'read'
# Пароль
zabbix_api_pass = 'Пароль'

# Добавление изображения графика к сообщению
zabbix_graph = True
# Период за который присылается изображение графика в секундах. 43200
zabbix_graph_period_default = 10800  # 3h
# Шаблон формирования линка до chart3.php
zabbix_graph_chart = '{zabbix_server}chart3.php?' \
                     'name={name}&' \
                     'from=now-{range_time}&' \
                     'to=now&' \
                     'width=900&' \
                     'height=200&' \
                     'items[0][itemid]={itemid}&' \
                     'legend=1&' \
                     'showtriggers=1&' \
                     'showworkperiod=1'

# Шаблон формирования линка до узла сети
zabbix_host_link = "{zabbix_server}zabbix.php?action=search&search={host}"
# Шаблон формирования линка до графика "Элемент данных" (item)
zabbix_graph_link = "{zabbix_server}history.php?action=showgraph&itemids[]={itemid}&from=now-{range_time}"
# Шаблон формирования линка до "Подтверждение проблем"
#zabbix_ack_link = "{zabbix_server}zabbix.php?action=acknowledge.edit&eventids[0]={eventid}"  # Zabbix Server ver > 5
zabbix_ack_link = "{zabbix_server}zabbix.php?action=popup&popup_action=acknowledge.edit&eventids[0]={eventid}"  # Zabbix Server ver <= 5
# Шаблон формирования линка до "Детали события"
zabbix_event_link = "{zabbix_server}tr_events.php?triggerid={triggerid}&eventid={eventid}"


# Словарь соответствия типа события и эмодзи emoji
zabbix_status_emoji_map = {
    "Problem": "🚨",
    "Resolved": "✅",
    "Update": "🚧",
    "Not classified": "⁉️",
    "Information": "💙",
    "Warning": "💛",
    "Average": "🧡",
    "High": "❤️",
    "Disaster": "💔",
    "Test": "🚽💩"}
СКАЧАТЬ от 15.12.2021
Zabbix-Notification-Telegram.zip
Zabbix-Notification-Telegram.zip
(606.46 КБ) 36 скачиваний
Добавление новых пользователей проверка отправки:
/usr/local/share/zabbix/alertscripts/Zabbix-Notification-Telegram/zbxTelegram.py @Логин test test
/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/zbxtg.py "@Логин" "тест" "тестовое сообщение" --debug
количество слов: 3417
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Оповещение Zabbix через Telegram

Сообщение Артём Мамзиков »

/usr/local/lib/python3.9/bin/
установить виртуальное окружение
pip3.9 install virtualenv

директорию для проекта, внутри которой будет работать виртуальное окружение
cd /usr/local/share/
mkdir telegram_bot
cd telegram_bot

Развернём виртуальное окружение внутри папки telegram_bot
/usr/local/lib/python3.9/bin/virtualenv venv -p python3.9
создана виртуальная среда CPython3.9.9.final.0-64 за 3626 мс

Теперь его активируем
/usr/local/lib/python3.9/bin/source venv/bin/activate
или
source venv/bin/activate

Подключаем Aiogram
pip3.9 install aiogram
устанавливается в созданное ранее виртуальное окружение, связанное с папкой telegram_bot. Если вы решите создать нового бота в другой директории на компьютере, то установку будет необходимо провести заново, иначе Aiogram не будет работать.

Запуска бота
python3.9 main.py


Библиотека aiogram позволяет создать на Python клавиатуры двух видов, отличающиеся друг от друга расположением кнопок:
Reply-кнопки для шаблонных ответов, которые закрепляются вместо основной клавиатуры на экране. Часто используются в чат-ботах как меню. Создаются с помощью метода ReplyKeyboardMarkup.
Инлайн-кнопки, связанные с сообщениями в чате. При этом пользователь видит и основную клавиатуру. Создаются с помощью метода InlineKeyboardMarkup.

https://docs.aiogram.dev/en/latest/


nano main.py

Код: Выделить всё

#!/usr/bin/env python3.9
# coding: utf-8

# Импортируем из Aiogram нужные классы и модуль
# Bot - определяет, на какие команды от пользователя и каким способом отвечать.
# Dispatcher - позволяет отслеживать обновления.
# Executor - запускает бота и выполняет функции, которые следует выполнить
# types - позволит нам использовать базовые классы для аннотирования
# Например: types.Message, позволяющий работать с приёмом текстовых сообщений пользователя.
from aiogram import Bot, Dispatcher, executor, types

# ReplyKeyboardMarkup Reply-кнопки для шаблонных ответов, которые закрепляются вместо основной клавиатуры. Часто используются в чат-ботах как меню.
# ReplyKeyboardMarkup — импортируем его и дополнительные необходимые классы
# ReplyKeybordRemove и ReplyKeyboardMarkup позволяют создавать и удалять клавиатуру
# KeyboardButton используется для добавления кнопок
from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton

# InlineKeyboardMarkup-Инлайн-кнопки, связанные с сообщениями в чате
# InlineKeyboardMarkup пригодится для инициализации инлайн-кнопок, а InlineKeyboardButton — для их создания.
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton

# Токен API Telegram
#API_TOKEN = 'токен'
API_TOKEN = ''токен'

# Инициализировать объекты bot и Dispatcher, передав первому наш токен
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

# Приветственное окно, которое будет появляться при нажатии /test1
# Cоздаём message_handler и прописываем функцию ответа
# message_handler — это декоратор, который реагирует на входящие сообщения и содержит в себе функцию ответа.
# commands=['start'] — это команда, которая связана с декоратором и запускает вложенную в него функцию
# async def send_welcome — создаёт асинхронную функцию, которая принимает в себя сообщение пользователя message,можно назвать любым образом. например send_welcome
# await message.reply — определяет ответ пользователя, используя await из-за асинхронности работы библиотеки
@dp.message_handler(commands=['test1']) #Явно указываем в декораторе, на какую команду реагируем.
async def send_welcome(message: types.Message):
   await message.reply("Привет!\nЯ Эхо-бот!\nОтправь мне любое сообщение, а я тебе обязательно отвечу.") #Так как код работает асинхронно, то обязательно пишем await.


# Кнопки с готовыми фразами ReplyKeyboardMarkup
# список kb, который будет хранить кнопки
# Кнопка в aiogram создаётся с помощью types.KeyboardButton(text=" "), где в параметре text мы передаём отображаемое название кнопки.
# C помощью метода types.ReplyKeyboardMarkup(keyboard=kb)название списка с кнопками
# показать клавиатуру в Telegram-чате
# в ответ строку reply_markup=keyboard, которая отображает клавиатуру после команды /test2
@dp.message_handler(commands=['test2'])
async def send_welcome(message: types.Message):
   kb = [
       [
           types.KeyboardButton(text="Сможешь повторить это?"),
           types.KeyboardButton(text="А это?")
       ],
   ]
   keyboard = types.ReplyKeyboardMarkup(keyboard=kb)

   await message.reply("Привет!\nЯ Эхобот!\nОтправь мне любое сообщение, а я тебе обязательно отвечу.", reply_markup=keyboard)

# Инлайн-кнопки InlineKeyboardMarkup
# инициализируем клавиатуру с помощью InlineKeyboardMarkup, передав в качестве аргумента row_width число 1.
# Оно определяет, сколько кнопок будет находиться в одном ряду.
# Так как у нас надписи на кнопках длинные, лучше поместить их друг под другом.
# для каждой кнопки отдельную переменную и инициализируем класс Button. В параметрах указываем:
# text — текст, который будет показан на кнопке в мессенджере;
# url — URL страницы, на которую пользователь будет переходить при нажатии на кнопку.
# add добавляем две кнопки к уже созданной клавиатуре.
# message_handler, который будет вызывать в Telegram инлайн-кнопки.
# По аналогии с обычными кнопками — с разницей, что в качестве команды вызова укажем ссылки,
# а в параметре reply_markup передадим название нашей клавиатуры — urlkb.
urlkb = InlineKeyboardMarkup(row_width=1)
urlButton = InlineKeyboardButton(text='Перейти на сайт', url='https://diyit.ru/')
urlButton2 = InlineKeyboardButton(text='Перейти к разделам zabbix', url='https://diyit.ru/viewforum.php?f=4/')
urlkb.add(urlButton,urlButton2)

@dp.message_handler(commands='ссылки')
async def url_command(message: types.Message):
   await message.answer('Полезные ссылки:', reply_markup=urlkb)

# Cобытие, которое будет обрабатывать введённое пользователем сообщение:
# бот должен реагировать на любое текстовое сообщение от пользователя, то скобки в @dp.message_handler мы оставляем пустыми
# ответа мы также используем метод message
@dp.message_handler() #Создаём новое событие, которое запускается в ответ на любой текст, введённый пользователем.
async def echo(message: types.Message): #Создаём функцию с простой задачей — отправить обратно тот же текст, что ввёл пользователь.
   await message.answer(message.text)

# Получение сообщений от сервера в Telegram
# start_polling опрашивает сервер, проверяя на нём обновления. Если они есть, то они приходят в Telegram
if __name__ == '__main__':
   executor.start_polling(dp, skip_updates=True)
количество слов: 320
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Оповещение Zabbix через Telegram

Сообщение Артём Мамзиков »

ДЛЯ MIPS OS DEBIAN
Для маршрутизатор Keenetic сразу 2х ОС Entware и Debian
тестирования настроек Телеграм.
Версия релиза ОС

Код: Выделить всё

cat /etc/*-release
Ответ:
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Обновим список пакетов

Код: Выделить всё

apt-get update
Установим python

Код: Выделить всё

apt-get install python
Пакет python недоступен
Однако следующие пакеты могут его заменить: python-is-python3 2to3

Код: Выделить всё

apt-get install python-is-python3 2to3

Код: Выделить всё

apt-get install python3-venv python3-pip
Обновим компоненты

Код: Выделить всё

pip install --upgrade pip
или

Код: Выделить всё

pip3 install --upgrade pip
Версия python

Код: Выделить всё

python -V
Python 3.11.2

Ставим пакеты(компоненты) для питон
Так устанавливаться не хочет

Код: Выделить всё

pip3 install requests
Ставим так:
apt install python-Имя-Пакета-для-установки

Код: Выделить всё

apt install python3-requests-oauthlib

Код: Выделить всё

apt install python3-requests

Код: Выделить всё

apt install python3-wheel

Код: Выделить всё

apt install python3-pillow

Код: Выделить всё

apt install python3-socks

Код: Выделить всё

apt install python3-xmltodict

Код: Выделить всё

apt install python3-pyzabbix
Не найдено
apt install python3-activate
apt install python3-pyTelegramBotAPI
apt-get install python-virtualenv

Установка и запуск виртуальной среды
python/bin/source venv/bin/activate
python3 /bin/source venv/bin/activate

Код: Выделить всё

apt install python3-virtualenv

Код: Выделить всё

apt install python3-virtualenvwrapper 
Активация
virtualenv venv --python=python3 | source venv/bin/activate
virtualenv venv --python=python3
python/activate

Код: Выделить всё

source venv/bin/activate
python3 -m venv venv

После запуска виртуальной среды запускаем установку

Код: Выделить всё

pip3 install aiogram
Запускаем скрипт

Код: Выделить всё

python3 main.py
количество слов: 190
Ответить Вложения 24 Пред. темаСлед. тема

Вернуться в «Установка Заббикс и Дополнений»