Перейти к основному содержимому
Инструкции

Автопостинг RSS в Telegram: пошаговая настройка 2026

Также доступно на языках:ENRUUK
Опубликовано November 29, 202512 мин. чтения261 просмотров
Автопостинг RSS в Telegram: пошаговая настройка 2026

Автопостинг RSS в Telegram: пошаговая настройка 2026

Коротко. Настройка автопостинга RSS в Telegram-канал — это пять конкретных шагов: провести аудит фида, выбрать стек (свой бот, IFTTT/Zapier/Make или управляемый инструмент типа Autogram), подобрать частоту опроса под реальный ритм публикаций, дедуплицировать по GUID до того, как Bot API вообще увидит payload, и оформить каждый айтем в MarkdownV2 с аккуратным превью ссылки. Слой AI-переписи сверху превращает поток в читабельный дайджест.

Хотите запустить RSS в Telegram за пять минут без своего воркера? Попробуйте Autogram бесплатно.

Предварительные требования

Photo by Michael Dupuis on Pexels

Прежде чем подключать фид к каналу, проверьте, что готово:

  • Рабочий URL RSS- или Atom-фида. Вы либо владелец источника (блог, подкаст, внутренний статус-фид), либо имеете явное разрешение на синдикацию. Хот-линковка чужого фида без разрешения — сначала копирайт, потом SEO: пара «канал ↔ домен» в графах синдикации бьёт по обеим сторонам.
  • Telegram-канал и бот, который в нём админ. Создайте бота через @BotFather, добавьте в канал, выдайте права админа с разрешением Postiti (Posting messages). Без админа каждое отправление возвращает Bad Request: chat not found или Forbidden.
  • Постоянное хранилище для «последний увиденный айтем». Достаточно плоского файла или ключа в Redis — нужно где-то помнить, какие GUID уже отправлены, иначе повторное чтение фида зальёт канал последними 20 айтемами.
  • Bot API токен вне git. Держите в env-переменной, секрет-сторе или в .env, который не коммитится. Утечки токенов в коммитах вычитываются скрейперами за часы.

Если есть сомнения, валидный ли фид — прогоните URL через W3C Feed Validation Service. Невалидный фид ломает парсеры так, что это похоже на сетевую ошибку, и съедает по часу на отладку каждый раз.

Шаг 1 — Сделайте аудит фида до того, как ему доверять

Самый быстрый способ запустить сломанный RSS-в-Telegram — пропустить аудит. Половина продакшен-инцидентов, которые я отлаживал в этой интеграции, оказывались квирками источника, а не багами Telegram.

  1. Вытяните фид руками: curl -sS <feed-url> | xmllint --format - и перечитайте. Убедитесь, что в каждом айтеме есть <guid> (или <id> для Atom) — без стабильного GUID на айтем нечем дедуплицировать, и вы будете дублить.
  2. Зафиксируйте типичную частоту выхода айтемов. Блог, который публикует дважды в неделю, требует опроса раз в 6–12 часов; новостная лента с 200 айтемами в день — раз в 2–5 минут. Чаще — жжёт квоту впустую; реже — теряет айтемы, потому что фид обрезается до последних N.
  3. Проверьте формат <pubDate>. RFC 822 (RSS) и RFC 3339 (Atom) оба валидны; некоторые фиды шлют «творческие» даты вроде «Fri, 22 Apr 2026 14:00 GMT+0:00», которые строгие парсеры отвергают. Берите толерантный парсер или нормализуйте при чтении.
  4. Посмотрите, какой HTML лежит в теле айтема. Telegram принимает узкое подмножество MarkdownV2 / HTML — <table>, <iframe>, инлайн-скрипты, большинство тегов с атрибутами надо выкидывать. Место, где это нужно найти — аудит, а не первый продакшен-сенд в три ночи.
  5. Проверьте <enclosure> / media:content на наличие изображений. Если фид тащит изображения, лучше использовать sendPhoto вместо sendMessage для богатого превью. Если нет — sendMessage с disable_web_page_preview: false самый дешёвый путь, потому что Telegram сам заберёт Open Graph картинку с URL статьи.

Честный десятиминутный аудит экономит неделю тикетов «почему бот трижды запостил один и тот же айтем».

Шаг 2 — Выберите правильный стек: нативно vs third-party vs управляемый

Конфигураций RSS-в-Telegram три. Выбирайте по команде, а не по хайпу:

