如何在电报中获取电话号码的 user_id

Posted

技术标签:

【中文标题】如何在电报中获取电话号码的 user_id【英文标题】:How to get user_id of a phone number in telegram 【发布时间】:2017-05-31 21:16:09 【问题描述】:

我正在创建一个机器人来向 Telegram 中的多个联系人发送消息。 用户可以与机器人共享联系人。然后我使用 getUpdates 并获取电话号码。 为了使用 sendMessage 方法,我需要 chat_id。 现在如何用他的电话号码获取用户的chat_id? 有没有比这种方法更好的方法来做到这一点?

【问题讨论】:

机器人无法联系之前没有写过机器人的用户。 如果有人使用 Telegram 中注册的电话号码向机器人发送联系人,则联系人中有一个附加字段 user_id,但正如我之前所说,您的机器人无法联系该用户如果用户之前没有写过机器人。 【参考方案1】:

要使互联网服务保持活力,它们需要与任何类型的垃圾邮件作斗争。因此,Telegram 机器人无法开始向尚未开始使用该机器人的用户发送消息!

只有当用户开始使用机器人时,您才能看到他/她的chat_id 并向他发送消息。

话虽如此,如果用户(用户 A)向您发送了另一个用户(我们称之为用户 B)的 contact 详细信息,您可以看到用户 B 的 user_id。但是您仍然可以不要直接发送任何消息,除非他/她之前也开始使用该机器人。

这种行为使我们能够制定变通方法并通过电话号码查询用户,或者至少在需要时确认用户的电话号码。

为此,首先,您需要创建contact 消息。谁发送消息并不重要,即使是机器人也可以发送消息。这个想法是让 Telegram 填充新的contact 消息的user_id。您可以在此处阅读有关此对象的信息:Contact Object

我们需要使用的方法是sendContact,它需要一个目标chat_id、一个first_name和一个phone_number。现在first_name 可以是任何字符串,它的值与进程无关。此外,chat_id 可以是任何用户与机器人聊天的标识,甚至是你的。它也可以是组或频道的名称,其中机器人是具有写入权限的管理员,例如 @my_private_bot_channel。简而言之,机器人可以在任何地方发布消息。所以你只需要提供phone_number

发送消息后,您将收到服务器响应,以及您的机器人刚刚发布的Message。这条新创建的消息的contact 字段包含有关您刚刚分享他的联系人的用户的信息,可能还有他/她的电报user_id,这与用户的聊天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是我们感兴趣的部分,现在你可以删除你的留言了。

【讨论】:

请原谅我的英语语法不好。欢迎任何编辑我的句子? @AlenooshBaghumian 不!请注意,first_name 可以是任何字符串。 chat_id 也可以是你自己的chat_id! @pedram 111:2222222 必须替换为机器人令牌。 我认为电报改变了政策,因为大约 1 个月我只能通过 sendcontact 看到我的 user_id,另一个电话号码为 user_id @علیرضا 返回 0 这不再起作用了。【参考方案2】:

有一个问题:即使您拥有 user_id,您也无法将消息从机器人发送给作为对话发起者的用户。

【讨论】:

@AnkitBajpai 是的,它确实提供了问题的答案。说你做不到是一个答案。如果您认为这不是一个有用的答案,您可以通过投反对票来反映该意见。【参考方案3】:

知道 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 以“私人”方式写入用户。为此,无需知道 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) 用户的电话号码。你无法从 Telegram 获得它。这意味着您需要向用户询问。

2) 聊天 ID。你从之前的电话中得到它

3) 您也从上一次通话中获得的 first_name

user_id 位于:

      $jsondata['result']['contact']['user_id']

一些细节:

1) Telegram 似乎没有检查名字。因此,如果您发送第二个电话,与您从第一个电话获得的名字不同的名字,没关系(但发送相同的名字可能更安全。在所有情况下,您从第一个电话中得到它!)

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 将他从群组或频道中禁止。

【讨论】:

【参考方案4】:

自 2021 年 5 月起,accepted answer 不再有效,据我所知,Telegram 已取消机器人根据电话号码查找 user_id 的功能。

可以按照outlined here 的说明(主要是使用importContacts API)从用户帐户而不是机器人执行此操作。

【讨论】:

以上是关于如何在电报中获取电话号码的 user_id的主要内容,如果未能解决你的问题,请参考以下文章

Android - 向特定号码发送电报消息

在android中获取firebase用户ID

如何在颤动中获取用户的电话号码

在 Laravel Auth() 中通过电子邮件/电话号码登录

如何在我的通讯录中获取对应姓名的电话号码?

无法将关键字“用户名”解析为字段。选项有:地址、年龄、城市、国家、性别、姓名、电话、pt_id、用户、user_id