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

时间:2017-01-16 23:05:28

标签: api telegram telegram-bot

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

4 个答案:

答案 0 :(得分:23)

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

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

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

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

首先,您需要创建contact消息。谁发布消息并不重要,甚至机器人也可以发送消息。我们的想法是让Telegram填充新user_id消息的contact。您可以在此处阅读此对象: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是我们感兴趣的部分。现在您可以删除您的信息。

答案 1 :(得分:1)

存在一个问题:即使您拥有user_id,也无法将僵尸从机器人发送给用户作为会话发起人。

答案 2 :(得分:0)

知道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和名字。

这时,您具有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)chat_id。您从上次通话中获取了

3)您在上一次通话中获得的名字

user_id位于:

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

一些细节:

1)看来Telegram不检查first_name。因此,如果您发送的第二个呼叫与您从第一个呼叫获得的名字不同,则first_name没关系(但是发送相同的消息可能更安全。在所有情况下,您都可以从第一个呼叫获得它!) / p>

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禁止该用户进入群组或频道。

答案 3 :(得分:0)

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

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