Telegram и n8n: production-боты, команды, уведомления и защита от спама ¶
Обновлено: 2026-05-30
Используйте JSON как основу: замените credentials, URL порталов, поля CRM и правила дедупликации.
Проблема: Telegram-бот в n8n часто начинается с одного Trigger и пары сообщений, но быстро ломается: любой пользователь пишет боту, команды смешиваются с текстом поддержки, alert-ы содержат персональные данные, а retry отправляет менеджеру несколько одинаковых уведомлений.
Решение: делаем Telegram-интеграцию как управляемый входной канал: проверяем chat_id и username, разбираем команды, нормализуем текст, вводим allowlist, rate-limit и идемпотентность сообщений, а исходящие уведомления маскируем и отправляем по понятным правилам.
Проблема: почему Telegram-бот в n8n без правил быстро превращается в хаос ¶
Самая частая ошибка — считать Telegram “просто удобным каналом уведомлений”. В production это полноценный API-вход: он получает команды, файлы, сообщения от незнакомых пользователей, повторные updates и ошибки доставки. Если не отделить команды от обычного текста, бот начинает выполнять лишние действия и отправлять шумные ответы.
Вторая боль — безопасность. Bot token даёт доступ к отправке сообщений от имени бота, а chat_id часто попадает в execution data. Поэтому интеграция Telegram и n8n должна включать allowlist, маскирование данных и контроль того, кому бот отвечает, а кому возвращает нейтральное сообщение.
Архитектура Telegram bot workflow в n8n ¶
| Блок | Задача | Production-проверка |
|---|---|---|
| Telegram Trigger | принимает update от Bot API | webhook active, bot token в credentials |
| Authorize chat | проверяет chat_id, username и allowlist | нет выполнения команд от чужих пользователей |
| Command router | разбирает /start, /status, /lead, обычный текст | явный список команд, fallback для неизвестных |
| Business action | создаёт задачу, отвечает пользователю или шлёт alert | idempotency по message_id/update_id |
| Safe response | отправляет короткий Telegram-ответ | без токенов, stack trace и лишних ПДн |
| Audit / alert | логирует важные события | rate limit, spam, ошибки отправки |
Для служебных alert-ов используйте отдельный чат или тему, а не тот же диалог, где пользователи общаются с ботом. Так команда поддержки не перепутает системные ошибки и реальные обращения.
Контракт входящего Telegram update ¶
{
"update_id": 9042001,
"message": {
"message_id": 221,
"date": 1780125600,
"chat": {
"id": 123456789,
"type": "private",
"username": "client_user"
},
"from": {
"id": 123456789,
"is_bot": false,
"first_name": "Анна",
"username": "client_user"
},
"text": "/status order-10492"
}
}
Ключи для контроля — update_id, message.message_id и chat.id. По ним можно отличить повторное событие, разрешённый чат и конкретную команду.
Code Node: allowlist, команды и защита от спама ¶
const update = $json;
const msg = update.message ?? update.edited_message ?? {};
const chat = msg.chat ?? {};
const text = String(msg.text ?? '').trim();
const allowlist = String($env.TELEGRAM_ALLOWED_CHAT_IDS ?? '')
.split(',')
.map(v => v.trim())
.filter(Boolean);
const chatId = String(chat.id ?? '');
if (!allowlist.includes(chatId)) {
return [{ json: { action: 'deny', chat_id: chatId, reason: 'chat_not_allowed' } }];
}
const commandMatch = text.match(/^\/(\w+)(?:\s+(.+))?$/);
const command = commandMatch?.[1]?.toLowerCase() ?? 'message';
const arg = commandMatch?.[2]?.trim() ?? '';
const allowedCommands = ['start', 'status', 'lead', 'help'];
if (command !== 'message' && !allowedCommands.includes(command)) {
return [{ json: { action: 'reply', chat_id: chatId, text: 'Неизвестная команда. Используйте /help.' } }];
}
return [{ json: {
action: command === 'message' ? 'support_message' : `command_${command}`,
chat_id: chatId,
message_id: msg.message_id,
update_id: update.update_id,
user: msg.from?.username ?? '',
command,
arg,
text,
idempotency_key: `telegram:${update.update_id}:${msg.message_id}`
}}];
Почему нужен allowlist даже для простого бота
Публичный username бота легко найти или перебрать. Allowlist по chat_id защищает команды, административные действия и внутренние alert-ы от случайных пользователей и спама.
Готовый workflow JSON: скачать и импортировать ¶
Скачать готовый workflow JSON Скачать тестовый payload
{
"name": "Nodbot - Telegram n8n production bot with allowlist and command router",
"nodes": [
{
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"purpose": "Получить входящее сообщение или команду"
},
{
"name": "Authorize and parse command",
"type": "n8n-nodes-base.code",
"purpose": "Проверить allowlist и разобрать команду"
},
{
"name": "Command Switch",
"type": "n8n-nodes-base.if",
"purpose": "Развести /status, /lead, /help и обычный текст"
},
{
"name": "Business action",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Запросить CRM/API или создать задачу"
},
{
"name": "Send Telegram reply",
"type": "n8n-nodes-base.telegram",
"purpose": "Вернуть безопасный ответ"
},
{
"name": "Audit event",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Записать событие в журнал"
}
],
"connections": "Telegram Trigger → Authorize and parse command → Command Switch → Business action → Send Telegram reply → Audit event"
}
Пошаговая настройка Telegram Bot API, n8n и команд ¶
- Создайте бота через BotFather и сохраните token только в credentials n8n.
- Добавьте Telegram Trigger и активируйте production webhook.
- Передайте разрешённые chat_id через ENV
TELEGRAM_ALLOWED_CHAT_IDS. - Импортируйте workflow JSON и настройте маршруты команд под ваши сценарии.
- Отделите пользовательские ответы от системных alert-ов в разные чаты или темы.
Тесты перед production ¶
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/integration-telegram-n8n" \
-H "Content-Type: application/json" \
--data @integration-telegram-n8n-payload.json
- Напишите боту из разрешённого chat_id и проверьте команду
/help. - Напишите из неразрешённого аккаунта и убедитесь, что action = deny.
- Повторите тот же update и проверьте idempotency key.
- Отправьте неизвестную команду и проверьте fallback-ответ.
- Сымитируйте ошибку Telegram API и убедитесь, что alert не содержит token или полный payload.
Production-риски ¶
- Bot token в коде. Токен должен жить в credentials или ENV, а не в Function/Code Node.
- Нет allowlist. Любой пользователь может запускать команды или спамить workflow.
- Шумные alert-ы. Повторные ошибки отправляют десятки сообщений в рабочий чат.
- Персональные данные в уведомлениях. Маскируйте телефоны, email и stack trace.
- Нет idempotency. Повторный update может создать вторую задачу или второй ответ.
Полезные ссылки и смежные материалы ¶
- Telegram Bot API
- n8n Telegram Trigger
- n8n Telegram node
- Workflow: роутер команд Telegram-бота
- Error workflow → Telegram alert
Критерии готовности ¶
- Разрешённые chat_id заданы через ENV или защищённое хранилище.
- Команды имеют явный router и безопасный fallback.
- Повторный update не запускает бизнес-действие дважды.
- Alert-ы не раскрывают токены, stack trace и лишние ПДн.
- Есть владелец бота, список команд и тестовый payload.
Nodbot настроит Telegram + n8n: команды, allowlist, CRM-действия, безопасные alert-ы, idempotency и мониторинг.
Обсудить Telegram-интеграцию