如何在电报中获取 phone 号码的 user_id
How to get user_id of a phone number in telegram
我正在创建一个机器人来向 Telegram 中的多个联系人发送消息。
用户可以与机器人分享联系方式。然后我使用 getUpdates 并获取 phone 号码。
为了使用 sendMessage 方法,我需要 chat_id。
现在如何通过 phone 号码获得用户的 chat_id?
有没有比这个方法更好的办法呢?
要使互联网服务保持活力,他们需要与任何类型的垃圾邮件作斗争。因此,Telegram 机器人无法开始向尚未开始使用该机器人的用户发送消息!
只有当用户开始使用该机器人时,您才能看到 his/hers chat_id
并向他发送消息。
话虽如此,如果用户(用户 A)向您发送另一个用户(我们称其为用户 B)的 contact
详细信息,您可以看到用户 B 的 user_id
. 但是你仍然不能直接发送任何消息,除非he/she之前也开始使用该机器人。
此行为允许我们制定解决方法并通过 phone 号码查询用户,或者至少在需要时确认用户的 phone 号码。
为此,您首先需要创建 contact
消息。谁发送消息并不重要,甚至机器人也可以发送消息。思路是让Telegram填充新的contact
消息的user_id
。您可以在此处阅读有关此对象的信息:Contact Object
我们需要使用的方法是sendContact,它需要一个目标chat_id
、一个first_name
和一个phone_number
。现在 first_name
可以是任何字符串,其值与过程无关。此外,chat_id
可以是任何用户与机器人聊天的标识,甚至是你的。它也可以是 bot 是具有写入权限的管理员的组或频道的名称,例如 @my_private_bot_channel
。简而言之,机器人可以 post 发送消息的任何地方。所以你只需要提供 phone_number
.
发送消息后,您将收到服务器响应,以及您的机器人刚刚 post 编辑的 Message。这个新创建的消息的 contact
字段包含有关您刚刚共享他的联系人的用户的信息,可能还有 his/hers 电报 user_id
这与用户的聊天 ID 相同。
之后您可以使用 deleteMessage 方法删除您的消息。
以下是以普通 request/response 格式执行此操作的示例,但您可能应该为此使用一个框架:
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
是我们感兴趣的部分。现在您可以删除您的留言。
存在一个问题:即使您拥有 user_id.
,也无法将消息从机器人发送给作为对话发起者的用户
了解 user_id 对禁止和取消禁止很有用。
这是我在我的网站上这样做的方式:
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 足以写入 "private" 中的用户。为此,无需知道 user_id.
如果你想要用户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) 用户的phone号。你无法从 Telegram 获得它。这意味着您需要向用户询问。
2) chat_id。你从上次调用中得到它
3) first_name 你也从上次调用中得到它
user_id 位于:
$jsondata['result']['contact']['user_id']
一些细节:
1) Telegram 似乎没有检查 first_name。因此,如果您为第二次调用发送的 first_name 与您从第一次调用中收到的不同,那没关系(但发送相同的调用可能更安全。在所有情况下,您都是从第一个调用中获得的打电话!)
2) 如果您使用错误的 phone 号码执行第二次呼叫,您将得到没有 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) phone号码必须有国家代码。 +5599888887777 可以,但 99888887777 不行,并且会在没有 user_id 条目的情况下给你答案。
现在您可以使用 chat_id 与用户交谈,也可以使用他的 user_id.
将他加入群组或频道。
自 2021 年 5 月起, 不再有效,据我所知,Telegram 已取消机器人根据 [=19= 查找 user_ids 的能力] 数字。
可以按照说明从用户帐户而不是机器人执行此操作outlined here (essentially by using the importContacts API)。
我正在创建一个机器人来向 Telegram 中的多个联系人发送消息。 用户可以与机器人分享联系方式。然后我使用 getUpdates 并获取 phone 号码。 为了使用 sendMessage 方法,我需要 chat_id。 现在如何通过 phone 号码获得用户的 chat_id? 有没有比这个方法更好的办法呢?
要使互联网服务保持活力,他们需要与任何类型的垃圾邮件作斗争。因此,Telegram 机器人无法开始向尚未开始使用该机器人的用户发送消息!
只有当用户开始使用该机器人时,您才能看到 his/hers chat_id
并向他发送消息。
话虽如此,如果用户(用户 A)向您发送另一个用户(我们称其为用户 B)的 contact
详细信息,您可以看到用户 B 的 user_id
. 但是你仍然不能直接发送任何消息,除非he/she之前也开始使用该机器人。
此行为允许我们制定解决方法并通过 phone 号码查询用户,或者至少在需要时确认用户的 phone 号码。
为此,您首先需要创建 contact
消息。谁发送消息并不重要,甚至机器人也可以发送消息。思路是让Telegram填充新的contact
消息的user_id
。您可以在此处阅读有关此对象的信息:Contact Object
我们需要使用的方法是sendContact,它需要一个目标chat_id
、一个first_name
和一个phone_number
。现在 first_name
可以是任何字符串,其值与过程无关。此外,chat_id
可以是任何用户与机器人聊天的标识,甚至是你的。它也可以是 bot 是具有写入权限的管理员的组或频道的名称,例如 @my_private_bot_channel
。简而言之,机器人可以 post 发送消息的任何地方。所以你只需要提供 phone_number
.
发送消息后,您将收到服务器响应,以及您的机器人刚刚 post 编辑的 Message。这个新创建的消息的 contact
字段包含有关您刚刚共享他的联系人的用户的信息,可能还有 his/hers 电报 user_id
这与用户的聊天 ID 相同。
之后您可以使用 deleteMessage 方法删除您的消息。
以下是以普通 request/response 格式执行此操作的示例,但您可能应该为此使用一个框架:
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
是我们感兴趣的部分。现在您可以删除您的留言。
存在一个问题:即使您拥有 user_id.
,也无法将消息从机器人发送给作为对话发起者的用户了解 user_id 对禁止和取消禁止很有用。 这是我在我的网站上这样做的方式:
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 足以写入 "private" 中的用户。为此,无需知道 user_id.
如果你想要用户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) 用户的phone号。你无法从 Telegram 获得它。这意味着您需要向用户询问。
2) chat_id。你从上次调用中得到它
3) first_name 你也从上次调用中得到它
user_id 位于:
$jsondata['result']['contact']['user_id']
一些细节:
1) Telegram 似乎没有检查 first_name。因此,如果您为第二次调用发送的 first_name 与您从第一次调用中收到的不同,那没关系(但发送相同的调用可能更安全。在所有情况下,您都是从第一个调用中获得的打电话!)
2) 如果您使用错误的 phone 号码执行第二次呼叫,您将得到没有 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) phone号码必须有国家代码。 +5599888887777 可以,但 99888887777 不行,并且会在没有 user_id 条目的情况下给你答案。
现在您可以使用 chat_id 与用户交谈,也可以使用他的 user_id.
将他加入群组或频道。自 2021 年 5 月起,
可以按照说明从用户帐户而不是机器人执行此操作outlined here (essentially by using the importContacts API)。