Создание чат-бота для Telegram с использованием n8n: Полное руководство

n8n — это инструмент с открытым исходным кодом для оркестрации рабочих процессов (workflow automation), который использует подход, основанный на узлах (nodes). Для создания Telegram-бота в n8n не требуется писать код, что делает процесс доступным для широкого круга пользователей. Работа строится на визуальном проектировании цепочек действий (воркфлов), которые реагируют на события в чате и выполняют заданные операции.

Предварительные требования и настройка

Перед началом создания бота необходимо выполнить несколько обязательных шагов.

1. Создание бота в Telegram

    • Откройте Telegram и найдите официального бота @BotFather.
    • Отправьте команду /newbot и следуйте инструкциям: задайте имя бота (отображаемое пользователям) и username (уникальное имя, оканчивающееся на ‘bot’, например, my_test_n8n_bot).
    • После успешного создания BotFather предоставит вам токен доступа (HTTP API token). Этот токен является секретным ключом для управления вашим ботом. Сохраните его в надежном месте.

    2. Установка и настройка n8n

    Вы можете развернуть n8n несколькими способами:

    • Локальная установка через npm: npm install n8n -g и запуск командой n8n start.
    • Использование Docker-образа: наиболее предпочтительный и изолированный способ.
    • Развертывание на облачном сервере (VPS) или использование облачной версии n8n.

    После запуска n8n будет доступен через веб-браузер по адресу http://localhost:5678 (для локальной установки). При первом входе может потребоваться создать учетную запись.

    Основные узлы (Nodes) для работы с Telegram в n8n

    В n8n функциональность реализуется через узлы. Для Telegram наиболее важны два узла:

    Название узла Тип Назначение
    Telegram Trigger Триггер Запускает воркфл при новом событии в Telegram (сообщение, callback-запрос от inline-кнопки, команда и т.д.). Это стартовая точка для бота.
    Telegram Node Действие Выполняет активные действия: отправка текста, изображений, документов, клавиатур, управление сообщениями.

    Построение базового воркфла: Эхо-бот

    Создадим простейшего бота, который отвечает тем же текстом, что и прислал пользователь.

    1. В интерфейсе n8n нажмите кнопку Workflow и создайте новый.
    2. На холсте добавьте узел Telegram Trigger.
    3. В настройках узла (Credentials) создайте новые учетные данные для Telegram. Вставьте токен, полученный от @BotFather. Выберите событие Message в поле Updates.
    4. Добавьте узел Telegram Node и соедините его с триггером.
    5. В настройках узла Telegram выберите операцию Send Message. В поле Chat ID укажите выражение {{$node["Telegram Trigger"].json["message"]["chat"]["id"]}}. Это динамически подставит ID чата, откуда пришло сообщение.
    6. В поле Text укажите выражение {{$node["Telegram Trigger"].json["message"]["text"]}}. Это извлечет текст входящего сообщения.
    7. Активируйте воркфл (переведите тумблер в активное состояние) и отправьте сообщение вашему боту в Telegram. Вы должны получить ответ с тем же текстом.

    Обработка команд и создание интерактивных клавиатур

    Реальные боты реагируют на команды и предоставляют кнопки для взаимодействия.

    Обработка команды /start

    Модифицируем воркфл, чтобы он по-разному реагировал на команды и обычные сообщения.

    1. После узла Telegram Trigger добавьте узел IF (из раздела Conditions).
    2. Настройте условие: проверьте, равно ли значение {{$node["Telegram Trigger"].json["message"]["text"]}} строке /start.
    3. На ветке true добавьте узел Telegram Node с приветственным сообщением, например, «Добро пожаловать! Используйте /help для списка команд.»
    4. На ветке false можно оставить эхо-ответ или добавить другую логику.

    Добавление клавиатуры (Reply Keyboard)

    Клавиатура появляется вместо обычного поля ввода.

    1. В узле Telegram Node для ответа (например, на команду /start) разверните раздел Additional Fields и выберите Add Option -> Reply Markup.
    2. В поле Reply Markup укажите JSON-объект, описывающий клавиатуру. Пример:
      {
        "keyboard": [
          [{"text": "Кнопка 1"}, {"text": "Кнопка 2"}],
          [{"text": "Информация"}]
        ],
        "resize_keyboard": true,
        "one_time_keyboard": false
      }
    3. Текст нажатой кнопки будет приходить в виде обычного сообщения, которое можно обработать в узле IF.

    Создание Inline-кнопок

    Inline-кнопки прикрепляются к конкретному сообщению и генерируют callback-запрос, а не текстовое сообщение.

    1. В узле Telegram Node в разделе Reply Markup укажите JSON для inline-клавиатуры:
      {
        "inline_keyboard": [
          [{"text": "Да", "callback_data": "yes_btn"}, {"text": "Нет", "callback_data": "no_btn"}]
        ]
      }
    2. Для обработки нажатия создайте новый воркфл или добавьте параллельную ветку в существующий. Используйте узел Telegram Trigger, но в поле Updates выберите событие Callback Query.
    3. Данные из нажатой кнопки будут доступны в выражении {{$node["Telegram Trigger"].json["callback_query"]["data"]}} (например, «yes_btn»).
    4. Для ответа на callback (чтобы убрать «часики» на кнопке) используйте узел Telegram Node с операцией Answer Callback Query. Для редактирования исходного сообщения используйте операцию Edit Message Text или Edit Message Reply Markup.

    Работа с медиафайлами, документами и состояниями пользователя

    Отправка изображений и файлов

    В узле Telegram Node выберите операции Send Photo, Send Document и т.д. В поле File можно указать прямую ссылку на файл в интернете или использовать двоичные данные (Binary Data) из предыдущих узлов (например, после загрузки файла из интернета или облачного хранилища).

    Организация простого диалога (состояния)

    n8n не имеет встроенной системы состояний (state), но ее можно эмулировать, используя внешнее хранилище или встроенные переменные.

    • Метод 1: Использование узла Set. После получения ответа от пользователя (например, его имени) можно сохранить его в переменной workflow (например, {{$vars.userName}}) и использовать в последующих узлах. Однако это работает в рамках одного выполнения воркфла.
    • Метод 2: Внешняя база данных. Для сохранения данных между сессиями используйте узлы для работы с базами данных (PostgreSQL, SQLite, MySQL) или кэшем (Redis). При получении сообщения сначала проверяйте в базе, на каком этапе диалога находится пользователь (по его chat.id), и в зависимости от этого формируйте ответ.

    Пример логики с базой данных:

    1. Telegram Trigger получает сообщение.
    2. Узел PostgreSQL выполняет запрос на выборку состояния пользователя по chat_id.
    3. Узел IF проверяет состояние. Если состояние «ожидает имя», то текст сообщения сохраняется как имя в базе данных, состояние меняется на «ожидает email», и бот задает следующий вопрос.
    4. При следующем сообщении этого же пользователя цикл повторяется.

    Интеграция с внешними сервисами и API

    Мощь n8n раскрывается при интеграции бота с другими системами. Вы можете:

    • Получать данные о погоде, курсах валют, новостях через соответствующие API (HTTP Request node).
    • Сохранять данные, присланные пользователями, в Google Sheets, Airtable или базу данных.
    • Отправлять уведомления из других систем (например, из CRM или системы мониторинга) в Telegram-чат через бота, используя webhook.
    • Обрабатывать естественный язык через интеграцию с AI-сервисами (OpenAI, например, для создания «умного» помощника).

    Публикация бота в интернет и использование Webhook

    Для работы в режиме реального времени n8n должен быть доступен из публичного интернета, чтобы серверы Telegram могли отправлять ему уведомления.

    1. Настройка вебхука вручную: Используйте узел HTTP Request (метод GET) для вызова API Telegram setWebhook. URL должен вести на публичный адрес вашего n8n с путем к webhook-воркфлу. В n8n для этого используется метод POST к URL вида https://ваш_домен/webhook/ваш_уникальный_id.
    2. Использование встроенного Webhook-узла: Добавьте узел Webhook в качестве триггера. Настройте его (метод POST, путь) и активируйте воркфл. n8n сгенерирует публичный URL (если настроен). Этот URL нужно зарегистрировать в Telegram через вызов setWebhook.
    3. Использование обратного прокси и SSL: Для безопасности Telegram требует HTTPS. Используйте Nginx/Apache в качестве обратного прокси и SSL-сертификат (например, от Let’s Encrypt).

    Отладка и логирование

    Используйте встроенные инструменты n8n для отладки:

    • Режим выполнения (Execution Mode): Запускайте воркфл вручную, подавая тестовые данные на вход триггера.
    • Просмотр данных между узлами: Кликните на соединение между узлами, чтобы увидеть, какие данные передаются. Это ключевой инструмент для написания правильных выражений.
    • Узел Code: Может использоваться для сложных преобразований данных на JavaScript/Python.
    • Узел Spreadsheet File: Полезен для сохранения логов выполнения в файл для последующего анализа.

    Часто задаваемые вопросы (FAQ)

    Как обрабатывать несколько типов событий (сообщения, команды, callback) в одном боте?

    Рекомендуется создать отдельный воркфл-триггер для каждого типа события (Message, Callback Query, Channel Post и т.д.). Это упрощает логику и отладку. Все эти воркфлы могут использовать одни и те же учетные данные бота и обращаться к общим ресурсам (например, базе данных).

    Бот не отвечает на сообщения. В чем могут быть причины?

    • Воркфл не активирован (тумблер вкл/выкл в правом верхнем углу).
    • Неверный или просроченный токен бота в учетных данных.
    • n8n не доступен из интернета (при использовании webhook). Проверьте настройки фаервола, проброс портов и корректность URL в setWebhook.
    • Ошибка в выражении (например, неверный путь к chat.id), приводящая к падению выполнения. Проверьте данные во вкладке Execution Data.

