Тарифы
Войти
Зарегистрироваться
← Назад к статьям

Контент-завод для Telegram с n8n: полное руководство
от теории к практике (часть 1)

Комплексное руководство по созданию системы автоматической генерации и публикации контента в Telegram-каналах с использованием n8n, GPT и соблюдением всех правовых норм. 

В современном мире контент-маркетинга ручная публикация постов отнимает огромное количество времени. Наше руководство поможет вам создать полностью автоматизированную систему генерации качественного контента для Telegram-каналов с использованием no-code платформы n8n.

Подготовка: Необходимые сервисы
и аккаунты

Обязательные платформы:

  • n8n.io → регистрация или развертывание на своем сервере
  • Supabase → регистрация, создание проекта для базы данных
  • OpenAI → получить API-ключ для GPT и генерации изображений
  • Телеграмма → создание бота через @BotFather, получение токена

Дополнительные инструменты:

  • RSSHub → для конвертации Telegram-каналов в RSS
  • Система Диптихи → для идентификации работы систем

Настройка базы данных Supabase

Выполните этот SQL-код в Supabase (Редактор SQL → Новый запрос):
Скопируйте:

-- Основная таблица для хранения постов
create table if not exists posts (
id bigint generated by default as identity primary key,
hash text unique,
source_id text,
title text,
body_markdown text,
image_url text,
status text,
published_at timestamptz default now(),
score integer default 0,
engagement_stats jsonb,
created_at timestamptz default now()
);
-- Основная таблица для хранения постов
create table if not exists posts (
id bigint generated by default as identity primary key,
hash text unique,
source_id text,
title text,
body_markdown text,
image_url text,
status text,
published_at timestamptz default now(),
score integer default 0,
engagement_stats jsonb,
created_at timestamptz default now()
);

Настройка RSSHub для Telegram

Используется rsshub.app.
Пример:

https://rsshub.app/telegram/channel/_____________?limit=50
Заменяем _____________на username любого канала.

Этап 1: Запуск и настройка Cron h2

Используйте код Cron в n8n для запуска рабочего процесса через заданные интервалы времени.

Настройка триггера:

  • Node type: Cron

  • Trigger every → Every 15 minutes.

  • → запускает весь процесс.

Технические детали:

  • Частота запуска: рекомендуется 15–30 минут между проверками.
  • Активность времени: настроена работа только в рабочие часы (9:00-21:00).
  • Обработка ошибок: критерии проверки выполнения выполнения
Сгенерируйте сайт с помощью
нейросети mottor бесплатно
Сгенерируйте сайт
с помощью
нейросети mottor бесплатно
Конструктор сайтов и интернет-магазинов
с искусственным интеллектом Muza
Конструктор сайтов
и интернет-магазинов
с искусственным интеллектом Muza
Начать генерацию

Этап 2: Парсинг контента из открытых RSS-источников

Настройка узла чтения RSS-канала

Скопируйте:

// URL с кэш-бастером для избежания кэширования
"url": "https://rsshub.app/telegram/channel/YOUR_CHANNEL?limit=50&_={{Math.floor(Date.now()/30000)}}",

Рекомендуемые RSS-конвертеры:

  • RSS-мост: https://rss-bridge.org/bridge01/
  • RSS.app: https://rss.app/
  • RSSHub: https://docs.rsshub.app/ (основной)
  • Zapier RSS: для Telegram-каналов с публичным доступом

Технические ограничения:

  • Ограничения Telegram API: 30 запросов в секунду.
  • Обработка ошибки 429: автоматическая пауза при превышении лимитов
  • Кэширование: сохранение данных для избежания дублирования запросов
  • Таймауты: настройка разумных временных лимитов для запросов

Этап 3: Обработка ошибок и повторные запросы/Robust normalize v3 

Telegram API имеет строгие лимиты, поэтому необходима корректная обработка ошибок.
Code (JavaScript) → вставьте полностью:

function stripHtml(s=''){ return String(s)
.replace(/<style[^>]*>.*?<\/style>/gis,' ')
.replace(/<script[^>]*>.*?<\/script>/gis,' ')
.replace(/<[^>]+>/g,' ')
.replace(/\s+/g,' ')
.trim(); }
function firstUrls(s=''){ return String(s).match(/https?:\/\/\S+/ig) || []; }
function pickExternalUrl(text='', html='') {
const urls = [...new Set([...firstUrls(text), ...firstUrls(html)])];
for (const u of urls) {
try { const h = new URL(u).hostname.replace(/^www\./,'').toLowerCase();
if (!/^(t\.me|telegram\.me)$/.test(h)) return u; } catch {}
} return '';
}
function canonicalUrl(u=''){ try {
const url=new URL(u); const bad=/^(utm_|fbclid|gclid|yclid|mc_|ref$|ref_|_hs)/i;
for(const k of [...url.searchParams.keys()]) if(bad.test(k)) url.searchParams.delete(k);
url.hash=''; return (url.origin+url.pathname).replace(/\/+$/,'').toLowerCase();
} catch { return String(u).toLowerCase().trim(); } }
function toIso(x){ const t=Date.parse(x||0); return Number.isFinite(t)?new Date(t).toISOString():null; }
function hostname(u=''){ try { return new URL(u).hostname.replace(/^www\./,''); } catch { return ''; } }
function hashStr(s){ let h=2166136261>>>0; for(const ch of String(s)){ const c=ch.charCodeAt(0);
h^=c; h=(h+(h<<1)+(h<<4)+(h<<7)+(h<<8)+(h<<24))>>>0; } return h.toString(36); }
const out=[]; for(const it of $input.all()){ const j=it.json||{};
const titleRaw=String(j.title||''); const htmlRaw=j['content:encoded']||j.content||j.description||'';
const textRaw=stripHtml(htmlRaw||titleRaw);
const extUrl=pickExternalUrl(titleRaw,htmlRaw); const tgPermalink=String(j.link||'');
const link=extUrl||tgPermalink; if(!link&&!textRaw) continue;
const title=stripHtml((titleRaw||'').replace(extUrl,'')).trim()||stripHtml(textRaw.replace(extUrl,'')).trim()||hostname(link)||'Без названия';
const canon=canonicalUrl(extUrl)||canonicalUrl(tgPermalink)||title.toLowerCase();
const hash=hashStr(canon); const published_at=toIso(j.isoDate||j.pubDate||j.published||j.updated);
out.push({json:{source_id:null,title,link,raw:textRaw||title,published_at,ext_id:tgPermalink||link,hash,canon_url:canon}});
}
return out;

Интеллектуальная фильтрация и отбор новостей/Filter: last 3h

Нормализация данных (Robust Normalize v3)

Первый этап - приведение всех входящих данных к единому формату:
Скопируйте:

const MAIN_H = 24;
const BUFFER = 2;
const now = Date.now();
const ts = x => { const t = Date.parse(x||0); return Number.isFinite(t) ? t : 0; };
return $input.all().filter(i =>
ts(i.json.published_at) >= now - (MAIN_H*BUFFER)*3600e3
);

фильтрует свежие посты

Score Item

Вставьте готовый код он анализирует текст и даёт score + теги:
Вставьте готовый код он анализирует текст и даёт score + теги:
let score = 0;
const reasons = [];

const text = `${$json.title || ''} ${$json.raw || ''}`.toLowerCase();

// тематика
if (/(ai|ml|llm|gpt|чат.?gpt|нейросет|искусственн[ао]?[йе]?\s*интеллект|midjourney|gemini|copilot|claude|llama|mistral)/i.test(text)) { score += 16; reasons.push('+ai'); }
if (/(n8n|zapier|make\.com|интеграц|автоматизац|webhook|api\b)/i.test(text)) { score += 12; reasons.push('+automation'); }
if (/(telegram|телеграм|mini ?app|бот(?!ан)|bot api)/i.test(text)) { score += 10; reasons.push('+tg'); }
if (/(кейс|пример|разбор|как (мы|я)\b|практик)/i.test(text)) { score += 6; reasons.push('+case'); }

// качество
const rawLen = ($json.raw || '').length;
if (rawLen > 800) { score += 6; reasons.push('+len800'); }
else if (rawLen > 300) { score += 3; reasons.push('+len300'); }

if (/\b\d{4}\b/.test(text) || /v?\d+\.\d+/.test(text)) { score += 2; reasons.push('+nums'); }
if (/(запустил|выпустил|анонс|релиз|обновил|вышл[аи]|появил)/i.test(text)) { score += 4; reasons.push('+launch'); }

