[英]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.