Я создаю бота для отправки сообщения нескольким контактам в Telegram. пользователь может обмениваться контактами с ботом. то я использую getUpdates и получаю номер телефона. Для использования метода sendMessage мне нужен chat_id. теперь как получить chat_id пользователя с его номером телефона? Есть ли способ лучше, чем этот метод?
Как получить user_id номера телефона в телеграмме
Ответ 1
Чтобы интернет-услуги оставались в живых, им нужно бороться с любым типом спама. В результате боты Telegram не могут отправлять сообщения пользователям, которые еще не начали использовать бота!
Только когда пользователь начинает использовать бота, вы можете видеть его/ее chat_id
и отправлять ему сообщения.
Если пользователь (Пользователь А) отправляет вам contact
информацию о другом пользователе (позвольте этому пользователю, пользователю B), вы можете видеть user_id
пользователя B. Однако вы все еще можете ' t отправлять любые сообщения напрямую, если только он не начал использовать бот раньше.
Это позволяет нам сделать обходной путь и запросить пользователей по номеру телефона или хотя бы подтвердить номер телефона пользователя, если это необходимо.
Для этого сначала необходимо создать сообщение contact
. Неважно, кто передает сообщение, даже бот может отправить сообщение. Идея состоит в том, чтобы Telegram заполнил user_id
нового сообщения contact
. Вы можете прочитать об этом объекте здесь: Контактный объект
Метод, который нам нужно использовать, - sendContact, и ему нужны целевые chat_id
, first_name
и phone_number
, Теперь first_name
может быть любой строкой, и ее значение не имеет отношения к процессу. Кроме того, chat_id
может быть идентификацией любого пользовательского чата с ботом, даже вашим. Это также может быть имя группы или канала, в котором бот является администратором с доступом для записи, например, @my_private_bot_channel
. Короче говоря, где-нибудь, что бот может опубликовать сообщение. Поэтому вам нужно предоставить phone_number
.
После отправки сообщения вы получите ответ сервера, а также Message, который только что опубликовал ваш бот. Поле contact
этого вновь созданного сообщения содержит информацию о пользователе, с которым вы просто делились своим контактом, возможно, вместе с его телеграммой user_id
, которая является тем же самым, что и идентификатор пользователя.
Сразу после этого вы можете удалить свое сообщение с помощью метода deleteMessage.
Ниже приведен пример этого в простом формате запроса/ответа, но вы, вероятно, должны использовать для этого фреймворк:
https://api.telegram.org/{BOT_TOKEN}/sendContact?chat_id=123456789&phone_number=+989123456789&first_name=Some+Random+String
Ответ на этот запрос следующий:
{
"ok": true,
"result": {
"message_id": 12345678987654321,
"from": {
"id": 987654321,
"first_name": "The Bot Name",
"username": "mybot_bot"
},
"chat": {
"id": 123456789,
"first_name": "Your Chat Party",
"last_name": "Your Chat Party",
"type": "private"
},
"date": 1484612850,
"contact": {
"phone_number": "989123456789",
"first_name": "Some Random String",
"user_id": 654789321
}
}
}
"user_id": 654789321
- это та часть, которая нас интересует. Теперь вы можете удалить свое сообщение.
Ответ 2
Возникла проблема: вы не можете отправить сообщение от бота пользователю в качестве инициатора беседы, даже если у вас есть user_id.
Ответ 3
Знание user_id может быть полезно для запрета и unban. Вот как я это делаю на своем веб-сайте:
1) создайте небольшой случайный код и покажите его пользователю, сообщив ему отправить его вашему боту.
2) прочитайте сообщение, используя getUpdate. Итак, в PHP:
$url = "https://api.telegram.org/bot"._TELEGRAM_BOT_TOKEN."/getUpdates?offset=-1";
$response = file_get_contents($url, false, NULL);
$jsondata = json_decode($response,true);
echo "<pre>";
print_r($jsondata);
echo "</pre><br>";
Вы получите 3 информации:
$chat_id = $jsondata['result'][0]['message']['chat']['id'];
$first_name = $jsondata['result'][0]['message']['chat']['first_name'];
$text = $jsondata['result'][0]['message']['text'];
Вам просто нужно сравнить текст, который вы читаете, с кодом, который вы запрашиваете у пользователя. Если это то же самое, вы можете прочитать chat_id и first_name.
На данный момент у вас есть chat_id, которого достаточно, чтобы написать пользователю в "приватном". Для этого не нужно знать user_id.
Если вам нужен идентификатор пользователя, вы должны отправить другое сообщение. Как этот:
$num = "+55888888888888";
$url = "https://api.telegram.org/bot"._TELEGRAM_BOT_TOKEN."/sendContact?chat_id=".$chat_id."&phone_number=".$num."&first_name=".$first_name;
$response = file_get_contents($url, false, NULL);
$jsondata = json_decode($response,true);
echo "<pre>";
print_r($jsondata);
echo "</pre><br>";
Как вы можете видеть, для отправки этого второго сообщения вам потребуется 3 информации:
1) номер телефона пользователя. Вы НЕ МОЖЕТЕ получить его от Telegram. Это означает, что вам нужно спросить об этом у пользователя.
2) chat_id. Вы получите его из предыдущего вызова
3) first_name вы получаете его также из предыдущего вызова
User_id находится по адресу:
$jsondata['result']['contact']['user_id']
Некоторые детали:
1) Кажется, Telegram не проверяет first_name. Поэтому, если вы отправляете второй вызов, другое имя первого, чем тот, который вы получаете от первого вызова, это не имеет значения (но, возможно, более безопасно отправлять его. Во всех случаях вы получаете его от первого вызова!)
2) если вы выполняете второй вызов с неправильным номером телефона, вы получите результат БЕЗ записи user_id.
Поэтому вы должны:
$a = isset( $jsondata['result']['contact']['user_id']);
if ($a == false)
{
$user_id = 0; // No user_id
}
else
{
$user_id = $jsondata['result']['contact']['user_id'];
}
3) Номер телефона должен иметь код страны. +5599888887777 в порядке, но 99888887777 нет и даст вам ответ без записи user_id.
Теперь вы можете поговорить с пользователем, используя chat_id, а также запретить его из группы или канала, используя свой user_id.