Перейти к содержанию

RSS-дайджест в Telegram через n8n: фильтр новостей, дедупликация и Markdown

Обновлено: 2026-05-30

AI summary: Практический сценарий RSS → Telegram через n8n: читать ленты по расписанию, отсеивать нерелевантные новости, не публиковать один GUID дважды и отправлять аккуратный digest в канал.
Шаблон для внедрения

Импортируйте workflow, замените credentials и прогоните тестовый payload до включения production.

Проблема: прямой RSS-автопостинг быстро засоряет Telegram-канал повторами, нерелевантными новостями и сломанной разметкой.

Решение: надежный workflow читает ленты по расписанию, фильтрует темы, сохраняет GUID, собирает короткий digest и отправляет его в Telegram с контролируемым HTML/Markdown.

Схема RSS-дайджеста в Telegram через n8n
Workflow превращает несколько RSS-лент в короткий дайджест с фильтром и dedupe.

Проблема: почему RSS-автопостинг быстро превращается в спам

RSS-лента удобна для мониторинга новостей, но прямой автопостинг в Telegram почти всегда портит канал. В ленте появляются пресс-релизы, повторы, нерелевантные темы, одинаковые GUID и длинные заголовки без контекста. Подписчик видит не дайджест, а поток мусора.

Правильный RSS to Telegram workflow через n8n должен работать как редакционный фильтр: читать несколько лент, проверять ключевые слова, исключать спам, сохранять dedupe key и отправлять короткое сообщение в Markdown/HTML.

Архитектура workflow RSS → n8n → Telegram

НодаРольЧто проверить
Schedule TriggerЗапускает workflow по расписаниючастота, часовой пояс, ночные окна
Read RSS feedsПолучает элементы лентURL, SSL, пустые ленты, дата публикации
Filter and build digestФильтрует темы и собирает сообщениеinclude/exclude keywords, длина Telegram
Check dedupe storeПроверяет GUIDхранилище вне памяти n8n
Send Telegram digestПубликует дайджестchat_id, parse_mode, web preview

Конфигурация входных лент

{
  "feeds": [
    "https://example.com/rss.xml",
    "https://example.org/feed"
  ],
  "telegram_chat_id": "-1001234567890",
  "include_keywords": [
    "n8n",
    "automation",
    "AI agent",
    "CRM"
  ],
  "exclude_keywords": [
    "casino",
    "press release",
    "giveaway"
  ],
  "max_items": 5,
  "utm_source": "telegram",
  "utm_medium": "digest",
  "utm_campaign": "rss_n8n_digest"
}

Храните конфигурацию лент отдельно от кода workflow. Так контент-менеджер сможет добавить источник или исключающее слово без редактирования нод.

Фильтр тем, дедупликация GUID и Markdown

const cfg = $json.config ?? $json;
const items = $json.items ?? [$json];
const include = (cfg.include_keywords ?? []).map(v => String(v).toLowerCase());
const exclude = (cfg.exclude_keywords ?? []).map(v => String(v).toLowerCase());
const maxItems = Number(cfg.max_items ?? 5);

const normalized = items.map(item => {
  const title = String(item.title ?? '').trim();
  const link = String(item.link ?? item.guid ?? '').trim();
  const text = `${title} ${item.contentSnippet ?? item.content ?? ''}`.toLowerCase();
  const excluded = exclude.some(word => text.includes(word));
  const included = include.length === 0 || include.some(word => text.includes(word));
  return { title, link, guid: String(item.guid ?? link), included, excluded };
}).filter(i => i.title && i.link && i.included && !i.excluded)
  .slice(0, maxItems);

if (!normalized.length) {
  return [{ json: { action: 'skip', reason: 'no_relevant_items' } }];
}

