簡體   English   中英

如何在電報中獲取電話號碼的 user_id

[英]How to get user_id of a phone number in telegram

我正在創建一個機器人來向 Telegram 中的多個聯系人發送消息。 用戶可以與機器人共享聯系人。 然后我使用 getUpdates 並獲取電話號碼。 為了使用sendMessage 方法,我需要chat_id。 現在如何通過他的電話號碼獲取用戶的chat_id? 有沒有比這種方法更好的方法來做到這一點?

為了讓互聯網服務保持活力,他們需要與任何類型的垃圾郵件作斗爭。 結果,Telegram 機器人無法開始向尚未開始使用該機器人的用戶發送消息!

只有當用戶開始使用機器人時,您才能看到他/她的chat_id並向他發送消息。

話雖如此,如果一個用戶(用戶 A)向你發送了另一個用戶的contact (我們稱之為用戶 B),你可以看到用戶 B 的user_id 。但是你仍然不能直接發送任何消息,除非他/她之前也開始使用機器人。

這種行為使我們能夠采取一種解決方法並通過電話號碼查詢用戶,或者至少在需要時確認用戶的電話號碼。

為此,首先,您需要創建contact消息。 誰發送消息並不重要,即使是機器人也可以發送消息。 這個想法是讓 Telegram 填寫新contact消息的user_id 您可以在此處閱讀有關此對象的信息:聯系對象

我們需要使用的方法是sendContact ,它需要一個目標chat_id 、一個first_name和一個phone_number 現在first_name可以是任何字符串,它的值與過程無關。 此外, chat_id可以是任何用戶與機器人聊天的標識,甚至是您的。 它也可以是機器人是具有寫訪問權限的管理員的組或頻道的名稱,例如@my_private_bot_channel 簡而言之,機器人可以在任何地方發布消息。 所以你只需要提供phone_number

發送消息后,您將收到服務器響應,以及您的機器人剛剛發布的消息 這條新創建的消息的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是我們感興趣的部分。現在您可以刪除您的消息了。

有一個問題:即使您擁有 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 以“私人”寫入用戶。 為此,無需知道 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) 你也從上一次調用中得到的 first_name

user_id 位於:

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

一些細節:

1) 似乎 Telegram 不檢查 first_name。 因此,如果您為第二個電話發送的 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 禁止他進入群組或頻道。

截至 2021 年 5 月,已接受的答案不再有效,據我所知,Telegram 已取消機器人根據電話號碼查找 user_id 的功能。

可以從用戶帳戶做到這一點,而不是機器人,按照說明這里概述(主要是通過使用importContacts API )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM