Расскажу о том, как посты из этого блога попадают в мой telegram-канал.

Полезные ссылки:

Как я к этому пришел

После перезапуска блога, мне хотелось навесить на него немного прикольных автоматизаций.

А так как это всё как раз совпало по времени с тем, как мой бывший коллега стал активней вести свой канал, то первая часть плана пришла сама собой:

Надо транслировать посты в телегу!

👋 Кстати, привет, Андрей!

Но как же транслировать сообщения из блога в Telegram?

Сначала я подумал про какие-то CI/CD процессы, у меня же бложик хранится в git. Чтобы, значит, при выкладке забирать контент и постить его в канал.

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

Скажем, публиковать не строго по git push, а комбинировать “по кнопке” и “по расписанию”. Такая логика будет утяжелять пайплайн и плодить слишком много кода.

Я немного поговорил с другим бывшим коллегой, который тоже ведёт блог и он подсказал вторую гениальную часть плана:

Есть же RSS!

👋 Кстати, привет, Вова!

Как можно транслировать RSS-ленту в Telegram

Взять конструктор ботов

Например, есть @Manybot.

Я сразу отмел этот вариант т.к. хотел сделать что-то чуть более самостоятельно.

Написать всё самостоятельно

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

Интересно, что я забрасываю их все в тот момент, когда надо инвестировать время в сервисные вещи: собрать/упаковать docker-образ, поднять платформу для запуска кода, ну и так далее.

Слишком много активности, не направленной на результат - и проект замирает.

Так что, этот подход я тоже отклонил.

Взять смузи и замутить no-code

Про то, что такое no-code, неплохо рассказал Василий.

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

  • Забрать данные отсюда
  • Модифицировать данные
  • Сложить данные сюда
  • Отправить уведомление тому-то

На самом деле, обычно чистый no-code довольно слаб. Нет-нет, а пару строчек логики придётся именно написать. Это, правда, не так уж страшно.

В общем, я пошёл по этому пути.

Как я справился

Взял n8n и нашел сценарий-образец

Первое, что я сделал - развернул себе на домашнем сервере n8n.io через вот этот Helm-чарт.

n8n – это self-hosted (уже не только) платформа для написания no/low-code сценариев. Мне норм.

Для простоты можно не баловаться со всякими in-house решениями, а просто воспользоваться готовыми штуками типа Zapier или IFTTT.

В каталоге воркфлоу я даже нашел готовый пример, которым сразу и воспользовался:

n8n-template-workflow

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

В целом, меня работа этого сценария устроила и я стал на его примере разбираться с механикой.

Написал свой workflow

После пары часов знакомства с инструментами я дошел до какой-то такой версии:

n8n-my-workflow

В паре слов, как оно работает:

  1. Сценарий запускается по таймеру или вручную

  2. Читается RSS-лента сайта, из хранилища берется таймштамп последнего опубликованного поста

  3. RSS-лента фильтруется, остаются только посты старше, чем последний опубликованный

  4. “Новые” посты переводятся в Markdown и публикуются в Telegram

  5. Таймштамп последнего опубликованного поста в хранилище обновляется

Выглядит такой сценарий сложнее оригинального т.к. я решил внести несколько существенных изменений:

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

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

  • Указатель на последний опубликованный пост сохраняется не во внутренностях воркфлоу, а в сервисе getpantry.cloud.

    Это такое JSON-ориентированное KV-хранилище, позволяющее работать с данными по REST API. Бесплатно.

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

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

    В целом, можно заменить его на любой другой KV, например, Redis - и результат будет тот же самый.

  • Все шаги, которые были реализованы через шаг Code, я поправил на нативные ноды типа Merge, Markdown.

    Не смог избавиться только от одной, Code: Adjust Timestamp. Там я сравниваю, какой таймштамп считать актуальным - взятый из хранилища или “текущий момент”.

    Этот шаг нужен на тот случай, когда сервис превратится в тыкву. А это неизбежно случится.

Создал Telegram-бота

Тут всё просто, в интернете множество руководств, да и сам процесс довольно простой.

Надо просто написать боту @BotFather и получить токен.

Далее я добавил бота в канал и выдал ему права на добавление постов.

Кстати, чтобы узнать ID вашего канала, можно переслать любое сообщение из него боту @RawDataBot.

Проверил, что всё работает

После нескольких итераций отладки, сценарий стал работать, как ожидается.

Так что я пару раз нажал на ручной trigger и в канале появились заветные посты – в нужном порядке, без дублей и вот это всё:

telegram-screenshot

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

Мне показалось логичным постить в 10:00 и 19:00 по Москве, вроде как официальные новости.

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

Так что, этот текст появится в блоге сегодня, в субботу, а вот в Telegram-канал приедет уже в понедельник.

Вот так.