August 3, 2025

💡 Автоматический сбор и отбор топ-новостей через n8n и GPT: инструкция за 15 минут  для телеграмм канала

Финальная структура бота: от RSS-источников до Telegram через AI-агентов

1. Добавление триггера запуска

Начинаем с установки стартовой ноды — “When clicking ‘Execute workflow’”.
Эта нода позволяет вручную запускать сценарий при клике по кнопке Execute workflow.
Идеально подходит для тестов и ручного запуска в процессе настройки.
В конце мы ее поменяем 📌

--------------------------------------------------------------------------
2) Добавляем RSS Read и находим ленты через ИИ и группируем в Merge Ноде

RSS Нода

🧩 Зачем
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).

Нода Merge

🧩 Зачем
Нужно получить один общий список новостей из всех RSS-нод. Режим append просто складывает записи подряд, не сравнивая поля (а у разных лент они могут отличаться). Так дальше — фильтрация/код/ИИ — работают с одним массивом.

🛠 Как сделать

  1. Добавь ноду Merge → в Mode выбери Append.
  2. Подключи выходы всех RSS Read к входам Merge.
  3. (Опционально) Укажи количество входов (7–10).

    ------------------------------------------------------------------------------------

3) Две ноды Code: фильтрация и упаковка данных

🖼️CodeFilter & 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) }}

  1. Вставь в GPT или Gemini с запросом: «Отредактируй этот prompt в точности, но под мою нишу: [укажи нишу]. Структуру и логику оставь прежними».
  2. Замени исходный prompt на отредактированный — агент будет отбирать топ-5 уже в контексте твоей тематики.

Подключение: выход AI Agent → вход следующего агента.

📝 AI Agent1 (редактор: форматирование для Telegram)

Вход: JSON с 5 отобранными новостями от первого агента.

Что делает:

  • Переводит заголовки на русский.
  • Пишет выжимку 3–5 предложений с акцентом на главной идее.
  • Приводит дату к виду «ДД месяца ГГГГ, ЧЧ:ММ».
  • Собирает итог в чистый HTML, совместимый с Telegram (только теги <b>, <u>, <a>, <code>; без Markdown).
  • На выходе — готовый текст дайджеста для отправки.

Замечание: по умолчанию настроен под SMM-редактор/AI. Вам нужно здесь заменить под свою нишу.

Промт для второго 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 оставь:
    • parse_mode: "HTML"
    • appendAttribution: false
  • Убедись, что бот добавлен в канал и имеет права на публикацию (лучше — админ).

🔢 Как получить числовой Chat ID в Telegram через n8n

Сделаем это на чисто через Telegram Trigger в отдельном workflow — быстро и без API-ручек.

Шаги:

  1. Создайте новый Workflow → добавьте ноду Telegram Trigger.
  2. В ноде выберите учётку бота (те же креды, что и в Send a text message).
  3. Нажмите Execute Workflow (или Execute Node).
  4. Откройте Telegram и напишите любое сообщение этому боту:
    • если нужен ID личного чата — пишите боту в личку;
    • если нужен ID канала/группыдобавьте бота в канал/группу (лучше админом) и отправьте сообщение в этот канал/группу.
  5. Вернитесь в n8n → в Telegram Trigger появится выполненный запуск.
  6. Откройте Output ноды и скопируйте Chat ID (поле вроде message.chat.id).
  7. Вставьте это число в ноду Send a text message → chatId.

Полезно знать:

  • Для каналов/супергрупп ID обычно отрицательный и начинается на -100….
  • Если триггер не ловит сообщение — проверьте, что бот добавлен туда, где вы пишете, и у него есть права.
  • Один раз получили ID — можете хранить в заметке и использовать дальше в любых workflow.

Готово: теперь отправка через Send a text message пойдёт в нужный чат по числовому ID.

Практические советы

  • 🧪 Протестируй сначала на личном чате с ботом: поставь свой chatId, нажми Execute и проверь разметку.
  • ⚠️ Если сообщений слишком много, Telegram может притормозить отправку — это нормально, просто дождись завершения.
Schedule Trigger

7) ⏰ Schedule Trigger — переводим бота на ежедневный авто-запуск

🧩 Зачем
Мы фильтруем новости за последние 24 часа, значит логично запускать воркфлоу раз в день.


Шаги настройки

  1. Заменить ручной триггер
  • Удалите/отключите ноду When clicking ‘Execute workflow’.
  • Добавьте ноду Schedule Trigger и подключите её ко всем RSS Read.
  1. Параметры Schedule Trigger (см. скрин ниже):
  • Trigger Interval: Days
  • Days Between Triggers: 1
  • Trigger at Hour: выберите час запуска
  • Trigger at Minute: 0
После этого воркфлоу будет стартовать каждый день в выбранное время.
  1. Синхронизируем часовой пояс
  • Откройте Settings воркфлоу (иконка шестерёнки сверху).
  • В поле Timezone укажите ваш часовой пояс (на скрине — Europe/Moscow).
Это важно, чтобы время запуска совпадало с вашим локальным временем.

Активировать воркфлоу

  • Включите тумблер Activate.
  • Для теста можно по-прежнему нажать Execute workflow (разовый ручной запуск).

📝 Короткие подписи к скриншотам

  • Скрин 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

Спасибо за внимание и удачных автозапусков! 🚀📬