// анти-сигналы
if (/(мем|шутк|юмор|фейк|розыгрыш)/i.test(text)) { score -= 10; reasons.push('-meme'); }
if (/(слух|неподтвержд|утечк)/i.test(text)) { score -= 6; reasons.push('-rumor'); }
if (/(подписывай|промо|скидк|реферал)/i.test(text)) { score -= 12; reasons.push('-promo'); }

return { json: { ...$json, score, reasons } };

Этап 4: Важно учесть

Supabase запрос SELECT

https://YOUR_PROJECT.supabase.co/rest/v1/posts?select=hash&hash=eq.{{$json.hash}}&limit=1
Headers:

apikey: {{SUPABASE_ANON_KEY}}
Authorization: Bearer {{SUPABASE_SERVICE_ROLE}}
Эти узлы отбрасывают уже опубликованный материал

Set (cleanup)

Код вставлен в ноду: очищает от тегов, готовит text_for_rewrite.
title
{{
String($json.title || '')
.replace(/(^|\s)@[\w_]+/g, ' ') // @каналы
.replace(/\s*[-—–:|]\s*(telegram|телеграм)\b.*$/i, '')// «… | Telegram …»
.replace(/\s+/g, ' ')
.trim()
}}

raw

{{ String($json.raw || $json.content || $json.description || $json.title || '')
.replace(/<style[^>]*>.*?<\/style>|<script[^>]*>.*?<\/script>|<[^>]+>/gis,' ')
.replace(/\s+/g,' ')
.trim() }}

const htmlToText = (s='') => String(s)
.replace(/<br\s*\/?>/gi, '\n')
.replace(/<\/(p|li|div|h\d|tr)>/gi, '\n')
.replace(/<li[^>]*>/gi, '• ')
.replace(/<style[^>]*>.*?<\/style>/gis, ' ')
.replace(/<script[^>]*>.*?<\/script>/gis, ' ')
.replace(/<[^>]+>/g, ' ')
.replace(/\u00A0/g, ' ')
.replace(/[ \t]+\n/g, '\n')
.replace(/\n{3,}/g, '\n\n')
.replace(/[ \t]{2,}/g, ' ')
.trim();

const stripTgHeader = (s='') => {
const lines = String(s).split(/\r?\n/);
let i = 0;
while (i < Math.min(lines.length, 6)) {
const L = lines[i].trim();
if (L === '') { i++; continue; }
const hdr = /https?:\/\/t\.me\/\S+/i.test(L)
|| /^@[\w_]+/.test(L)
|| /\b(telegram|телеграм)\b/i.test(L)
|| (/^[\w\s\/|:—–\-+&_.,()]+$/u.test(L) && !/[.!?…]$/.test(L));
if (hdr) { i++; continue; }
break;
}
return lines.slice(i).join('\n');
};

const src = prefer(
self.raw, self.content, self.description, self.summary, self['content:encoded'],
fromPick.raw, fromPick.content, fromPick.description, fromPick.summary,
self.title
);

let body = stripTgHeader(src);
body = htmlToText(body)
.replace(/https?:\/\/t\.me\/\S+/gi, '')
.replace(/(^|\s)@[\w_]+/g, ' ')
.trim();

return body || (self.title || fromPick.title || '');
})() }}

link
{{$json.link || $json.guid || ''}}

text_for_rewrite
{{
(() => {
const s = ($json.raw || $json.content || $json.description || $json.title || '').toString();
return s
.replace(/<style[^>]*>.*?<\/style>/gis, ' ')
.replace(/<script[^>]*>.*?<\/script>/gis, ' ')
.replace(/<[^>]+>/g, ' ') // HTML → текст
.replace(/https?:\/\/t\.me\/\S+/gi, ' ') // только телеграм-ссылки
.replace(/(^|\s)@[\w_]+/g, ' ') // @каналы
.replace(/\s+/g, ' ')
.trim();
})()
}}

__test_mode
{{ false }}

Этап 5: Профессиональный рерайт через GPT

Модель: gpt-4.1-mini.
System Promt:
Ты — фактологический редактор. Пиши ТОЛЬКО на основе входного BODY. НИЧЕГО не добавляй из знаний модели. Если факт не подтверждён текстом — опусти. Сохраняй имена, версии, числа, статусы (анонс/запуск/тест) без искажений.
User promt:
{{
(() => {
const src = $json || {};
const title = (src.title || '').toString().trim();
const body = (src.text_for_rewrite || src.raw || '').toString().trim();
const host = (src.source_host || '').toString();
const hint = (src.gemini_hint || 'unknown').toString();

return `TITLE: ${title}

BODY:
${body}

КОНСТРАИНТЫ:
- Никаких домыслов и допущений. Пиши только то, что явно есть в BODY.
• если hint=${hint} и host указывает на gemini.com — трактуй как криптобиржу;
• если однозначности нет — пиши просто без уточнений.
- Не менять статусы (анонс/запуск/тест/программа).
- 3–6 коротких предложений, без ссылок и призывов. Русский язык.

ВЫВОД: только готовый текст поста.`;
})()
}}
Сгенерируйте сайт с помощью
нейросети mottor бесплатно
Сгенерируйте сайт
с помощью
нейросети mottor бесплатно
Конструктор сайтов и интернет-магазинов
с искусственным интеллектом Muza
Конструктор сайтов
и интернет-магазинов
с искусственным интеллектом Muza
Начать генерацию

Заключение

Вы ознакомились с первой частью настройки Контент-завод для Telegram с n8n, вторую часть читайте в этой статье.

Бесплатно создадим прототип сайта

под ваш бизнес при подключении тарифа

Бесплатно создадим прототип сайта

под ваш бизнес при подключении тарифа

Забронировать предложение
+ 6 подарков

0₽

0₽

Разбор и улучшение сайта
от специалистов Mottor

Разбор и улучшение сайта
от специалистов Mottor

Чат-ботов и Автоворонок

(больше заявок и продаж с сайта)

Чат-ботов и Автоворонок

(больше заявок и продаж с сайта)

+1

месяц

месяц

0₽

0₽

Консультация по созданию
сайта и работе в редакторе

Консультация по созданию
сайта и работе в редакторе

Бесплатный домен
в зоне .ru/.рф

Бесплатный домен
в зоне .ru/.рф

0₽

0₽

0₽

0₽

SSL-сертификат
безопасности для вашего
домена на 2 года

SSL-сертификат
безопасности для вашего
домена на 2 года

Промокод на рекламу
в Я.Директ и Я.Бизнес

Промокод на рекламу
в Я.Директ и Я.Бизнес

+12 000₽

+12 000₽

Для новых пользователей
Контент-завод для Telegram
с n8n: полное руководство
от теории к практике (часть 2)
ИИ-выдача: новая эра борьбы
за внимание пользователей
в цифровом маркетинге
Зарубежные сервисы
для ИИ-поиска: как проверить, что говорят о вас ChatGPT
и Google AI

Конструктор сайтов, чат-ботов, автоворонок, мобильных приложений

Конструктор сайтов, чат-ботов, автоворонок, мобильных приложений

Быстрый старт:

Премиум поддержка
Полезные материалы
Интеграции
Технологии
Шаблоны сайтов
Тарифы
Импорт из Figma
Сделано на mottor
Партнеры

Продукты:

Сайты + лендинги
Интернет-магазины
Квизы
Чат-боты
Автоворонки
Приложение
AI-агенты (n8n)
Партнерская программа
WhiteLabel

О нас:

О компании
Тур по сервису
Вакансии
Отзывы
Контакты

Шаблоны:

Популярные запросы:

Все шаблоны
Шаблон доставка еды
Шаблон строительство
Шаблон недвижимость
Шаблон онлайн-курс
Шаблон онлайн школа
Шаблон портфолио
Шаблон вебинар
Шаблон интернет-магазин мебели

ООО “ЛПМОТОР”, все данные защищены

Договор оферта
Согласие
Политика конфиденциальнсоти
Инструкция по установке
Бесплатный конструктор сайта
Одностраничный сайт
Конструктор интернет магазинов
Конструктор страниц
Конструктор сайта онлайн
Онлайн конструктор сайта бесплатно
Сайт конструктор бесплатно
Создать квиз
Конструктор создания сайтов
Создать сайт бесплатно конструктор
Многостраничный сайт
Создать бесплатно интернет магазин
Создать сайт онлайн бесплатно самому
Создать сайт конструктор

Стоимость:

Клиенты:

Материалы:

Обновления
Справочный центр
Бесплатный практикум
Mottor Campus

Подпишитесь на наши соцсети
и получайте кейсы, исследования и обновления первыми:

Бесплатный звонок по России

Бесплатный звонок по России

support@lpmotor.ru

support@lpmotor.ru

при поддержке Фонда Развития Интернет Инициатив