Тарифы
Войти
Зарегистрироваться
Перейти к регистрации
Заберите бесплатный комплект для запуска сайта 🚀
Мы подготовили материалы, которые помогут вам создать продающий сайт и получить первые заявки уже в ближайшие дни:

📘 План «Сайт и заявки за 7 дней»
🎁 7 бонусов от Mottor
🎯 Промокод до 30 000 ₽ на рекламу в Яндекс
🎓 Гид по интерфейсу редактора
💬 Поддержка специалистов Mottor
Забрать бонусы в Telegram
Заберите бесплатный комплект для запуска
сайта 🚀
Мы подготовили материалы, которые помогут вам создать продающий сайт и получить первые заявки уже в ближайшие дни:

📘 План «Сайт и заявки за 7 дней»
🎁 7 бонусов от Mottor
🎯 Промокод до 30 000 ₽ на рекламу в Яндекс
🎓 Гид по интерфейсу редактора
💬 Поддержка специалистов Mottor
Забрать бонусы в Telegram
Мы используем cookie для работы сайта и аналитики. Подробнее — в политике конфиденциальности. Продолжая пользоваться сайтом, вы соглашаетесь с cookie. Узнать больше 
← Назад к статьям

Контент-завод для 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).
  • Обработка ошибок: критерии проверки выполнения выполнения
Попробуйте n8n в Mottor
Соберите свою первую автоматизацию или AI-агента без кода.
Перейдите на n8n и начните прямо сейчас.
Перейти в n8n →

Этап 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 коротких предложений, без ссылок и призывов. Русский язык.

ВЫВОД: только готовый текст поста.`;
})()
}}

Заключение

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

Новый продукт: AI-агенты и автоматизация на n8n

Новый продукт: AI-агенты и автоматизация на n8n

Запустили n8n от Mottor — визуальный конструктор автоматизаций и AI-агентов. Подключайте 1000+ сервисов и ИИ, собирайте процессы без кода, работайте на серверах в РФ и оплачивайте удобным способом.

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

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

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

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

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

Продукты:

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

О нас:

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

Шаблоны:

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

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

ООО “ЛПмотор”, все данные защищены.
Реестр российского ПО №15770

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

Стоимость:

Клиенты:

Материалы:

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

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

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

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

support@lpmotor.ru

support@lpmotor.ru

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