Что получится в результате
Соберем простого ИИ-агента для Telegram-канала:
- тема поста лежит в Google Sheets;
- n8n забирает тему;
- AI пишет черновик поста;
- черновик отправляется в тестовый Telegram-чат;
- редактор ставит в таблице `approved`;
- n8n публикует пост в канал через Telegram Bot API;
- в таблицу записывается статус `published` и `message_id`.
Это минимальная рабочая версия. Без автопубликации сырых AI-текстов.
Что понадобится
- Telegram-аккаунт.
- Telegram-канал.
- Отдельный приватный тестовый канал или чат для preview.
- Бот, созданный через BotFather.
- n8n Cloud или self-hosted n8n.
- Google Sheets.
- API-ключ LLM-провайдера, например OpenAI-compatible API.
Шаг 1. Создайте Telegram-канал
- Откройте Telegram.
- Нажмите `Создать канал`.
- Назовите канал, например `ezGPT test`.
- Сделайте канал публичным или приватным.
- Если канал публичный, задайте username, например `@ezgpt_test`.
Для проверки лучше сначала использовать тестовый канал, а не боевой.
Шаг 2. Создайте бота через BotFather
- Откройте в Telegram `@BotFather`.
- Отправьте команду:
/newbot
- Введите имя бота, например:
ezGPT Publisher Bot
- Введите username бота, он должен заканчиваться на `bot`, например:
ezgpt_publisher_bot
- BotFather выдаст токен вида:
1234567890:AAExampleTokenExampleToken
Сохраните токен. Не публикуйте его в статье, чате, GitHub и скриншотах.
Шаг 3. Добавьте бота администратором канала
- Откройте канал.
- Нажмите `Управление каналом`.
- Откройте `Администраторы`.
- Нажмите `Добавить администратора`.
- Найдите своего бота.
- Дайте права:
- публиковать сообщения;
- редактировать сообщения, если планируете правки;
- удалять сообщения, если планируете аварийное удаление.
Для первой версии достаточно права публикации.
Шаг 4. Проверьте отправку поста вручную
Если канал публичный, можно отправлять в `@username`.
Откройте терминал и выполните:
curl -X POST "https://api.telegram.org/botBOT_TOKEN/sendMessage" \
-d "chat_id=@ezgpt_test" \
-d "text=Тестовая публикация от бота"
Замените:
- `BOT_TOKEN` на токен от BotFather;
- `@ezgpt_test` на username вашего канала.
Если все настроено правильно, в канале появится тестовое сообщение.
Шаг 5. Узнайте chat_id приватного канала
Если канал приватный, `@username` нет. Тогда нужен `chat_id`.
Самый простой путь:
- Добавьте бота в приватный канал администратором.
- Опубликуйте любое сообщение в канал.
- Перешлите это сообщение боту или напишите боту вручную.
- Выполните:
curl "https://api.telegram.org/botBOT_TOKEN/getUpdates"
Ищите поле `chat.id`. Для каналов оно обычно выглядит примерно так:
-1001234567890
Дальше используйте этот id:
curl -X POST "https://api.telegram.org/botBOT_TOKEN/sendMessage" \
-d "chat_id=-1001234567890" \
-d "text=Тест в приватный канал"
Шаг 6. Создайте Google Sheet для контент-плана
Создайте таблицу `Telegram content`.
Сделайте колонки:
id
topic
source_url
rubric
status
draft_text
review_comment
scheduled_at
telegram_chat_id
telegram_message_id
published_at
error
В первую строку добавьте тест:
id: 1
topic: Что такое ИИ-агент простыми словами
source_url: https://ezgpt.ru/glossary
rubric: термин
status: idea
telegram_chat_id: @ezgpt_test
Статусы будут такие:
idea -> draft -> approved -> published
Шаг 7. Создайте workflow в n8n
В n8n создайте новый workflow:
Telegram channel AI publisher
Добавьте узлы:
- `Schedule Trigger`;
- `Google Sheets`;
- `OpenAI` или `HTTP Request` к LLM API;
- `Google Sheets`;
- `Telegram`.
Этот workflow будет брать строки со статусом `idea`, делать черновик и отправлять preview в тестовый чат.
Шаг 8. Настройте Schedule Trigger
В `Schedule Trigger` поставьте:
Every 1 hour
Для теста можно поставить каждые 5 минут, но после проверки лучше вернуть нормальный интервал.
Шаг 9. Настройте чтение Google Sheets
В узле `Google Sheets`:
- Подключите Google credentials.
- Выберите таблицу `Telegram content`.
- Операция: `Read`.
- Прочитайте строки.
- Добавьте фильтр после узла:
status equals idea
В итоге дальше должны уходить только темы, которые еще не превращены в черновик.
Шаг 10. Сформируйте prompt для поста
В узле LLM используйте такой системный промпт:
Ты редактор Telegram-канала ezGPT.
Пиши коротко, конкретно, без воды.
Не выдумывай факты.
Если не хватает источника, напиши "нужна проверка источника".
Не обещай заработок, безопасность или результат без оснований.
Верни только JSON.
Пользовательский промпт:
Сделай Telegram-пост.
Тема: {{$json.topic}}
Рубрика: {{$json.rubric}}
Источник: {{$json.source_url}}
Формат:
{
"post_text": "текст поста",
"risk_flags": ["что проверить перед публикацией"],
"cta": "короткий CTA"
}
Требования:
- до 1200 знаков;
- первый абзац объясняет пользу;
- список максимум 5 пунктов;
- без хэштегов;
- без эмодзи;
- в конце ссылка на источник, если она есть.
Шаг 11. Запишите черновик в таблицу
После LLM добавьте узел `Google Sheets -> Update row`.
Запишите:
draft_text = post_text
status = draft
review_comment = risk_flags
Так черновик сохранится в таблице и не потеряется, даже если Telegram-узел упадет.
Шаг 12. Отправьте preview в тестовый чат
Добавьте узел `Telegram -> Send Message`.
Настройки:
chat_id = ID тестового чата или тестового канала
text =
PREVIEW POST #{{$json.id}}
{{$json.post_text}}
Проверить:
{{$json.risk_flags}}
Чтобы опубликовать: поставьте status=approved в Google Sheets.
На этом этапе агент ничего не публикует в основной канал. Он только отправляет preview.
Шаг 13. Проверьте первый черновик руками
Откройте тестовый чат и проверьте:
- нет ли выдуманных фактов;
- нормальный ли первый абзац;
- понятна ли мысль;
- нет ли лишней рекламы;
- работает ли ссылка;
- нет ли placeholder вроде `[ссылка]`;
- подходит ли тон каналу.
Если пост плохой, в таблице поставьте:
status = idea
review_comment = что исправить
Если пост нормальный:
status = approved
Шаг 14. Создайте второй workflow для публикации
Создайте отдельный workflow:
Telegram approved publisher
Узлы:
- `Schedule Trigger`;
- `Google Sheets`;
- `Filter`;
- `Telegram`;
- `Google Sheets`.
Этот workflow публикует только строки со статусом `approved`.
Шаг 15. Прочитайте approved-строки
В `Google Sheets -> Read` прочитайте таблицу.
Фильтр:
status equals approved
Если используете отложенную публикацию, добавьте условие:
scheduled_at is empty OR scheduled_at <= now
Для первой версии можно публиковать сразу после approval.
Шаг 16. Опубликуйте пост в канал
Добавьте `Telegram -> Send Message`.
Настройки:
chat_id = {{$json.telegram_chat_id}}
text = {{$json.draft_text}}
Если используете HTTP Request вместо Telegram node:
POST https://api.telegram.org/botBOT_TOKEN/sendMessage
Body:
{
"chat_id": "{{$json.telegram_chat_id}}",
"text": "{{$json.draft_text}}",
"disable_web_page_preview": false
}
После публикации Telegram вернет объект `message`. Сохраните `message_id`.
Шаг 17. Обновите статус в таблице
После успешной отправки добавьте `Google Sheets -> Update row`.
Запишите:
status = published
telegram_message_id = message_id из ответа Telegram
published_at = текущая дата и время
error = пусто
Если Telegram вернул ошибку, запишите:
status = error
error = текст ошибки
Не делайте бесконечные повторы. Максимум 2-3 retry.
Шаг 18. Добавьте публикацию с картинкой
Когда текстовые посты заработали, добавьте `sendPhoto`.
В таблицу добавьте колонку:
image_url
Если `image_url` заполнен, используйте метод `sendPhoto`:
curl -X POST "https://api.telegram.org/botBOT_TOKEN/sendPhoto" \
-d "chat_id=@ezgpt_test" \
-d "photo=https://example.com/image.jpg" \
-d "caption=Текст поста"
Важно: изображение должно быть доступно Telegram по URL.
Шаг 19. Добавьте базовую модерацию комментариев
Если у канала есть группа обсуждений, сделайте отдельный workflow.
Вход:
- Telegram trigger или webhook;
- новое сообщение в группе обсуждений.
Проверки:
- ссылка в тексте;
- подозрительный оффер;
- мат;
- персональные данные;
- повторяющийся текст;
- просьба о консультации;
- нормальный вопрос.
Действия:
- очевидный спам -> удалить;
- вопрос -> записать в таблицу идей;
- спорное -> отправить админу;
- персональные данные -> скрыть и отправить на проверку.
Автоудаление включайте только для очевидного спама. Критику не удаляйте без правила.
Шаг 20. Сделайте отчет по постам
Раз в неделю агент должен собрать отчет.
В таблицу добавьте вручную или через аналитику:
views
reactions
comments
clicks
Попросите агента сделать summary:
Проанализируй посты за неделю.
Верни:
1. лучшие 5 тем;
2. слабые 5 тем;
3. какие рубрики продолжать;
4. какие темы сделать на следующей неделе;
5. какие статьи сайта стоит обновить.
Пока нет автоматической глубокой аналитики Telegram, используйте UTM-метки и Яндекс.Метрику для переходов на сайт.
Минимальная проверка результата
Система работает, если:
- тема со статусом `idea` превращается в `draft`;
- preview приходит в тестовый чат;
- после `approved` пост публикуется в канал;
- в таблице появляется `published`;
- сохраняется `telegram_message_id`;
- пост без `approved` не публикуется;
- ошибка Telegram записывается в `error`;
- токен бота нигде не выводится в постах и логах.
Что нельзя автоматизировать в первой версии
- публикацию без approval;
- новости без проверки источника;
- рекламные посты;
- посты с ценами и датами;
- удаление критики;
- ответы от лица автора в споре;
- массовые личные сообщения подписчикам;
- публикацию чужих изображений без права;
- обещания результата или заработка;
- юридические и медицинские советы.
Частые вопросы
Почему не публиковать сразу после генерации?
Потому что AI может ошибиться, придумать факт, поставить плохую ссылку или написать не в стиле канала. Approval защищает канал от случайных публикаций.
Можно ли обойтись без Google Sheets?
Да. Можно использовать Notion, Airtable, базу сайта или админку Laravel. Но Google Sheets проще для первой версии: видно статусы, черновики и ошибки.
Какой минимум нужен для первого запуска?
BotFather, канал, бот-админ, Google Sheets, n8n, один LLM-узел, preview в тестовый чат и второй workflow для публикации approved-постов.
Как проверить, что Telegram Bot API работает?
Сначала выполните ручной `sendMessage` через curl. Если тестовое сообщение пришло в канал, проблема дальше уже в n8n или данных workflow.
Что делать, если пост не публикуется?
Проверьте токен, права бота в канале, `chat_id`, статус строки, пустой ли `draft_text`, нет ли ошибки Telegram API и не заблокирован ли бот.