Как получить и сохранить номер телефона из Telegram в n8n? Я использую n8n локально для обучения. Проблема в том, что я отправляю клавиатуру с запросом номера телефона (request_number=true), но не понимаю, как получить этот номер. Когда я нажимаю “Поделиться номером” в Telegram, процесс в n8n уже завершается и не дожидается моего ответа. Ноды типа Wait также не помогают, так как возвращают старый ответ без контакта. Как правильно настроить получение номера телефона в n8n при работе с Telegram?
В n8n для получения номера телефона из Telegram необходимо использовать правильную комбинацию нод Telegram Trigger и Wait for Webhook, настроив их на обработку callback-запросов при отправке контакта. Ключевая проблема заключается в том, что Telegram отправляет callback-запрос немедленно при нажатии кнопки “Поделиться номером”, и n8n должна быть настроена на его обработку, а не на ожидание обычного сообщения.
Содержание
- Основной подход к получению номера телефона
- Настройка Telegram Trigger
- Использование Wait for Webhook
- Обработка callback-запросов
- Полный пример workflow
- Распространенные проблемы
- Альтернативные методы
Основной подход к получению номера телефона
Для получения номера телефона из Telegram в n8n нужно понимать механизм работы кнопок с request_number. Когда пользователь нажимает “Поделиться номером”, Telegram отправляет callback-запрос, а не обычное сообщение. Поэтому стандартный Telegram Trigger не сработает должным образом.
Правильный подход включает:
- Использование Telegram Trigger с настроенным прослушиванием callback-запросов
- Настройку Wait for Webhook для ожидания ответа от Telegram
- Обработку полученного callback-запроса и извлечение номера телефона
- Сохранение номера в нужном формате
Важно: При настройке request_number=true в inline-клавиатуре, Telegram отправляет callback_query, который содержит информацию о нажатии кнопки, но не сам номер телефона. Номер телефона нужно запрашивать отдельно после получения callback.
Настройка Telegram Trigger
Для proper настройки получения номеров телефонов в n8n выполните следующие шаги:
-
Добавьте ноду Telegram Trigger на canvas
-
В настройках ноды выберите операцию “On Trigger”
-
В разделе “Choose Trigger” установите:
- Bot Token (ваш токен Telegram бота)
- Trigger Type: “Callback Query”
- Webhook URL: ваш локальный URL для приема webhook (например,
http://localhost:5678/webhook/telegram)
-
В настройках Security:
- Установите флажок “Validate Certificate”
- В поле “Secret” укажите секретный ключ для подписи webhook
{
"operation": "onTrigger",
"parameters": {
"botToken": "ваш_токен_бота",
"webhookUrl": "http://localhost:5678/webhook/telegram",
"secret": "ваш_секретный_ключ",
"validateCertificate": true
}
}
Использование Wait for Webhook
После получения callback-запроса необходимо дождаться ответа от Telegram с номером телефона:
-
Добавьте ноду Wait for Webhook после Telegram Trigger
-
Настройте ее параметры:
- Webhook Name:
telegram_phone_response(уникальное имя) - Timeout: 30000 (30 секунд)
- Continue On Timeout: false
- Webhook Name:
-
В разделе “Response Type” выберите “JSON”
-
В настройках “Response Mapping” укажите путь к данным номера телефона
{
"operation": "waitForWebhook",
"parameters": {
"webhookName": "telegram_phone_response",
"timeout": 30000,
"continueOnTimeout": false,
"responseType": "json",
"responseMapping": {
"phoneNumber": "$.data.contact.phone_number"
}
}
}
Обработка callback-запросов
При получении callback-запроса от Telegram, содержащего информацию о нажатии кнопки “Поделиться номером”, необходимо:
- Идентифицировать callback: В данных callback_query будет поле
data, содержащее информацию о нажатой кнопке - Отправить запрос на получение контакта: Используйте метод
getContactTelegram API - Обработать полученный контакт: Извлеките номер телефона из объекта контакта
Пример обработки в Set node:
{
"operation": "set",
"parameters": {
"values": {
"callbackId": "={{ $json.callback_query.id }}",
"chatId": "={{ $json.callback_query.message.chat.id }}",
"buttonData": "={{ $json.callback_query.data }}",
"requestContact": "={{ $json.callback_query.data.includes('request_contact') }}"
}
}
}
Затем используйте ноду HTTP Request для вызова метода Telegram API:
{
"operation": "httpRequest",
"parameters": {
"url": "https://api.telegram.org/bot{{ $credentials.telegramBotToken }}/getContact",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"body": {
"chat_id": "={{ $json.chatId }}",
"user_id": "={{ $json.callback_query.from.id }}"
}
}
}
Полный пример workflow
Вот полный пример workflow для получения номера телефона:
- Telegram Trigger (настроен на callback_query)
- Set (извлечение данных из callback)
- HTTP Request (получение контакта через Telegram API)
- Set (сохранение номера телефона)
- HTTP Response (отправка ответа пользователю)
graph TD
A[Telegram Trigger] --> B[Set - Извлечение данных]
B --> C{Есть callback?}
C -->|Да| D[HTTP Request - getContact]
C -->|Нет| E[Ожидание ответа]
D --> F[Set - Сохранение номера]
F --> G[HTTP Response - Подтверждение]
G --> A
Шаги настройки:
-
Telegram Trigger
- Bot Token: ваш токен
- Trigger Type: Callback Query
- Webhook URL: ваш локальный URL
-
Set Node 1
json{ "callbackId": "={{ $json.callback_query.id }}", "chatId": "={{ $json.callback_query.message.chat.id }}", "buttonData": "={{ $json.callback_query.data }}" } -
HTTP Request Node
json{ "url": "https://api.telegram.org/bot{{ $credentials.telegramBotToken }}/getChat", "method": "POST", "body": { "chat_id": "={{ $json.chatId }}", "user_id": "={{ $json.callback_query.from.id }}" } } -
Set Node 2
json{ "phoneNumber": "={{ $json.result.contact.phone_number }}", "firstName": "={{ $json.result.contact.first_name }}", "lastName": "={{ $json.result.contact.last_name }}" } -
HTTP Response Node
json{ "callbackQueryId": "={{ $json.callbackId }}", "text": "Спасибо! Ваш номер телефона сохранен." }
Распространенные проблемы
Проблема 1: Process завершается до получения номера
Решение: Используйте Wait for Webhook с правильной настройкой callback. Убедитесь, что ваш Telegram Trigger настроен на прием callback_query, а не обычных сообщений.
Проблема 2: Wait возвращает старый ответ
Решение: Настройте Wait for Webhook для конкретного callback, используя уникальный webhook name в каждом запросе.
Проблема 3: Multiple triggers не работают
Решение: Из документации n8n известно, что из-за ограничений Telegram API можно использовать только один Telegram Trigger для каждого бота одновременно. Используйте один trigger с различными типами обработок.
Проблема 4: Номер телефона не извлекается
Решение: Проверьте структуру ответа Telegram API. Номер телефона обычно находится в $json.result.contact.phone_number при использовании метода getChat.
Альтернативные методы
Метод 1: Использование Contact Sharing
Если стандартный метод не работает, можно использовать встроенную функцию обмена контактами:
- Создайте inline-клавиатуру с кнопкой “Поделиться контактом”
- В настройках кнопки установите
request_contact: true - Настройте Telegram Trigger на прием сообщений с контактами
{
"inline_keyboard": [
[
{
"text": "Поделиться номером",
"request_contact": true,
"callback_data": "share_contact"
}
]
]
}
Метод 2: Использование Custom Forms
Как указано в документации n8n, можно использовать custom forms:
- Создайте форму с полем для ввода номера телефона
- Используйте Telegram Trigger для приема сообщений
- Валидируйте формат номера телефона в n8n
Метод 3: HTTP Request + Telegram API
Для более сложных сценариев можно использовать прямой вызов Telegram API через HTTP Request ноду:
{
"operation": "httpRequest",
"parameters": {
"url": "https://api.telegram.org/bot{{ $credentials.telegramBotToken }}/sendMessage",
"method": "POST",
"body": {
"chat_id": "={{ $json.chat_id }}",
"text": "Пожалуйста, поделитесь вашим номером телефона",
"reply_markup": {
"keyboard": [
[
{
"text": "Поделиться номером",
"request_contact": true
}
]
],
"one_time_keyboard": true,
"resize_keyboard": true
}
}
}
}
Заключение
Получение номеров телефонов из Telegram в n8n требует правильной настройки обработки callback-запросов. Ключевые моменты:
- Используйте правильный Trigger: Настройте Telegram Trigger на прием callback_query, а не обычных сообщений
- Обрабатывайте callback немедленно: Когда пользователь нажимает “Поделиться номером”, Telegram отправляет callback, который нужно обработать сразу
- Используйте Wait for Webhook: Для ожидания ответа с контактными данными
- Обрабатывайте данные правильно: Извлекайте номер телефона из полученного ответа Telegram API
- Учитывайте ограничения API: Помните, что можно использовать только один Telegram Trigger на бота
Для локального обучения убедитесь, что ваш n8n сервер доступен из интернета или использует ngrok для создания публичного URL для webhook. Это позволит Telegram отправлять callback-запросы в ваш локальный n8n экземпляр.
Источники
- Telegram node Callback operations documentation | n8n Docs
- Telegram - can’t use query buttons and callbacks - by design - Questions - n8n Community
- Ask a question via Telegram and wait for response? - Questions - n8n Community
- Telegram node Message operations documentation | n8n Docs
- n8n Telegram Bot Integration - MpireSolutions