Периодически возникает желание получать уведомления, иметь возможность настраивать источник, фильтровать сообщения по темам, и писать как можно меньше кода. Например, присылать себе картинку/цитату/слово дня или дельту по изменениям ордеров на бирже. В результате получился универсальный инструмент - бот и персональное АПИ для отправки сообщений в 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)

Код проекта и документация.

Подключайтесь и рассказывайте о ваших примерах использования или идеях новых фич.

Спасибо за внимание!

Комментарии (26)


  1. zorn_v
    20.08.2022 21:32
    +32

    Сервер на Javalin (довольно сырой фреймворк, приходится просить доделывать фичи), TelegramBots

    MQTTv5: HiveMQ в облаке, бесплатного аккаунта хватает

    MongoDB в облаке для хранения пользователей и топиков

    CI/CD: github actions (деплой вручную с помощью helm в k8s под урпавлением Rancher)

    Ох уж эти смузихлёбы на ноде. Почему вместо монги не взять SQlite ? Почему вообще какие то облака ? Почему нельзя запустить одной командой не указывая какие то credentials кроме необходимых (типа в какую телегу отправлять) ?

    Ну и главное, ЗАЧЕМ ВООБЩЕ k8s ?


    1. zjor Автор
      20.08.2022 21:50
      -12

      а где деплоить?


    1. freedbrt
      20.08.2022 23:17
      +12

      Видимо используют то что умеют/то чем пользуются работе, а не то что эффективно и проще в данной конкретной задаче.


    1. werwolflg
      21.08.2022 01:15
      +7

      >Ну и главное, ЗАЧЕМ ВООБЩЕ k8s ?

      Так в подписи всё написано.

      >программист-фантазер, CTO @ Swipelux OU


  1. select26
    21.08.2022 00:51
    +1

    "персональное АПИ" не бывает.

    Есть API - это аббревиатура от слова interface. По правилам русского языка это мужской род.

    Правильно писать "персональный API". Исправьте пожалуйста.


    1. Fodin
      21.08.2022 16:14
      +5

      По правилам русского языка interface - это мужской род. Ок.


      1. select26
        21.08.2022 18:48
        +5

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


        1. Chamie
          22.08.2022 20:47

          Правила склонения в русском действуют только на слова на русском. Может, и иностранные, но на русском. Если бы было не API, а ППИ (прикладной программный интерфейс), то да, нужно было бы использовать мужской род.


          1. select26
            22.08.2022 21:11

            Согласен с вами в части ППИ. А по поводу "Правила склонения в русском действуют только на слова на русском":

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

            Вот тут ещё про заимствованные слова со ссылками на источники: http://gramota.ru/class/istiny/istiny_10_zaimst/


          1. select26
            22.08.2022 21:17

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

            В этом случае тоже получается, что API - мужской род.


    1. Renovatoo
      22.08.2022 18:54

      Перед "пожалуйста" круто было бы запятую поставить


      1. select26
        22.08.2022 21:18

        Спасибо. Исправлю.


  1. JPEGEC
    21.08.2022 13:08
    -1

    (пока идея) т.к. в MQTT позволяет отправить сразу картинку, можно
    отправлять изображение с камеры по расписанию или при обнаружении
    движения

    И внезапно получаете отлуп от телеграмма при слишком частом событии :(


    1. ducemollari
      21.08.2022 17:19

      Насколько часто? Два скрина и ролик на событие - норм. Иногда один факт движения генерит несколько событий.


  1. Zara6502
    21.08.2022 15:45
    +2

    Для меня всё звучит как "я построил Звезду смерти и убиваю ей мух", то есть автору принципиально мух убивать высокотехнологичными наноботами.

    У меня дома камера по движению отсылает картинки на email по smtp, телодвижений только на введение сервера, логина и пароля в окнах настройки камеры. Так как ящик специально под камеру создан, то и прилетевшие от него на смартфон письма мне понятно откуда прилетели.

    У вас в системе много элементов от которых зависит функционирование всего, один сбоит - всё не работает. Ну и облака - это не панацея - это горе современного мира, хлебнёте вы ещё с этими облаками только поздно будет.


    1. datacompboy
      22.08.2022 02:14
      +1

      Ну и облака - это не панацея - это горе современного мира, хлебнёте вы ещё с этими облаками только поздно будет.

      прозвучало как "у тебя что, всегда с собой калькулятор в кармане будет?"


      1. Zara6502
        22.08.2022 05:56

        ну калькулятор не у всех в кармане это точно, если это намёк на смартфоны и наличие там калькулятора, то и смартфоны не у всех. у меня есть смартфон, то калькулятор я там запускаю раз в год, а может и реже.

        касательно облачных сервисов - уже был прикол с Роскомнадзором, который гоняясь за Телегой блокировал IP облачных сервисов - было забавно наблюдать. О - отказоустойчивость. Вам либо облака, либо "О".


        1. datacompboy
          22.08.2022 11:28

          Как если бы не-облачные IP не банил РКН...


          1. Zara6502
            22.08.2022 13:39

            Ваши слова соответствуют фразе "Как если бы облачные IP банил РКН...", только мысль ваша мне не ясна


            1. datacompboy
              22.08.2022 13:48

              Не-облачные IP банились так же, только облачные было проще мигрировать


              1. werwolflg
                22.08.2022 18:30

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


                1. datacompboy
                  22.08.2022 18:46

                  На любом шаред хостинге пострадали независимые сервисы. Особенно когда банили огромными подсетками.


                  1. zjor Автор
                    22.08.2022 20:34

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


                    1. datacompboy
                      22.08.2022 22:41

                      Не очень, перфокарты неплохо поддерживают горение (по крайней мере те, что были в моем детстве)


                      1. zjor Автор
                        22.08.2022 22:56

                        зато закладки для книжке хорошие были :)


                      1. datacompboy
                        22.08.2022 23:05

                        И сюрикены :))