RSS-дайджест в Telegram через n8n: фильтр новостей, дедупликация и Markdown ¶
Обновлено: 2026-05-30
Импортируйте 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.
Проблема: почему 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 не публикуется второй раз.
- В канале нет нерелевантных тем из exclude list.
- Сообщение проходит Telegram parse_mode без ошибок.
- Есть тестовый канал и ручной override для важных выпусков.
- UTM-метки добавляются к ссылкам одинаково.
Nodbot настроит RSS-источники, фильтр тем, dedupe store, форматирование и режим ручного approval для вашего канала.
Настроить дайджест