Отличный вопрос, который затрагивает важный аспект работы с Telegram API. Отвечу максимально подробно и структурированно.
Краткий ответ
Нет прямого и официального способа получить id_user
в Telegram только по номеру телефона. Это сделано intentionally (намеренно) для защиты приватности пользователей. Однако существуют обходные методы, которые требуют активного участия целевого пользователя.
---
Подробное объяснение
1. Почему это невозможно напрямую?
Telegram серьезно относится к конфиденциальности. Их API не предоставляет метода для поиска пользователя по номеру телефона без того, чтобы этот пользователь уже был в ваших контактах или имел какое-либо взаимодействие с вашим ботом/приложением.
- Принцип конфиденциальности: Номер телефона считается конфиденциальной информацией.
- Спам-защита: Прямой доступ к ID по номеру телефона открыл бы дверь для массового спама и сканирования баз данных.
2. Обходные методы (когда это может сработать)
Есть несколько сценариев, при которых вы можете получить user_id
, зная номер телефона.
Способ 1: Через импорт контактов (Bot API)
Это самый надежный и официальный метод, но он требует, чтобы пользователь был в ваших контактах на устройстве, с которого запущен код, или чтобы вы заранее импортировали его номер.
Логика процесса:
- Ваше приложение импортирует номер телегрмма в свои контакты.
- Используя метод
getContacts
(или аналогичный через библиотеки), вы получаете информацию о пользователях из вашей телефонной книги, которые используют Telegram. - Среди этих данных вы ищете нужный номер телефона и извлекаете связанный с ним
user_id
.
Пример кода на PHP с использованием библиотеки irazasyed/telegram-bot-sdk
:
- Установите библиотеку через Composer:
composer require irazasyed/telegram-bot-sdk
- Пример кода:
<?php require_once 'vendor/autoload.php'; use TelegramBotApi; // Инициализируйте API с вашим токеном бота $telegram = new Api('YOUR_BOT_TOKEN'); // Ваш номер телефона (в международном формате, без пробелов и скобок) $phoneNumber = '+79001234567'; try { // 1. Этот метод часто требует предварительной авторизации пользователя. // 2. Вместо `getContacts` современные клиенты используют `importContact` // и затем получают обновления. Прямой метод `getContacts` в чистом Bot API часто недоступен. // Это больше иллюстрация логики. // Лучше использовать метод `importContact` (если доступен в вашей библиотеке) // или работать через клиент MTProto (см. Способ 3). // Этот блок кода показывает идею, но может не работать с публичным Bot API напрямую. $contacts = $telegram->getContacts(); $foundUser = null; foreach ($contacts as $user) { if (isset($user->phone_number) && $user->phone_number === $phoneNumber) { $foundUser = $user; break; } } if ($foundUser) { $user_id = $foundUser->id; echo "ID пользователя с номером $phoneNumber: $user_id"; } else { echo "Пользователь с таким номером не найден в ваших контактах Telegram."; } } catch (Exception $e) { echo 'Ошибка: ', $e->getMessage(); }
Важно: Прямое использование getContacts
в Bot API ограничено. На практике для этого чаще используется Telegram Client API (MTProto).
Способ 2: Через глубокую ссылку (Deep Link) и вашего бота
Это самый чистый и рекомендуемый метод, если вы можете взаимодействовать с пользователем.
Логика процесса:
- Вы создаете специальную ссылку, которая запускает вашего бота и передает ему уникальный параметр (например,
?start=12345
, где12345
— это временный идентификатор, привязанный к номеру телефона в вашей БД). - Вы отправляете эту ссылку пользователю на его номер телефона (через SMS, мессенджер и т.д.).
- Пользователь кликает на ссылку, запускает бота и нажимает кнопку
Start
. - Ваш бот получает команду
/start 12345
вместе сuser_id
иchat_id
этого пользователя. - Сервер вашего бота сопоставляет временный идентификатор
12345
из БД с полученнымuser_id
.
Реализация:
- На стороне PHP (создание записи в БД и отправка SMS):
<?php // Генерируем уникальный код и сохраняем его в БД, связав с номером телефона $temp_code = bin2hex(random_bytes(5)); // e.g., 'a1b2c3d4e5' $phone = '+79001234567'; // Записываем в БД: INSERT INTO temp_codes (phone, code) VALUES (?, ?) $pdo->prepare("INSERT INTO temp_codes (phone, code) VALUES (?, ?)")->execute([$phone, $temp_code]); // Формируем deep-ссылку $bot_username = 'your_bot_name'; $deep_link = "https://t.me/{$bot_username}?start={$temp_code}"; // Отправляем ссылку пользователю (интеграция с SMS-сервисом) sendSMS($phone, "Привет! Перейди по ссылке, чтобы подтвердить аккаунт: " . $deep_link);
- Код вашего бота (обработчик команды /start):
// $update - объект входящего обновления от Telegram $message = $update->getMessage(); $user_id = $message->getFrom()->getId(); $text = $message->getText(); // Будет выглядеть как "/start a1b2c3d4e5" if (strpos($text, '/start') === 0) { $parts = explode(' ', $text); if (count($parts) > 1) { $temp_code = $parts[1]; // Извлекаем наш код 'a1b2c3d4e5' // Ищем код в БД $stmt = $pdo->prepare("SELECT phone FROM temp_codes WHERE code = ?"); $stmt->execute([$temp_code]); $data = $stmt->fetch(); if ($data) { $phone = $data['phone']; // Сохраняем связь phone -> user_id в постоянную таблицу $pdo->prepare("INSERT INTO users (phone, telegram_id) VALUES (?, ?) ON DUPLICATE KEY UPDATE telegram_id = ?")->execute([$phone, $user_id, $user_id]); // Удаляем использованный временный код $pdo->prepare("DELETE FROM temp_codes WHERE code = ?")->execute([$temp_code]); // Отправляем ответ пользователю $telegram->sendMessage([ 'chat_id' => $user_id, 'text' => 'Спасибо! Ваш аккаунт привязан.' ]); } } }
Способ 3: Использование Telegram Client API (MTProto)
Это самый низкоуровневый и мощный метод. Он эмулирует работу официального клиента Telegram. Библиотеки вроде danog/madelineproto
для PHP позволяют это сделать.
Внимание: Это сложный метод, требующий авторизации как пользователь (а не как бот), и он может нарушать условия обслуживания Telegram, если используется для спама.
Пример (очень упрощенно):
- Установите библиотеку:
composer require danog/madelineproto
- Вы должны авторизоваться как пользователь (получить
api_id
иapi_hash
на my.telegram.org). - Импортируйте контакт и найдите его.
<?php require_once 'vendor/autoload.php'; $MadelineProto = new danogMadelineProtoAPI('session.madeline'); // ... Авторизация ... $phone = '+79001234567'; // Импортируем контакт $inputPhoneContact = ['_' => 'inputPhoneContact', 'client_id' => 0, 'phone' => $phone, 'first_name' => 'Temp First Name', 'last_name' => 'Temp Last Name']; $contacts = $MadelineProto->contacts->importContacts(['contacts' => [$inputPhoneContact]]); // В ответе будет массив пользователей if (!empty($contacts['users'])) { $user = $contacts['users'][0]; $user_id = $user['id']; echo "ID пользователя: $user_id"; } else { echo "Не удалось найти пользователя."; }
---
Сводная таблица методов
| Метод | Требуется участие пользователя | Сложность | Надежность | Легальность |
| :--- | :--- | :--- | :--- | :--- |
| Deep Link + Бот | Да | Средняя | Очень высокая | Полностью |
| Импорт контактов (Client API) | Нет (но должен быть в контактах) | Высокая | Высокая | Серая зона |
| Прямой запрос к API | Нет | Низкая | Нулевая | Невозможно |
Вывод и рекомендация
Настоятельно рекомендую использовать Способ 2 (Deep Link с ботом). Это:
- Легально и соответствует политике Telegram.
- Надежно и стабильно.
- Уважает конфиденциальность пользователя — он сам решает, переходить по ссылке или нет.
- Универсально — работает всегда, когда пользователь есть в Telegram.
Попытки получить user_id
без ведома пользователя часто ведут в тупик, нарушают правила и являются плохой практикой.