СтекВремя настройкиСтоимость на айтемКастомизацияКому подходит
Свой бот-воркер (Python feedparser + python-telegram-bot, на VPS / cron)2–6 часовБесплатно (ваш хостинг)ПолнаяИнженерным командам, которые уже держат воркеры; единичным внутренним фидам
IFTTT / Zapier / Make / n8n15–30 мин на фид$5–$50/мес на ~1k айтемовНизкая–средняя (шаблонная)Маркетинг-командам без разработчиков; малому количеству фидов
Управляемый Telegram-инструмент (Autogram, ManyBot, Posterly)5–10 минВключено в плоский тарифСредняя–высокая, зависит от тулаМультиканальным паблишерам, AI-rewrite кейсам, тем кто не хочет нянчиться с воркерами

Несколько острых углов:

  • RSS-триггер IFTTT опрашивает раз в ~15 минут минимум и тихо теряет айтемы, если источник пишет чаще. Для активных новостных лент IFTTT теряет материал.
  • Zapier и Make тарифицируют по таскам. Фид на 50 айтемов в день — это 1500 тасков в месяц на одну мовы. Тариф Zapier Starter это съедает за один фид.
  • n8n — лучший self-hosted вариант, если у вас уже есть Docker; цепочка «RSS Read → Telegram → Set (для дедупликации)» укладывается в 4 ноды.
  • Свой воркер самый дешёвый на масштабе, но вы владеете всем: фейловер, рестарт после креша, MarkdownV2 escape, фолбек изображений — всё. Что значит «владеть всем», расписано в гайде по массовой рассылке в Telegram.
  • Управляемые тулы меняют стоимость на айтем на ноль ops и время настройки. Правильный ответ, если вы предпочитаете заниматься контентом, а не systemd-юнитами.

Сайд-бай-сайд no-code вариантов — в сравнении no-code автоматизации Telegram.

Шаг 3 — Настройте частоту опроса и дедуплицируйте без жалости

Photo by Christina Morillo on Pexels

Опрос и дедупликация — два рычага, которые отличают рабочий пайплайн от шумного. Налажаете — либо шлёте дубли, либо теряете новости.

  1. Интервал опроса — половина медианного интервала между публикациями фида. Если фид выходит в среднем раз в 20 минут — опрашивайте раз в 10. Даёт запас без жжения квоты. Никогда не опрашивайте чаще раза в 60 секунд для одного фида — источник расценит это как злоупотребление и заблочит.
  2. Всегда шлите условный GET. Заголовки If-Modified-Since и If-None-Match на каждом опросе; ответ 304 — бесплатный и в большинстве источников не засчитывается в квоту. Хосты фидов, чувствительные к трафику, тихо троттлят, если вы этого не делаете.
  3. Дедуплицируйте по GUID, не по URL и не по заголовку. Некоторые фиды ротируют URL (трекерские параметры меняются ежедневно), другие переиспользуют заголовки (еженедельные рекапы). Элемент <guid> — единственное, что спецификация гарантирует стабильным.
  4. Сохраняйте GUID между рестартами. Бот, который перезапустился и забыл, что уже отправил, перепостит всё текущее окно фида — обычно последние 20–50 айтемов. Подписники видят это как спам и отписываются пачками. Достаточно одной строки SQLite-таблицы.
  5. Добавьте защиту «максимальный возраст». На первом запуске постите только айтемы моложе, скажем, 24 часов. Иначе в первый день канал зальёт историческим окном и алгоритм научится подавлять ваши сообщения.
  6. Ограничьте количество айтемов на цикл. Если фид стрельнул (новостной источник после события), 200 сообщений за 30 секунд триггернут телеграмный лимит 1 сообщение/сек на канал и глобальный 30 сообщений/сек. Кэп — 5 сообщений на цикл, остальное дождётся следующего цикла.

Псевдокод цикла:

seen = load_seen_guids()  # set[str], персистентный на диск
feed = feedparser.parse(URL, modified=last_modified, etag=last_etag)
if feed.status == 304:
    return
new_items = [e for e in feed.entries if e.id not in seen and is_recent(e, hours=24)]
for item in new_items[:5]:  # запас на rate limit
    send_to_telegram(item)
    seen.add(item.id)
save_seen_guids(seen)
save_etag(feed.etag, feed.modified)