const lines = normalized.map((item, index) => {
  const safeTitle = item.title.replace(/[<>]/g, '');
  const separator = item.link.includes('?') ? '&' : '?';
  const url = `${item.link}${separator}utm_source=${cfg.utm_source ?? 'telegram'}&utm_medium=${cfg.utm_medium ?? 'digest'}&utm_campaign=${cfg.utm_campaign ?? 'rss_digest'}`;
  return `${index + 1}. <a href="${url}">${safeTitle}</a>`;
});

return [{
  json: {
    action: 'send_digest',
    dedupe_keys: normalized.map(i => `rss:${i.guid}`),
    telegram: {
      chat_id: cfg.telegram_chat_id,
      parse_mode: 'HTML',
      disable_web_page_preview: true,
      text: `<b>Дайджест автоматизации</b>

${lines.join('
')}

#n8n #automation`
    }
  }
}];
Почему используется HTML parse_mode

Telegram Markdown легко ломается на символах из заголовков. HTML parse_mode проще контролировать: достаточно удалить опасные символы и не вставлять пользовательский HTML без очистки.

Готовый workflow JSON

Скачать готовый workflow JSON Скачать тестовый payload

{
  "name": "Nodbot - RSS to Telegram digest with dedupe",
  "nodes": [
    {
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "purpose": "Запустить дайджест по расписанию"
    },
    {
      "name": "Read RSS feeds",
      "type": "n8n-nodes-base.rssFeedRead",
      "purpose": "Получить новые записи из RSS"
    },
    {
      "name": "Filter and build digest",
      "type": "n8n-nodes-base.code",
      "purpose": "Отфильтровать темы, собрать Markdown/HTML и dedupe keys"
    },
    {
      "name": "Check dedupe store",
      "type": "n8n-nodes-base.httpRequest",
      "purpose": "Не отправлять опубликованные GUID повторно"
    },
    {
      "name": "Send Telegram digest",
      "type": "n8n-nodes-base.telegram",
      "purpose": "Опубликовать аккуратный дайджест в канал"
    }
  ],
  "connections": "Schedule → RSS → Filter → Dedupe → Telegram"
}

Пошаговая настройка RSS-дайджеста

  1. Соберите список RSS-источников и проверьте, что они стабильно отдают XML.
  2. Настройте Telegram Bot token и добавьте бота администратором канала.
  3. Опишите include/exclude keywords и лимит новостей в одном дайджесте.
  4. Подключите durable dedupe store: Postgres, Redis или таблицу с уникальным GUID.
  5. Проверьте сообщение в тестовом канале до публикации в основной.

Тесты перед production

curl -X POST "https://YOUR-N8N-DOMAIN/webhook/rss-to-telegram-news-digest" \
  -H "Content-Type: application/json" \
  --data @rss-to-telegram-news-digest-payload.json

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

Production-риски Telegram-канала

  • Нет дедупликации. После рестарта workflow может отправить старые новости заново.
  • Слишком частое расписание. Канал получает поток отдельных постов вместо дайджеста.
  • Ломается parse_mode. Один символ в заголовке может сорвать всю публикацию.
  • Нерелевантные источники. Без exclude keywords в канал попадут пресс-релизы и мусор.
  • Нет ручного override. Для важных каналов нужен режим “сначала в приватный чат на approval”.

См. также Telegram bot с human approval, Telegram alert для ошибок, идемпотентные ключи. Официальные документы: n8n RSS Read и Telegram Bot API.

Карточка Telegram-дайджеста после фильтрации RSS в n8n
Дайджест должен быть коротким, предсказуемым и без повторов по GUID.

Критерии готовности

  1. Повторный GUID не публикуется второй раз.
  2. В канале нет нерелевантных тем из exclude list.
  3. Сообщение проходит Telegram parse_mode без ошибок.
  4. Есть тестовый канал и ручной override для важных выпусков.
  5. UTM-метки добавляются к ссылкам одинаково.
Хотите Telegram-дайджест без спама?

Nodbot настроит RSS-источники, фильтр тем, dedupe store, форматирование и режим ручного approval для вашего канала.

Настроить дайджест