N8n: Автоматизация проверки подписки на Telegram-группу
N8n — это платформа с открытым исходным кодом для оркестрации рабочих процессов (workflow automation), которая позволяет соединять различные приложения и сервисы без необходимости писать код. Одной из распространенных задач, решаемых с помощью N8n, является автоматическая проверка, является ли пользователь подписчиком определенного Telegram-канала или группы. Это необходимо для организации закрытых сообществ, предоставления доступа к платному контенту, проведения розыгрышей и других сценариев, где доступ должен быть ограничен подписчиками.
Принцип работы и основные компоненты
Проверка подписки в Telegram через N8n основывается на взаимодействии с официальным Telegram Bot API. Сам Telegram не предоставляет прямой метод для проверки подписки ботом. Поэтому используется обходной, но полностью легальный метод: бот пытается получить информацию о членстве конкретного пользователя в конкретном чате. Для реализации этого процесса в N8n требуется создать рабочую цепочку (workflow), которая включает несколько ключевых узлов (nodes).
Основные компоненты такого workflow:
- Триггер: Узел, который запускает весь процесс. Это может быть Webhook (для проверки по запросу из веб-приложения), Telegram Trigger (для реакции на сообщение в личке с ботом) или узел Schedule (для периодической проверки списка пользователей).
- Узел Telegram Bot: Узел для выполнения операций через бота. Конкретно для проверки подписки используется метод
getChatMember. - Узел логики (IF): Узел для анализа результата, полученного от Telegram API, и принятия решения (подписан пользователь или нет).
- Узлы для действий: Ветви workflow, которые выполняются в зависимости от результата проверки (например, отправка приветственного сообщения, отказ в доступе, запись данных в базу).
- Создание Telegram-бота: Через @BotFather нужно создать нового бота и получить его API-токен. Бот должен быть добавлен в целевую группу или канал в качестве администратора (для каналов это обязательно, для групп — рекомендуется, чтобы видеть список участников).
- Получение ID чата: Необходимо узнать идентификатор целевого канала или группы. Для публичных каналов это обычно @username. Для приватных чатов и каналов — числовой ID, который можно получить, добавив в чат бота @username_to_id_bot или отправив сообщение в чат и воспользовавшись методом API
getUpdates. - Получение ID пользователя: Для проверки необходимо знать Telegram User ID пользователя. Это числовой идентификатор, который можно получить, когда пользователь взаимодействует с ботом (например, отправляет команду /start или любое сообщение).
chatId— ID чата с пользователем (он же и является User ID для этого контекста). Доступен как{{$json.message.chat.id}}.userId— также равен{{$json.message.chat.id}}для проверки отправителя. Если проверяется другой пользователь, его ID нужно передать иным способом.- Credential: Выбираются ранее созданные учетные данные бота.
- Chat ID: Сюда вводится ID целевого канала или группы, на подписку которого идет проверка. Например,
-1001234567890для супергруппы или@channel_username. - User ID: Сюда передается извлеченный на предыдущем шаге ID пользователя:
{{$node['Шаг 2'].json['message']['chat']['id']}}. - Condition 1:
statusequalscreator - Condition 2:
statusequalsadministrator - Condition 3:
statusequalsmember - Condition 4:
statusequalsrestricted - Ветка «Пользователь является подписчиком»: Здесь можно добавить узел Telegram Bot для отправки приветственного сообщения, ссылки на закрытый ресурс или код доступа. Также можно подключить узлы для записи данных пользователя в Google Sheets, Airtable или базу данных.
- Ветка «Пользователь не является подписчиком»: Здесь бот может отправить сообщение с просьбой подписаться и предоставить кнопку-ссылку на канал. Для создания кнопки можно использовать форматирование
[Текст кнопки](https://t.me/channel_username)в режиме Markdown. - В базу данных: Используя узлы для PostgreSQL, MySQL или MongoDB, можно обновлять статус подписки пользователя.
- В таблицу: Узлы для Google Sheets или Airtable позволяют вести список пользователей и их статусов.
- В CRM-систему: Через HTTP-запрос или специализированный узел можно обновить карточку клиента в системах типа HubSpot, Pipedrive.
- Бот должен быть администратором в канале, чтобы проверять подписку. В группах (чатах) он может не быть администратором, но тогда он не сможет получить информацию о пользователях, которые скрыли свой профиль.
- Telegram User ID — это уникальный числовой идентификатор. Username (@username) может меняться и не является надежным ключом для долгосрочной идентификации.
- Метод
getChatMemberимеет лимиты частоты запросов, установленные Telegram. При массовых проверках необходимо добавлять задержки между запросами с помощью узла Wait. - Для супергрупп и каналов ID является отрицательным числом (например, -1001234567890). Важно использовать именно этот формат.
- Добавлять обработку ошибок для каждого узла, связанного с внешними API.
- Вести лог всех проверок (например, записывая в отдельную таблицу timestamp, user_id, статус и результат).
- Регулярно обновлять учетные данные бота в N8n, если они были изменены.
- Тестировать workflow при изменении структуры канала или прав бота.
Предварительные требования и настройка
Перед построением workflow в N8n необходимо выполнить следующие шаги:
Пошаговое построение workflow в N8n
Рассмотрим детальную структуру рабочего процесса для проверки подписки, инициируемой отправкой пользователем команды боту.
Шаг 1: Триггер — получение команды от пользователя
Используется узел Telegram Trigger. В его настройках необходимо создать новый ресурс, ввести имя бота и указать полученный от @BotFather токен. В поле «Updates» выбирается «Message». Этот узел будет активироваться каждый раз, когда пользователь отправляет боту любое сообщение или команду. Для фильтрации можно использовать условие на текст, например, «start».
Шаг 2: Извлечение необходимых данных
Данные из триггера приходят в формате JSON. На этом этапе важно извлечь два ключевых параметра:
Также можно извлечь имя пользователя {{$json.message.chat.username}} для логирования.
Шаг 3: Проверка подписки через метод getChatMember
Добавляется узел Telegram Bot. В его настройках выбирается операция «getChatMember». Необходимо заполнить следующие поля:
При выполнении этого узла бот отправляет запрос к Telegram API. Ответ содержит объект с информацией о статусе пользователя в чате.
Шаг 4: Анализ ответа от Telegram API
Ответ от метода getChatMember имеет поле status. Возможные значения и их расшифровка представлены в таблице:
| Значение status | Описание | Является подписчиком? |
|---|---|---|
| creator | Создатель чата | Да |
| administrator | Администратор чата | Да |
| member | Обычный участник | Да |
| restricted | Ограниченный участник (может читать) | Да |
| left | Пользователь покинул чат | Нет |
| kicked | Пользователь забанен | Нет |
Для проверки добавляется узел IF. Условие настраивается так, чтобы ветвь «Да» соответствовала статусам, означающим наличие в чате. Например:
Все условия объединяются оператором OR (ИЛИ).
Шаг 5: Действия в зависимости от результата
После узла IF workflow разделяется на две ветви.
Расширенные сценарии и оптимизация
Базовый workflow можно значительно расширить для решения более сложных задач.
Проверка подписки на несколько каналов
Необходимо последовательно добавить несколько узлов «Telegram Bot» (getChatMember) для каждого канала, а затем в узле IF объединить условия через AND (И). Альтернативно, можно использовать узел Code для написания скрипта, который выполнит несколько проверок и вернет общий результат.
Интеграция с внешними системами
Результат проверки можно сохранять:
Периодическая массовая проверка
Вместо триггера от сообщения можно использовать узел Schedule для запуска процесса по расписанию. Workflow будет читать список пользователей из базы данных (через узел «MySQL» или «Google Sheets»), в цикле (с помощью узла Loop) проверять статус каждого и обновлять его в источнике данных.
Кэширование результатов
Чтобы не нагружать Telegram API частыми запросами для одного и того же пользователя, можно реализовать простой кэш. Например, записывать время последней успешной проверки и ее результат в поля базы данных пользователя. Перед вызовом метода getChatMember проверять, не проверялся ли пользователь, например, в последние 24 часа.
Ограничения и важные замечания
Ответы на часто задаваемые вопросы (FAQ)
Можно ли проверить подписку на приватный канал?
Да, можно. Ключевое условие — бот должен быть добавлен в этот приватный канал в качестве администратора. Дальнейшая процедура проверки идентична работе с публичным каналом.
Что делать, если пользователь скрыл свой номер телефона в настройках приватности группы?
Если бот является администратором группы, он все равно сможет получить статус пользователя через getChatMember, даже если номер телефона скрыт. Если бот не администратор, проверка для такого пользователя, скорее всего, завершится ошибкой.
Как отличить обычного участника от администратора при проверке?
В ответе метода getChatMember для администраторов возвращается статус administrator, а также дополнительный объект can_* с правами. Это позволяет создавать разные сценарии для разных ролей участников.
Можно ли использовать этот метод для проверки подписки в Telegram-чате (не канале)?
Да, метод работает для супергрупп (чатов) и каналов. Принцип реализации абсолютно одинаков. Важно корректно указать ID чата.
Как обработать ситуацию, если канал или бот не существуют?
N8n узел Telegram Bot вернет ошибку выполнения. Для обработки таких сценариев следует использовать встроенную механику обработки ошибок в N8n (Error Trigger), подключив ее к узлу, или настроить ветку «False» в узле IF, которая будет анализировать не только статус, но и наличие ошибки в выполнении предыдущего узла.
Альтернативен ли этот способ использованию бота @BotFather или другим сервисам?
Это единственный официальный способ, предоставляемый Telegram Bot API. Все сторонние сервисы и библиотеки в конечном итоге используют именно метод getChatMember. N8n предоставляет удобный визуальный интерфейс для его интеграции в более сложные бизнес-процессы.
Как повысить надежность workflow?
Рекомендуется:
Добавить комментарий