Расскажу о том, как посты из этого блога попадают в мой 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.
В каталоге воркфлоу я даже нашел готовый пример, которым сразу и воспользовался:
Там, кстати, есть и другие, но один был документирован на китайском языке (это не точно, но иероглифы были в наличии), а второй был заточен на агрегацию нескольких RSS-каналов.
В целом, меня работа этого сценария устроила и я стал на его примере разбираться с механикой.
Написал свой workflow
После пары часов знакомства с инструментами я дошел до какой-то такой версии:
В паре слов, как оно работает:
Сценарий запускается по таймеру или вручную
Читается RSS-лента сайта, из хранилища берется таймштамп последнего опубликованного поста
RSS-лента фильтруется, остаются только посты старше, чем последний опубликованный
“Новые” посты переводятся в Markdown и публикуются в Telegram
Таймштамп последнего опубликованного поста в хранилище обновляется
Выглядит такой сценарий сложнее оригинального т.к. я решил внести несколько существенных изменений:
Добавлен отдельный шаг, позволяющий сбросить указатель на нужное время.
Чтобы автоматическая публикация не постила дважды одни и те же посты после ручных манипуляций.
Указатель на последний опубликованный пост сохраняется не во внутренностях воркфлоу, а в сервисе getpantry.cloud.
Это такое JSON-ориентированное KV-хранилище, позволяющее работать с данными по REST API. Бесплатно.
Использовать его я решил т.к. не захотел разбираться, где там внутри у воркфлоу хранятся данные и как их редактировать на случай ручных манипуляций.
Плюс работать с этой мета-инфой нужно через JS-код, а я попытался полностью избежать программирования на клавиатуре.
В целом, можно заменить его на любой другой KV, например, Redis - и результат будет тот же самый.
Все шаги, которые были реализованы через шаг
Code
, я поправил на нативные ноды типаMerge
,Markdown
.Не смог избавиться только от одной,
Code: Adjust Timestamp
. Там я сравниваю, какой таймштамп считать актуальным - взятый из хранилища или “текущий момент”.Этот шаг нужен на тот случай, когда сервис превратится в тыкву. А это неизбежно случится.
Создал Telegram-бота
Тут всё просто, в интернете множество руководств, да и сам процесс довольно простой.
Надо просто написать боту @BotFather и получить токен.
Далее я добавил бота в канал и выдал ему права на добавление постов.
Кстати, чтобы узнать ID вашего канала, можно переслать любое сообщение из него боту @RawDataBot.
Проверил, что всё работает
После нескольких итераций отладки, сценарий стал работать, как ожидается.
Так что я пару раз нажал на ручной trigger и в канале появились заветные посты – в нужном порядке, без дублей и вот это всё:
С тех пор сценарий запускается в разное время в некоторые рабочие дни, и проверяет, нет ли в блоге новых постов.
Мне показалось логичным постить в 10:00 и 19:00 по Москве, вроде как официальные новости.
Также посты выдаются по одному, чтобы я мог спокойно написать пяток постов за выходные, и оно бы загрузило эфир на половину недели.
Так что, этот текст появится в блоге сегодня, в субботу, а вот в Telegram-канал приедет уже в понедельник.
Вот так.