---
title: "RSS в Telegram через n8n: дайджест без спама | Nodbot"
source_url: "https://nodbot.ru/workflows/rss-to-telegram-news-digest/"
canonical_url: "https://nodbot.ru/workflows/rss-to-telegram-news-digest/"
language: "ru"
content_type: "WorkflowTemplate"
section: "workflows"
generated_at: "2026-05-30"
word_count_source: 935
---

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

## AI summary

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

## Best used for

Полноценный Problem/Solution-мануал для внедрения в n8n: импортировать workflow JSON, настроить API/CMS/мессенджер, выполнить production-тесты и передать решение команде.

## Table of contents

- Проблема: почему RSS-автопостинг быстро превращается в спам
- Архитектура workflow RSS → n8n → Telegram
- Конфигурация входных лент
- Фильтр тем, дедупликация GUID и Markdown
- Готовый workflow JSON
- Пошаговая настройка RSS-дайджеста
- Тесты перед production
- Production-риски Telegram-канала
- Полезные ссылки и смежные workflow
- Критерии готовности

## Key topics

- RSS to Telegram
- новостной дайджест
- GUID dedupe
- Telegram Bot API
- n8n RSS Read

## Source outline

RSS-дайджест в Telegram через n8n: фильтр новостей, дедупликация и Markdown ¶ Обновлено: 2026-05-30 AI summary: Практический сценарий RSS → Telegram через n8n: читать ленты по расписанию, отсеивать нерелевантные новости, не публиковать один GUID дважды и отправлять аккуратный digest в канал. Шаблон для внедрения Скачать workflow JSON Скачать test payload Скопировать curl Импортируйте workflow, замените credentials и прогоните тестовый payload до включения production. Содержание Проблема: почему RSS-автопостинг быстро превращается в спам Архитектура workflow RSS → n8n → Telegram Конфигурация входных лент Фильтр тем, дедупликация GUID и Markdown Готовый workflow JSON Пошаговая настройка RSS-дайджеста Тесты перед production Production-риски Telegram-канала Полезные ссылки и смежные workflow Критерии готовности Проблема: прямой RSS-автопостинг быстро засоряет Telegram-канал повторами, нерелевантными новостями и сломанной разметкой. Решение: надежный workflow читает ленты по расписанию, фильтрует темы, сохраняет GUID, собирает короткий digest и отправляет его в Telegram с контролируемым HTML/Markdown. 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-дайджеста ¶ Соберите список RSS-источников и проверьте, что они стабильно отдают XML. Настройте Telegram Bot token и добавьте бота администратором канала. Опишите include/exclude keywords и лимит новостей в одном дайджесте. Подключите durable dedupe store: Postgres, Redis или таблицу с уникальным GUID. Проверьте сообщение в тестовом канале до публикации в основной. Тесты перед 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”. Полезные ссылки и смежные workflow ¶ См. также Telegram bot с human approval , Telegram alert для ошибок , идемпотентные ключи . Официальные документы: n8n RSS Read и Telegram Bot API . Дайджест должен быть коротким, предсказуемым и без повторов по GUID. Критерии готовности ¶ Повторный GUID не публикуется второй раз. В канале нет нерелевантных тем из exclude list. Сообщение проходит Telegram parse_mode без ошибок. Есть тестовый канал и ручной override для важных выпусков. UTM-метки добавляются к ссылкам одинаково. Хотите Telegram-дайджест без спама? Nodbot настроит RSS-источники, фильтр тем, dedupe store, форматирование и режим ручного approval для вашего канала. Настроить дайджест

## Test payload

```json
{
  "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"
}
```

## Key implementation snippet

```javascript
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`
    }
  }
}];
```

## Importable workflow structure

```json
{
  "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"
}
```

## Retrieval hints

- Использовать HTML как canonical source.
- Markdown удобен для LLM-ответов, извлечения workflow-контракта, кода и чеклистов.
- Для ссылок пользователю отдавать canonical URL.
