Telegram-агрегатор новостей в n8n
Telegram удобно использовать не только как площадку для публикации постов, но и как собственную медиа-систему.
Здесь нет классической рекомендательной ленты, которая решает, кому показать публикацию. Человек подписался на канал — и получил сообщение. Поэтому основная задача автора не в том, чтобы подстроиться под алгоритмы, а в том, чтобы регулярно находить действительно полезную информацию и превращать её в понятный контент.
В этом материале разберём, как собрать такую систему в n8n:
Главное — не пытаться сразу построить полностью автономного бота, который сам ищет, сам пишет и сам публикует всё подряд. Сначала нужно собрать управляемый процесс.
С чего начать: не с n8n, а с задачи
Одна из самых частых ошибок — открыть n8n и сразу начинать соединять ноды.
В результате получается workflow, который умеет что-то делать, но непонятно зачем. Он собирает новости, генерирует тексты, отправляет сообщения, однако не решает конкретную задачу канала.
Перед сборкой нужно ответить на несколько вопросов:
- Для кого канал?
- Какая у него тема?
- Что именно мы публикуем?
- Какие источники считаем полезными?
- Как часто проверяем новости?
- Нужно ли переписывать каждую новость?
- Где храним материалы?
- Кто принимает решение о публикации?
- Что происходит, если источник не отвечает или AI выдал плохой текст?
Канал для специалистов, которые следят за ИИ-инструментами. Каждый час система проверяет 10 RSS-лент, 5 Telegram-каналов и несколько источников в X. AI отбирает новости, связанные с генерацией контента и автоматизацией, переписывает их в коротком формате и сохраняет в Google Sheets. Публикация происходит только после ручного одобрения.
Это уже нормальное техническое задание.
Зачем нужен PRD
PRD (Product Requirements Document) — это описание того, что должна делать система.
Он особенно полезен, если вы собираете workflow через AI или используете вайб-кодинг. Когда дать агенту только два предложения, он часто создаёт несколько нод и считает задачу выполненной. Если сначала описать цель, логику, данные и ограничения, результат получается намного ближе к рабочему.
Минимальный PRD для новостного агрегатора может выглядеть так:
Собирать новости из заданных источников, отбирать релевантные публикации и готовить их к публикации в Telegram-канале.
- RSS-ленты
- Публичные Telegram-каналы
- X/Twitter через Apify или другой парсер
- Google News и другие новостные источники
1. Проверять источники каждый час.
2. Приводить все публикации к единому формату.
3. Проверять наличие дубля.
4. Определять актуальность и релевантность.
5. Переписывать подходящие новости.
6. Сохранять результат в таблицу.
7. Отправлять на ручное одобрение.
8. Публиковать только записи со статусом approved.
- uniqueId
- title
- content
- source
- url
- publishedAt
- summary
- category
- relevanceScore
- status
- telegramMessageId
- error
new → reviewed → approved → published
- не выдумывать факты;
- не публиковать дубли;
- не отправлять посты длиннее лимита Telegram;
- при ошибке источника сохранять ошибку и переходить к следующему источнику.
Такой документ можно использовать и как основу для n8n-workflow, и как запрос для AI-агента, который помогает собрать систему.
Два контура одной контент-машины
Агрегатор может быть создан из двух контуров.
- по расписанию запускается workflow;
- система обращается к источникам;
- собирает новые публикации;
- сохраняет их в общий корпус;
- проверяет, не встречалась ли новость раньше.
Вторая часть — создание контента:
- выбираются новые материалы;
- AI анализирует их;
- отбрасывает нерелевантные публикации;
- делает краткое резюме;
- переписывает новость в стиле канала;
- сохраняет готовый текст;
- передаёт его на проверку или публикацию.
Такое разделение помогает не отправлять в большую языковую модель огромный массив необработанных данных.
Если каждый час передавать агенту все новости целиком, быстро появятся три проблемы:
- увеличится стоимость обработки;
- часть контекста будет теряться;
- модель начнёт путать разные публикации между собой.
Поэтому лучше сначала собирать материалы, потом быстро классифицировать и суммаризировать их, а уже после этого писать финальный пост.
Какие источники подключать
RSS
RSS — самый простой и стабильный вариант.
Для RSS достаточно получить ленту, разобрать заголовок, описание, ссылку и дату публикации. В n8n для этого можно использовать ноду Read RSS Feed.
Telegram-каналы
Можно отслеживать публичные Telegram-каналы и использовать их как источники новостей.
Можно использовать связку AI Agent + MCP-инструмент Apify. Агент получает название или ссылку на канал, сам выбирает подходящий скрапер и возвращает найденные публикации.
Это удобно, но у такого подхода есть ограничения:
- результат зависит от выбранного парсера;
- данные могут приходить с задержкой;
- агент может выбрать не самый подходящий инструмент;
- не каждый канал обновлялся сегодня;
- парсер иногда возвращает больше сообщений, чем нужно;
- доступность и стоимость API могут меняться.
Поэтому список источников лучше хранить в отдельной таблице, а не каждый раз придумывать его внутри промпта.
Можно выбирать только активные источники, затем они распределяются по веткам через Switch.
Не стоит начинать с команды «найди все релевантные каналы». Лучше самостоятельно выбрать 5–10 источников и понять, какие из них действительно дают полезные новости.
Особенно интересны небольшие нишевые каналы, которые публикуют информацию раньше крупных агрегаторов. Но каждую новость всё равно нужно проверять: ранняя публикация не означает, что информация достоверна.
X/Twitter
X полезен для мониторинга трендов и ранних сигналов, но прямое API может быть платным или требовать отдельного доступа.
Если агент регулярно возвращает пустой результат, сначала нужно проверить дату. Вы можете просто запрашивать посты «после текущего момента», хотя нужные публикации были несколько часов назад.
Для таких источников лучше формулировать запросы вроде:
Найди публикации из источника с начала текущей недели.
Верни только посты, опубликованные после последней успешной проверки.
Нормализация и защита от дублей
Публикации из разных источников приходят в разном формате. В одном случае поле называется `title`, в другом — `name`, в третьем вообще есть только текст и ссылка.
Перед AI-анализом их нужно привести к единой структуре.
В Code node можно использовать такой вариант:
const clean = (value) => String(value ?? '').trim();
return $input.all().map((item) => {
const data = item.json;
const title = clean(data.title || data.name);
const content = clean(data.content || data.description || data.text);
const url = clean(data.url || data.link);
const normalizedUrl = url
.split('#')[0]
.replace(/\/$/, '');
const uniqueId = normalizedUrl ||
[
clean(data.source),
clean(data.publishedAt),
title,
content.slice(0, 120)
].join('|').toLowerCase();
return {
json: {
...data,
title,
content,
url: normalizedUrl,
uniqueId,
status: 'new'
}
};
});
После этого `uniqueId` используется для проверки в Data Table или Google Sheets.
Для RSS основным идентификатором обычно является ссылка. Если ссылка уже есть в таблице, запись не нужно добавлять заново.
Для Telegram-постов можно использовать комбинацию:
telegram:@ai_news_channel:15482
Проверку дублей можно сделать через совпадение URL или пары URL + post_id. Это хороший подход, если workflow запускается каждый час или чаще.
AI-фильтр перед рерайтом
Не каждую найденную публикацию нужно превращать в пост.
Сначала лучше попросить AI оценить новость:
Ты редактор тематического Telegram-канала.
Проанализируй публикацию и верни JSON:
{
"relevant": true,
"relevanceScore": 0,
"category": "",
"shortSummary": "",
"reason": ""
}
- relevant — true только если новость подходит аудитории канала;
- relevanceScore — число от 0 до 100;
- shortSummary — одно-два предложения;
- не добавляй факты, которых нет в исходном тексте;
- если публикация рекламная, повторная или слишком слабая,
поставь relevant=false.
```
relevant is true
AND relevanceScore >= 70
Только после этого материал отправляется в дорогой рерайт.
Если новость очень длинная, её можно сначала разделить на части с помощью ноды Summarization. Но чаще дешевле сделать короткое резюме каждой публикации сразу после получения.
Промпт для рерайта
Вот вам довольно практичная редакторская логика:
- короткий заголовок;
- 1–3 абзаца;
- понятный язык;
- сохранение фактов;
- отсутствие кликбейта;
- один релевантный хештег.
Ты редактор Telegram-канала о технологиях и ИИ.
Перепиши новость на русском языке.
1. Заголовок — короткий, до 8 слов.
2. Заголовок верни в поле headline.
3. Основной текст — 90–150 слов.
4. Если новость сложная, допустимо до 200 слов.
5. Сохрани: кто, что сделал, когда, где и почему это важно.
6. Не выдумывай факты и не усиливай формулировки.
7. Не используй кликбейт.
8. Добавь 1–3 уместных эмодзи.
9. В конце добавь один тематический хештег.
10. Не добавляй ссылку, если её нет во входных данных.
11. Ориентируйся на стиль последних опубликованных постов.
{
"headline": "",
"body": "",
"hashtag": ""
}
Последние три опубликованных сообщения полезно передавать в этот промпт как примеры. Это помогает сохранить консистентность канала: одинаковую длину, ритм, структуру и уровень подробности.
Подготовка текста для Telegram
Если использовать HTML-разметку Telegram, лучше не отправлять в API необработанный текст от AI.
Сначала можно собрать итоговое сообщение в Code node:
const escapeHtml = (value) => {
return String(value ?? '')
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>');
};
const headline = escapeHtml($json.headline);
const body = escapeHtml($json.body);
const hashtag = String($json.hashtag ?? '')
.replace(/[^#A-Za-zА-Яа-яЁё0-9_]/g, '');
const telegramText = [
`<b>${headline}</b>`,
'',
body,
hashtag ? `\n${hashtag}` : ''
].join('\n');
return [{
json: {
...$json,
telegramText
}
}];
Теперь в Telegram можно передавать поле `telegramText`.
Публикация через Telegram Bot API
Создаем ноду отправки поста в Telegram.
В n8n это можно сделать через HTTP Request:
URL:https://api.telegram.org/bot{{$env.TELEGRAM_BOT_TOKEN}}/sendMessage
Body Content Type: `JSON`{
"chat_id": "{{$env.TELEGRAM_CHANNEL_ID}}",
"text": "{{$json.telegramText}}",
"parse_mode": "HTML",
"disable_web_page_preview": true
}
Бота нужно добавить в канал и выдать ему права администратора.
Токены и идентификаторы не стоит вставлять прямо в код. Используйте credentials n8n или переменные окружения.
После успешной отправки сохраните в таблицу:
- `status = published`;
- дату публикации;
- `telegramMessageId`;
- ссылку на источник;
- текст, который был отправлен.
Если публикация завершилась ошибкой, сохраните:status = error
error = сообщение об ошибке
Так вы сможете повторить отправку, не собирая новость заново.
Почему нужна ручная проверка
Автоматическая публикация выглядит заманчиво, но на старте лучше оставить контроль у человека.
В таблице достаточно сделать поле `status`:
new → reviewed → approved → published
Workflow может запускаться каждые 5–10 минут и выбирать только записи:status = approved
После публикации он меняет статус на `published`.
- убрать слабую новость;
- поправить формулировку;
- изменить заголовок;
- добавить собственный комментарий;
- проверить источник;
- не опубликовать ошибочный или спорный материал.
Такая схема особенно важна для новостных каналов.
AI может хорошо переписать текст, но он не отвечает за репутацию канала.
Бот и канал — это разные элементы
Канал хорошо работает как медиа-площадка, но напрямую взаимодействовать с читателем через него неудобно.
Связка выглядит так:Канал → публикации и охват
Бот → команды, заявки, подписка, оплата, рассылки
- принимать команды;
- отвечать на вопросы;
- собирать заявки;
- проверять подписку на канал;
- запускать реферальную программу;
- отправлять материалы;
- принимать оплату;
- транскрибировать голосовые сообщения;
- создавать тикеты поддержки.
Можно использовать через команду `/start` с реферальным кодом:
const message = $json.message || {};
const text = message.text || '';
if (!text.startsWith('/start')) {
return [];
}
const parts = text.split(' ');
const refCode = parts[1]?.startsWith('ref_')
? parts[1]
: null;
const referrerId = refCode
? refCode.replace('ref_', '')
: null;
return [{
json: {
userId: message.from?.id,
chatId: message.chat?.id,
username: message.from?.username || '',
firstName: message.from?.first_name || '',
refCode,
referrerId,
isReferral: Boolean(referrerId),
myRefLink: https://t.me/YOUR_BOT_USERNAME?start=ref_${message.from?.id},
timestamp: new Date().toISOString()
}
}];
Дальше можно проверить через Telegram API, подписан ли пользователь на канал, записать пользователя в Google Sheets или базу данных и посчитать рефералов.
Для обработки разных типов сообщений в n8n используется Switch:
- обычное текстовое сообщение;
- команда;
- callback после нажатия кнопки;
- фото;
- файл;
- voice;
- платёж;
- системное событие.
Для голосовых сообщений можно добавить транскрибацию через Whisper или другую модель распознавания речи.
Где здесь ComfyUI и fal.ai
Telegram-агрегатор может работать только с текстом. Но если канал публикует обзоры, карточки или короткие видео, к системе можно добавить генерацию визуального контента.
В общей контент-машине n8n выступает как координатор:
fal.ai удобен, когда нужен готовый API и упакованные workflows. ComfyUI даёт больше контроля, но требует понимания моделей, нод и окружения. Его можно запускать локально при наличии видеокарты или использовать облачный GPU.
Для добавления текста, субтитров и надписей можно использовать:
На практике n8n лучше оставить управляющим слоем, а генерацию видео и изображений вынести в отдельные блоки.
Не обязательно генерировать картинку к каждому посту. Сначала стоит проверить, нужен ли этот формат аудитории. Иногда хороший текст, ссылка и один понятный визуальный элемент работают лучше, чем полностью сгенерированная карточка.
Что даёт вайб-кодинг
Вайб-кодинг полезен, когда уже понятно, что именно нужно собрать.
Например, можно дать AI такой запрос:
Задача:
каждый час проверять список RSS и Telegram-источников,
убирать дубли, оценивать релевантность новостей,
переписывать подходящие публикации и сохранять их
в Google Sheets со статусом new.
Добавь:
- обработку ошибок;
- проверку даты публикации;
- фильтр по relevanceScore;
- поля для ручного одобрения;
- отдельный workflow для публикации записей со статусом approved.
Через вайбкодинг можно добавить интеграции, подключить базу данных, создать интерфейс и исправлять ошибки по команде «пойми, почему не работает». Это ускоряет разработку, но не отменяет тестирования.
После генерации нужно проверить:
- все ли credentials подключены;
- заполнены ли ID таблиц и каналов;
- не остались ли `YOUR_*` и тестовые значения;
- правильно ли указаны даты;
- не пустая ли таблица источников;
- есть ли ветка публикации в Telegram;
- что происходит при ошибке API;
- не отправляется ли один и тот же пост несколько раз.
Самый надёжный подход — запускать workflow по частям:
1. один RSS-источник;
2. нормализация;
3. проверка дубля;
4. AI-фильтр;
5. рерайт;
6. запись в таблицу;
7. ручная публикация;
8. автоматическая публикация после проверки.
Частые ошибки
Подключить слишком много источников
Большой список не означает качественный контент.
Начните с нескольких источников и посмотрите:
- сколько новостей они дают;
- сколько из них реально подходят;
- сколько дублей появляется;
- какие источники чаще ошибаются.
Отправлять весь контент одному агенту
Большой корпус быстро увеличивает стоимость и ухудшает качество.
Лучше использовать несколько этапов:
Сбор → короткое резюме → фильтр → финальный рерайт
Не сохранять историю
Если не хранить обработанные новости, система будет каждый раз собирать одно и то же.
Нужна таблица или база с уникальным идентификатором и статусом обработки.
Не учитывать стиль канала
Если каждый пост генерируется с нуля, канал начинает выглядеть так, будто его ведут разные авторы.
Передавайте AI несколько последних публикаций или заранее опишите:
Полностью довериться агенту
AI Agent может сам выбрать инструмент, но иногда выбирает неподходящий скрапер или возвращает устаревшие данные.
Для критичных источников лучше явно указать, какой API или парсер нужно использовать.
Сразу включить автопубликацию
На старте это почти всегда приводит к ошибкам, дублям и странным формулировкам.
Сначала соберите очередь постов и несколько дней проверяйте её вручную.
Как запустить первую версию
1. Выберите одну узкую тему.
2. Опишите читателя и тип публикаций.
3. Составьте PRD на одну страницу.
4. Создайте Telegram-канал и бота.
5. Добавьте бота администратором.
6. Создайте таблицу источников и материалов.
7. Добавьте 3–5 RSS-лент.
8. Импортируйте workflow в n8n.
9. Заполните credentials, ID таблиц и канала.
10. Проверьте один источник вручную.
11. Добавьте проверку дублей.
12. Подключите AI-фильтр и рерайт.
13. Настройте статус `approved`.
14. Добавьте публикацию через Telegram Bot API.
15. Опубликуйте первые 5–10 постов вручную.
16. Только после этого включайте расписание.
Через несколько дней появится статистика: какие источники дают лучшие материалы, какие темы получают реакции и какие форматы стоит оставить.
Что можно монетизировать
Telegram-канал может зарабатывать через:
- рекламные размещения;
- платную подписку;
- закрытое сообщество;
- партнёрские ссылки;
- собственные услуги и продукты;
- ботов и мини-приложения;
- платный доступ к аналитике или подборкам.
Но монетизация начинается не с количества автоматизаций. Сначала нужен понятный канал с определённой аудиторией и регулярной пользой.
Контент-машина нужна для того, чтобы уменьшить ручную рутину: собрать информацию, убрать повторы, подготовить черновик и вовремя показать его автору.
Финальное решение о том, что именно увидит аудитория, всё равно должно оставаться у человека.
Проектирую и собираю контент-системы под бизнес-задачи.
На канале: разборы, наблюдения и практика из реальных проектов.
Обсудить дела:
TG: https://t.me/safronistika
Вконтакте: https://vk.com/safronovantony
YouTube: https://www.youtube.com/@safronistika