Как ограничить доступ к боту определенным пользователям?

Добавьте узел IF сразу после Telegram Trigger. В условии проверьте, содержится ли {{$node["Telegram Trigger"].json["message"]["chat"]["id"]}} в заранее подготовленном списке разрешенных ID. Если нет — не обрабатывайте сообщение дальше или отправьте ответ «Доступ запрещен».

Можно ли перенести бота, созданного в n8n, на другой сервер?

Да. Экспортируйте воркфл(ы) через меню Workflow -> Export. Импортируйте его на новом экземпляре n8n. Не забудьте заново создать учетные данные (Credentials) для Telegram и, при необходимости, для других сервисов, а также обновить URL webhook в Telegram API.

Как эффективно хранить данные пользователей?

Для простых задач подойдет встроенная база данных SQLite (узел SQLite). Для проектов с множеством пользователей и сложными запросами используйте внешнюю базу: PostgreSQL, MySQL. Для хранения простых пар «ключ-значение» (например, состояние) можно использовать узел Redis.

Есть ли ограничения на количество сообщений или ботов?

Ограничения исходят со стороны Telegram API (примерно 30 сообщений в секунду на бота) и ресурсов вашего сервера, где работает n8n. Сам n8n не накладывает жестких ограничений на количество ботов или воркфлов. Вы можете создать множество воркфлов для одного или разных ботов, используя разные экземпляры узла Telegram Trigger с разными учетными данными.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Войти

Зарегистрироваться

Сбросить пароль

Пожалуйста, введите ваше имя пользователя или эл. адрес, вы получите письмо со ссылкой для сброса пароля.