Это и весь цикл. Всё остальное — ретраи, экспоненциальный бэкофф, dead-letter — добавляется сверху.

Шаг 4 — Форматирование: энтити, превью и работа с изображениями

Дефолтный форматер RSS-в-Telegram вставляет заголовок и ссылку. Подписники такое игнорируют. Формат, который реально кликают — это заголовок + 1–3 предложения тела + превью ссылки + (где уместно) изображение.

  1. Чистите HTML из <description> / <content:encoded> перед отправкой. Берите парсер вроде bleach или html2text; никогда не парсите HTML регулярками — рано или поздно вы заэкранируете энтити не так и отправите наполовину сломанный <a>-тег в канал.
  2. Обрезайте тело до ~280 символов и добавляйте …. Длинные сообщения Telegram сворачивают превью ссылки, а именно оно обычно и цепляет глаз.
  3. Экранируйте спецсимволы MarkdownV2. Список: _*[]()~ ` >#+-=|{}.!. Пропустите один — sendMessage отдаст Bad Request: can't parse entities. Полный дебаг-гайд по этому фейлу — в спецификации MarkdownV2 от Telegram.
  4. Выберите правильный метод отправки:
    • Изображения нет, тело короткое → sendMessage с disable_web_page_preview: false. Telegram сам заберёт Open Graph и покажет карточку.
    • Тело длинное, есть изображение → sendPhoto с caption (лимит 1024 символа). Превью ссылки обрезается, зато изображение инлайн.
    • Несколько изображений на айтем → sendMediaGroup (макс. 10). Подпись крепится только к первому айтему в группе.
  5. Добавляйте маленький футер атрибуции. Что-то вроде via [Название источника](https://source.example.com) — это честно и не позволяет читателю воспринять контент как «оригинальный», что часто ведёт к жалобам. Бонус: посты перестают иметь вид метки «Переслано», которая душит охват.

Образец MarkdownV2-payload:

*Новый релиз — Postgres 18\\.0*

Postgres 18 выходит со skip\\-scan индексами и новым протоколом фейловера логической репликации\\. Wire\\-протокол совместим с libpq 17\\.

[Прочитать полный анонс](https://www.postgresql.org/docs/release/18.0/) · via [Postgres News](https://www.postgresql.org/about/newsarchive/)

Обратите внимание: каждая . , ( ) - экранирована — да, даже внутри скобок URL.

Шаг 5 — Расписание, маршрутизация и AI-дайджест

Photo by Brett Jordan on Pexels

Когда базовый пайплайн поехал, три апгрейда быстро себя окупают:

  1. Тихие часы на канал. B2B-аудитория читает Telegram в 09:00–22:00 по локальному времени. Посты в 04:00 учат подписников мутить канал. Айтемы, пришедшие ночью, надо буферить в утренний бурст в 09:00 (с кэпом на 5 — см. Шаг 3).
  2. Роутинг по каналам по тематике. Если синдицируете один фид в несколько ниш, маршрутизируйте по тегу категории — никогда не лейте одинаковые айтемы везде. Audience-overlap аудит важнее количества айтемов.
  3. AI-перепись. Прогоняйте каждый айтем через модель с компактным промптом — «Подытожь в 2 предложениях, начни с конкретного факта, не с рамки». Выход короче, читабельнее и не несёт характерного «синдицированного» духа. Держите отдельный счёт расходов на перепись, чтобы знать реальную экономику на айтем.

Autogram закрывает шаги 1–5 нативно без воркера. Вы вставляете URL фида, выбираете канал (или несколько), переключаете режим bare forward ↔ AI rewrite, задаёте окна публикаций — а платформа уже сама опрашивает, дедуплицирует, экранирует MarkdownV2, делает фолбеки на изображения и шлёт с учётом rate-limit. Та же примитива планирования, что тащит ручной контент, прогоняет RSS-айтемы через ту же очередь публикаций — нет двух cadence-движков, которые надо держать в голове. Внутренний пайплайн опрашивает каждый фид и дедуплицирует по GUID, так что всплеск никогда не задвоит посты, и доставляет не более одного нового айтема за запланированный запуск на канал, чтобы оставаться внутри per-chat envelope Telegram.

Если вы хотите держать воркер сами — псевдокод из Шага 3 плюс правила Шага 4 дают паритет за выходные. Смысл гайда — чтобы вы знали, какой именно обмен делаете.

Частые ошибки

  • Без дедупликации по GUID. Перепостит всё окно фида после каждого рестарта. Лекарство: персистентный сет увиденных GUID.
  • Опрос раз в минуту для фида «раз в день». Жжёт 1400 бесполезных опросов в день — самый быстрый способ получить IP-бан от источника. Лекарство: cadence — половина медианного интервала публикаций.
  • Пропуск экранирования MarkdownV2. sendMessage молча возвращает 400 в скриптах, которые не проверяют ответ, так что канал просто стихнет. Лекарство: экранировать всегда и ассертить ok: true.
  • Постинг изображений по URL без проверки размера. Telegram кэпит sendPhoto на 5 MB по URL (лимит 10 MB действует только при загрузке через multipart). Больше — Bad Request: file is too big. Лекарство: HEAD-запрос, фолбек на sendMessage с превью ссылки, если сверх лимита.
  • Забыть per-channel rate limit на бурстовых фидах. Фид, который скинул 50 айтемов за минуту (новостной источник после события), на 31-м триггернёт 429 RetryAfter и тихо потеряет остальное. Лекарство: cap-per-cycle + очередь + ретрай по RetryAfter.

Связанное чтение

FAQ

Какой интервал опроса правильный для Telegram RSS-бота?

Половина медианного интервала публикаций фида, с полом в 60 секунд и потолком в 24 часа. Блог, который пишет дважды в неделю — раз в 6–12 часов; новостная лента с 200 айтемами в день — раз в 2–5 минут. Всегда парьте с условным GET (If-Modified-Since / If-None-Match), чтобы неизменные опросы возвращались 304 и не съедали квоту.

Можно ли слать RSS-айтемы как фото в Telegram?

Да — используйте sendPhoto, когда у айтема есть пригодное изображение (до 5 MB по URL — или до 10 MB при multipart-загрузке, JPEG или PNG, ландшафтная ориентация читается лучше всего). Для нескольких изображений — sendMediaGroup шлёт до 10 в одном пакете. Если изображения нет или оно большое, фолбек на sendMessage с disable_web_page_preview: false — и пусть Open Graph фетчер Telegram рисует превью.

Как дедуплицировать RSS-айтемы, чтобы не постить одну и ту же статью дважды?

Сохраняйте сет увиденных <guid> (или Atom <id>) на диск или в key-value store и проверяйте belonging перед каждой отправкой. Не дедуплицируйте по URL или заголовку — фиды ротируют трекерские параметры и переиспользуют заголовки в еженедельных рекапах. На каждом рестарте перезагружайте сет; без персистентности вы снова отправите всё окно фида в следующий раз, когда воркер перезапустится.

Можно ли добавить AI-суммаризацию к Telegram RSS-боту?

Да, и для высокообъёмных фидов это обычно окупается. Прогоняйте тело каждого айтема через модель с узким промптом «Два предложения. Начни с конкретного факта, не с рамки» и шлите перепись вместо сырого описания. Следите за стоимостью на айтем — на 100 айтемах в день дешёвая модель — это несколько долларов в месяц; дорогая — несколько сотен.

Почему мой Telegram RSS-бот после рестарта снова шлёт дубли?

Потому что сет увиденных GUID живёт в памяти и чистится при рестарте. Перенесите его на диск (SQLite, плоский JSON, Redis — что-нибудь персистентное) и загружайте при старте. Заодно сохраните ETag и Last-Modified с последнего успешного опроса — чтобы трюк с условным GET тоже пережил рестарты.

Мне нужен сервер под воркер для RSS-в-Telegram, или есть no-code вариант?

Работают оба пути. No-code (IFTTT, Zapier, Make, n8n или управляемый инструмент типа Autogram) выводит в прод за 5–30 минут без сервера; нативный бот-воркер — больше времени на настройку, зато полный контроль и ниже стоимость на айтем на масштабе. Решение в основном зависит от количества фидов и того, насколько кастомное форматирование нужно — см. таблицу в Шаге 2.

Итог

Автоматизация в Autogram. Подключите первый канал и получите 7 дней доступа к Solo с AI-бюджетом $1. Банковская карта не нужна.

Image credits

#автопостинг rss telegram#rss в telegram канал#telegram rss бот#telegram bot api#rss автоматизация telegram#rss to telegram

Подпишитесь на рассылку

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

Или подпишитесь на наш Telegram-канал