💡 Автоматический сбор и отбор топ-новостей через n8n и GPT: инструкция за 15 минут для телеграмм канала
Финальная структура бота: от RSS-источников до Telegram через AI-агентов
1. Добавление триггера запуска
Начинаем с установки стартовой ноды — “When clicking ‘Execute workflow’”.
Эта нода позволяет вручную запускать сценарий при клике по кнопке Execute workflow.
Идеально подходит для тестов и ручного запуска в процессе настройки.
В конце мы ее поменяем 📌
--------------------------------------------------------------------------
2) Добавляем RSS Read и находим ленты через ИИ и группируем в Merge Ноде
🧩 Зачем
RSS Read подтягивает свежие статьи из ленты сайта и отдаёт их как JSON (title, link, pubDate, snippet).
🛠 Как добавить
Add node → RSS Feed Read → URL вставляем адрес ленты → подключаем к триггеру. Повтори для 6–8 источников.
🤖 Где взять URL под вашу нишу
Самый быстрый способ — спросить у GPT/Gemini можно использовать deepreserch для более глубокого поиска.
Сформулируй запрос и вставь готовые ссылки в ноды.
«Подбери 7–10 актуальных RSS-лент по нише маркетинга (или моей нише). Дай прямые RSS-URL.»
✅ Проверка
Нажми Execute на ноде: должны прийти записи. Если пусто — замени ленту на другую из списка.
Готово — переходим к объединению через Merge (append).
🧩 Зачем
Нужно получить один общий список новостей из всех RSS-нод. Режим append просто складывает записи подряд, не сравнивая поля (а у разных лент они могут отличаться). Так дальше — фильтрация/код/ИИ — работают с одним массивом.
- Добавь ноду Merge → в Mode выбери Append.
- Подключи выходы всех
RSS Readк входамMerge. - (Опционально) Укажи количество входов (7–10).
------------------------------------------------------------------------------------
3) Две ноды Code: фильтрация и упаковка данных
🖼️Code → Filter & Deduplicate
- Оставляет только свежие записи (за последние 24 часа).
- Удаляет дубликаты по
link, даже если они пришли из разных источников. - Чистит HTML-шум из описаний, приводит текст к читаемому виду.
- На выходе даёт очищенный список новостей (количество может уменьшиться — это нормально).
- Дальше подключаем выход этой ноды ко второй ноде
Code.
// Фильтрация и дедупликация новостей
const items = $input.all();
const now = new Date();
const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000);
// Убираем дубликаты и фильтруем по времени
const uniqueNews = [];
const seenUrls = new Set();
for (const item of items) {
const data = item.json;
// Проверяем дату публикации
const pubDate = new Date(data.pubDate || data.isoDate);
if (pubDate < yesterday) continue;
// Проверяем на дубликаты
if (seenUrls.has(data.link)) continue;
seenUrls.add(data.link);
// Берем все доступные поля контента
const rssContent = data['content:encodedSnippet'] || data.content || data.contentSnippet || data.summary || '';
// Очищаем RSS контент от HTML
const cleanRssContent = rssContent
.replace(/<[^>]*>/g, '')
.replace(/&[^;]+;/g, '')
.replace(/\s+/g, ' ')
.trim();
// Создаем новый объект, теперь с сохранением contentSnippet
uniqueNews.push({
title: data.title,
link: data.link,
rssContent: cleanRssContent,
contentSnippet: data.contentSnippet, // Сохраняем оригинальный contentSnippet
pubDate: data.pubDate,
source: data['dc:creator'] || data.meta?.title || 'Unknown',
guid: data.guid
});
}
console.log(`Filtered ${uniqueNews.length} unique news from ${items.length} total`);
return uniqueNews.map(item => ({ json: item }));🖼️— Code → Упаковка в единый объект data
🖼️— Code → Упаковка в единый объект data
- Берёт все элементы из предыдущего шага и упаковывает их в один объект с полем
data. - Это нужно, чтобы следующий AI-агент получил единый массив новостей через
{{ JSON.stringify($json.data, null, 2) }}.
// 1. Получаем все входящие элементы в виде массива
const allItems = $input.all();
// 2. Из каждого элемента забираем только его 'json' часть (саму новость)
// и складываем в новый массив.
const newsArray = allItems.map(item => item.json);
// 3. Возвращаем ОДИН-ЕДИНСТВЕННЫЙ новый элемент.
// У этого элемента будет поле 'data', которое содержит массив всех новостей.
// Имя 'data' важно, так как оно используется в промте: {{$json.data}}
return [{
json: {
data: newsArray
}
}];⚠️ Если новостей мало
Если после фильтрации записей выходит 1–3 вместо ожидаемых 5–10, значит источники публикуют редко.
Решение: вернись в GPT/Gemini и попроси подобрать 7–10 актуальных RSS-лент под твою нишу (маркетинг/HR/финансы и т.д.), затем замени/добавь их в блоки RSS Read.
Готово. Следующий шаг — AI Agent1 для отбора топ-5.
Так же после каждой итерации нажимайте на Execute Step Чтобы проверить логику в работе
-----------------------------------------------------------------------------------------
4) Два AI-агента: отбор топ-5 → оформление дайджеста
🧠 AI Agent (аналитик: отбор топ-5)
Вход: {{ JSON.stringify($json.data, null, 2) }} — единый массив новостей из предыдущей ноды Code.
- Просматривает весь массив (например, 8–15 записей).
- Оценивает важность по критериям (платформы/бюджеты, инструменты/технологии, стратегии/тренды, регулирование/данные).
- Отбирает 5 лучших материалов по значимости и качеству источника.
- Возвращает JSON-массив из 5 выбранных новостей.
Как адаптировать под свою нишу (обязательно):
Открой этот AI Agent → скопируй prompt целиком.
Ты — ведущий аналитик в топовом IT-издании (как TechCrunch). Твоя специализация — выявление самых значимых и влиятельных событий в мире AI.
Твоя задача — проанализировать предоставленный массив новостных статей и идентифицировать **10 самых главных *событий* или *тем* дня**. Для каждого из 10 выбранных событий ты должен выбрать **одну, самую лучшую и информативную статью**, которая его освещает.
**Строго следуй этому процессу:**
1. **Анализ:** Прочитай все статьи, чтобы составить полный список уникальных событий и тем дня.
2. **Оценка:** Оцени важность каждого события, используя приведенные ниже критерии.
3. **Отбор:** Выбери 10 самых важных событий.
4. **Выбор лучшей статьи:** Для каждого из 10 событий, если его освещают несколько статей, выбери ту, которая является наиболее полной и исходит от самого авторитетного источника.
**Критерии для оценки важности события (в порядке убывания приоритета):**
1. **Финансы и бизнес:**
* Крупные сделки, слияния и поглощения (M&A).
* Крупные раунды финансирования (особенно более $20 млн).
* Заключение стратегических контрактов на большие суммы (например, Tesla и Samsung).
2. **Продукты и технологии:**
* Запуск новых прорывных продуктов, моделей или платформ от лидеров рынка (Google, OpenAI, Anthropic, Microsoft, Apple, Meta, NVIDIA).
* Значительные обновления, влияющие на разработчиков: изменение API, цен, лимитов использования (как новость про лимиты Claude).
* Важные запуски от других ключевых игроков в своих нишах (например, Runway в видео, Perplexity в поиске).
3. **Политика и Регулирование:**
* Новости о новых государственных регуляциях, законах или санкциях, напрямую влияющих на AI-индустрию.
4. **Научные прорывы:**
* Публикация исследований или state-of-the-art моделей, которые устанавливают новый стандарт в отрасли.
**Формат вывода:**
Твой ответ должен быть **ТОЛЬКО** валидным JSON-массивом, содержащим полные объекты 10 выбранных тобой новостей (по одной на каждое событие). Не добавляй никаких объяснений, комментариев или текста до или после JSON-массива.
-— **Входные данные (массив новостей):**
{{ JSON.stringify($json.data, null, 2) }}Подключение: выход AI Agent → вход следующего агента.
📝 AI Agent1 (редактор: форматирование для Telegram)
Вход: JSON с 5 отобранными новостями от первого агента.
- Переводит заголовки на русский.
- Пишет выжимку 3–5 предложений с акцентом на главной идее.
- Приводит дату к виду «ДД месяца ГГГГ, ЧЧ:ММ».
- Собирает итог в чистый HTML, совместимый с Telegram (только теги
<b>,<u>,<a>,<code>; без Markdown). - На выходе — готовый текст дайджеста для отправки.
Замечание: по умолчанию настроен под SMM-редактор/AI. Вам нужно здесь заменить под свою нишу.
Ты — SMM-редактор и автор ведущего Telegram-канала об маркетинг. Твоя задача — создать увлекательный, стильный и удобный для чтения дайджест, используя для форматирования исключительно HTML-теги, совместимые с Telegram.
**ГЛАВНОЕ ПРАВИЛО: КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО использовать любую Markdown-разметку (символы **, _, `, []()). Всё форматирование, особенно выделение жирным, должно быть сделано ТОЛЬКО с помощью HTML-тега <b>. Это самое важное правило.**
**Остальные правила:**
1. **Обработай каждую новость:** Последовательно пройдись по каждому объекту в предоставленном JSON-массиве.
2. **Подробная суть с акцентами:** Напиши содержательную выжимку на 3-5 предложений. Внутри этого текста выдели тегом <b> **ключевую концепцию новости** — как правило, это название продукта, технологии или суть главного анонса. Старайся выделять фразу в **начале** текста.
3. **Безупречное HTML-форматирование:**
* Заголовок новости (из поля `title`) **обязательно переведи на русский язык и сделай его жирным и подчеркнутым**, обернув в теги `<b>` и `<u>`.
* Дату публикации (`pubDate`) приведи к простому формату "ДД месяца ГГГГ, ЧЧ:ММ" и оберни в тег `<code>`.
* Ссылку на источник (`link`) оформи в виде HTML-гиперссылки `<a href="URL">Читать подробнее</a>`.
4. **Структура и разделители:**
* Выведи новости в виде нумерованного списка.
* Четко разделяй каждую новость в списке двумя переносами строки (`\n\n`).
* Строго следуй примеру структуры.
**Пример желаемой структуры для ОДНОЙ новости:**
1. 📰 **<b><u>[Здесь ПЕРЕВЕДЕННЫЙ на русский заголовок]</u></b>**
📝 [Здесь подробная выжимка на русском, где <b>ключевая фраза новости</b> выделена жирным.]
📅 `<code>28 июля 2025, 15:29</code>`
🔗 <a href="https://example.com/news-article-url">Читать подробнее</a>
---
**Входные данные (массив новостей):**
{{ $json.output }}Подключение: выход AI Agent → вход AI Agent1 .
- ---------------------------------------------------------------------------------------
5) ✂️ Нода Code — разрезаем длинный текст под лимит Telegram
- Берёт итоговый текст из предыдущего AI-агента (
$json.output). - Делит его на куски ≤ 4096 символов — это лимит одного сообщения в Telegram.
- Ставит «умные» разрывы: сначала ищет двойной перенос
\n\n, потом обычный\n, и только если ничего не нашёл — режет «по живому». - Возвращает массив объектов вида
{ text: "<кусок>" }— каждый пойдёт отдельным сообщением дальше по цепочке.
Код для ноды код скопируй как есть
// Получаем длинный текст из предыдущего узла (AI-агента)
const longText = $json.output;
// Устанавливаем максимальную длину сообщения в Telegram
const maxLength = 4096;
// Место, где мы будем хранить готовые куски сообщения
const chunks = [];
let remainingText = longText;
// Запускаем цикл, который будет работать, пока не "нарежем" весь текст
while (remainingText.length > 0) {
// Если оставшийся текст уже помещается в одно сообщение, просто добавляем его и выходим
if (remainingText.length <= maxLength) {
chunks.push(remainingText);
break;
}
// Если текст слишком длинный, ищем последнее "красивое" место для разрыва
// (двойной перенос строки) в пределах лимита
let splitAt = remainingText.lastIndexOf('\n\n', maxLength);
// Если не нашли двойного переноса (например, одна новость сама по себе > 4096 символов),
// то просто ищем последний перенос строки
if (splitAt === -1) {
splitAt = remainingText.lastIndexOf('\n', maxLength);
}
// Если даже обычного переноса не нашли, режем "по живому", чтобы избежать бесконечного цикла
if (splitAt === -1) {
splitAt = maxLength;
}
// "Откусываем" кусок и добавляем его в наш массив
chunks.push(remainingText.substring(0, splitAt));
// Обновляем оставшийся текст
remainingText = remainingText.substring(splitAt).trim();
}
// На выходе мы получаем массив из нескольких элементов,
// каждый из которых содержит кусок текста для отправки.
// Мы должны вернуть их в формате, который n8n сможет обработать по одному.
return chunks.map(chunk => ({
json: {
// Узел Telegram по умолчанию ищет текст в поле 'text'.
// Мы сразу кладем наш кусок в это поле.
text: chunk
}
}));Как подключить
AI Agent1 (форматирование) → Code (разрезка) → Telegram
- Если одна новость сама длиннее 4096, она тоже корректно будет разбита на несколько сообщений.
- Код уже учитывает тримминг, чтобы не было лишних пробелов в начале/конце сообщений.
6) 📤 Нода Telegram — Send a text message — отправляем в канал
- Получает массив
{ text }и отправляет каждую часть отдельным сообщением в указанный канал/чат. - Поле parse_mode: HTML — важно, потому что форматирование идёт HTML-тегами (
<b>,<u>,<a>,<code>).
- chatId: укажи
@usernameканала или числовой ID чата. - В additionalFields оставь:
- Убедись, что бот добавлен в канал и имеет права на публикацию (лучше — админ).
🔢 Как получить числовой Chat ID в Telegram через n8n
Сделаем это на чисто через Telegram Trigger в отдельном workflow — быстро и без API-ручек.
- Создайте новый Workflow → добавьте ноду Telegram Trigger.
- В ноде выберите учётку бота (те же креды, что и в
Send a text message). - Нажмите Execute Workflow (или Execute Node).
- Откройте Telegram и напишите любое сообщение этому боту:
- если нужен ID личного чата — пишите боту в личку;
- если нужен ID канала/группы — добавьте бота в канал/группу (лучше админом) и отправьте сообщение в этот канал/группу.
- Вернитесь в n8n → в Telegram Trigger появится выполненный запуск.
- Откройте Output ноды и скопируйте Chat ID (поле вроде
message.chat.id). - Вставьте это число в ноду Send a text message → chatId.
- Для каналов/супергрупп ID обычно отрицательный и начинается на
-100…. - Если триггер не ловит сообщение — проверьте, что бот добавлен туда, где вы пишете, и у него есть права.
- Один раз получили ID — можете хранить в заметке и использовать дальше в любых workflow.
Готово: теперь отправка через Send a text message пойдёт в нужный чат по числовому ID.
- 🧪 Протестируй сначала на личном чате с ботом: поставь свой
chatId, нажми Execute и проверь разметку. - ⚠️ Если сообщений слишком много, Telegram может притормозить отправку — это нормально, просто дождись завершения.
7) ⏰ Schedule Trigger — переводим бота на ежедневный авто-запуск
🧩 Зачем
Мы фильтруем новости за последние 24 часа, значит логично запускать воркфлоу раз в день.
Шаги настройки
- Удалите/отключите ноду When clicking ‘Execute workflow’.
- Добавьте ноду Schedule Trigger и подключите её ко всем
RSS Read.
- Trigger Interval:
Days - Days Between Triggers:
1 - Trigger at Hour: выберите час запуска
- Trigger at Minute:
0
После этого воркфлоу будет стартовать каждый день в выбранное время.
- Откройте Settings воркфлоу (иконка шестерёнки сверху).
- В поле Timezone укажите ваш часовой пояс (на скрине —
Europe/Moscow).
Это важно, чтобы время запуска совпадало с вашим локальным временем.
📝 Короткие подписи к скриншотам
- Скрин 1: Параметры
Schedule Trigger: ежедневный запуск в заданный час. - Скрин 2: Settings → Timezone: выставляем часовой пояс воркфлоу.
⚠️ Если после авто-запуска новостей мало: вернитесь в GPT/Gemini и попросите 7–10 актуальных RSS-лент под вашу нишу, затем добавьте/замените их в RSS Read.
✅ Финал
Спасибо, что дочитали! Надеюсь, гайд был полезен и вы уже собрали своего новостного бота. Если остались вопросы — напишите, я отвечу и дополняю статью.
Скачать/импортировать готовый workflow:
👉 https://drive.google.com/file/d/11EaojfcVJGMxPJzUt2jt-KRypRRdKk3A/view?usp=sharing
Как импортировать в n8n (коротко):
n8n → Workflows → Import from File/URL → выберите файл → Save → Activate