Периодически возникает желание получать уведомления, иметь возможность настраивать источник, фильтровать сообщения по темам, и писать как можно меньше кода. Например, присылать себе картинку/цитату/слово дня или дельту по изменениям ордеров на бирже. В результате получился универсальный инструмент — бот и персональное АПИ для отправки сообщений в Telegram. Прошу под кат.
Архитектура

Сервис состоит из следующих компонентов:
-
MQTT-брокера
-
REST API, которое его оборачивает и позволяет отправлять сообщения
-
Telegram-бота, который подписан на MQTT и пересылает сообщения
-
MongoDB для хранения пользователей и подписок
Как этим пользоваться?
Отправка сообщений организована вокруг топиков, через бота можно подписаться/отписаться. При этом реальное имя топика будет выглядеть так: <telegramId>/<topic>, поэтому каждый пользователь получает свое пространство имен и API-ключ.
Для отправки сообщений, нужно сделать следующее:
-
Добавить Mqtt2TelegramBot
-
Запустить команду
/start, бот расскажет, как отправлять сообщение в уже созданный топик (по умолчанию их нет) -
Подписаться на какой-то топик:
/sub <my-topic>, бот сразу покажет команду для отправки сообщения с помощью HTTPie (//url) и логин/пароль для Basic AuthО всех возможностях бот расскажет сам по команде
/commands.
Примеры кода
cURL
curl -v -X POST -u "${LOGIN}:${PASSWORD}" \ https://mqtt2telegram.projects.royz.cc/api/v1.0/send \ -H "Content-Type: application/json" \ -d "{\"topic\": \"${TOPIC}\", \"payload\": \"${MESSAGE}\"}"
где, LOGIN — telegramId/chatId, PASSWORD — выдаст бот, либо по команде /creds ,TOPIC — топик, на который вы подписались командой /sub <topic> , MESSAGE — текст сообщения (с поддержкой Markdown)
Python
import requests url = "https://mqtt2telegram.projects.royz.cc/api/v1.0/send" login = "1234567" password = "aaBBccEEdd" topic = "YOUR_TOPIC" json = { "topic": topic, "payload": "YOUR_MESSAGE" } requests.post(url, auth=(login, password), json=json)
JavaScript
import got from "got" async function sendMessage(login, password, topic, message) { const url = 'https://mqtt2telegram.projects.royz.cc/api/v1.0/send' const hash = btoa(`${login}:${password}`) const options = { headers: { authorization: `Basic ${hash}` } } const json = { topic, payload: message } return got.post(url, {...options, json}) }
Мои примеры использования
-
каждый день я отправляю себе цитату дня и картинку дня из Википедии с помощью scheduled job в github actions
-
каждые 5 минут этот скрипт мониторит состояние ордеров на Binance, если что-то создалось/продалось, приходит уведомление
-
у меня есть IoT-кнопка, анти-прокрастинатор, которая включает busy/idle режим в toggl.com, это не имеет ничего общего с пересылкой телеграм, просто запустил MQTT на той же инфраструктуре, и как побочный эффект могу этим же ботом подписаться на топик об изменениях состояния кнопки
-
(пока идея) т.к. в MQTT позволяет отправить сразу картинку, можно отправлять изображение с камеры по расписанию или при обнаружении движения
Stack
-
Сервер на Javalin (довольно сырой фреймворк, приходится просить доделывать фичи), TelegramBots
-
MQTTv5: HiveMQ в облаке, бесплатного аккаунта хватает
-
MongoDB в облаке для хранения пользователей и топиков
-
CI/CD: github actions (деплой вручную с помощью helm в k8s под урпавлением Rancher)
Подключайтесь и рассказывайте о ваших примерах использования или идеях новых фич.
Спасибо за внимание!
ссылка на оригинал статьи https://habr.com/ru/post/683698/
Добавить комментарий