Как получить id_user телеграмма через его телефон?

Отличный вопрос, который затрагивает важный аспект работы с Telegram API. Отвечу максимально подробно и структурированно.

Краткий ответ

Нет прямого и официального способа получить id_user в Telegram только по номеру телефона. Это сделано intentionally (намеренно) для защиты приватности пользователей. Однако существуют обходные методы, которые требуют активного участия целевого пользователя.

---

Подробное объяснение

1. Почему это невозможно напрямую?

Telegram серьезно относится к конфиденциальности. Их API не предоставляет метода для поиска пользователя по номеру телефона без того, чтобы этот пользователь уже был в ваших контактах или имел какое-либо взаимодействие с вашим ботом/приложением.

  • Принцип конфиденциальности: Номер телефона считается конфиденциальной информацией.
  • Спам-защита: Прямой доступ к ID по номеру телефона открыл бы дверь для массового спама и сканирования баз данных.

2. Обходные методы (когда это может сработать)

Есть несколько сценариев, при которых вы можете получить user_id, зная номер телефона.

Способ 1: Через импорт контактов (Bot API)

Это самый надежный и официальный метод, но он требует, чтобы пользователь был в ваших контактах на устройстве, с которого запущен код, или чтобы вы заранее импортировали его номер.

Логика процесса:

  1. Ваше приложение импортирует номер телегрмма в свои контакты.
  2. Используя метод getContacts (или аналогичный через библиотеки), вы получаете информацию о пользователях из вашей телефонной книги, которые используют Telegram.
  3. Среди этих данных вы ищете нужный номер телефона и извлекаете связанный с ним user_id.

Пример кода на PHP с использованием библиотеки irazasyed/telegram-bot-sdk:

  1. Установите библиотеку через Composer:
    composer require irazasyed/telegram-bot-sdk
  1. Пример кода:
    <?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) и вашего бота

Это самый чистый и рекомендуемый метод, если вы можете взаимодействовать с пользователем.

Логика процесса:

  1. Вы создаете специальную ссылку, которая запускает вашего бота и передает ему уникальный параметр (например, ?start=12345, где 12345 — это временный идентификатор, привязанный к номеру телефона в вашей БД).
  2. Вы отправляете эту ссылку пользователю на его номер телефона (через SMS, мессенджер и т.д.).
  3. Пользователь кликает на ссылку, запускает бота и нажимает кнопку Start.
  4. Ваш бот получает команду /start 12345 вместе с user_id и chat_id этого пользователя.
  5. Сервер вашего бота сопоставляет временный идентификатор 12345 из БД с полученным user_id.

Реализация:

  1. На стороне 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);
  1. Код вашего бота (обработчик команды /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, если используется для спама.

Пример (очень упрощенно):

  1. Установите библиотеку: composer require danog/madelineproto
  2. Вы должны авторизоваться как пользователь (получить api_id и api_hash на my.telegram.org).
  3. Импортируйте контакт и найдите его.
<?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 с ботом). Это:

  1. Легально и соответствует политике Telegram.
  2. Надежно и стабильно.
  3. Уважает конфиденциальность пользователя — он сам решает, переходить по ссылке или нет.
  4. Универсально — работает всегда, когда пользователь есть в Telegram.

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