Telegramの複数の連絡先にメッセージを送信するボットを作成しています。ユーザーはボットと連絡先を共有できます。次に、getUpdatesを使用して電話番号を取得します。 sendMessageメソッドを使用するには、chat_idが必要です。今、彼の電話番号でユーザーのchat_idを取得する方法?これを行うには、この方法よりも良い方法はありますか?
インターネットサービスを存続させるには、あらゆる種類のスパムと戦う必要があります。その結果、Telegramボットは、まだボットの使用を開始していないユーザーへのメッセージ送信を開始できません!
ユーザーがボットの使用を開始したときにのみ、彼/彼女のchat_id
と彼にメッセージを送信します。
つまり、ユーザー(ユーザーA)が別のユーザーのcontact
詳細(ユーザーBを呼び出しましょう)を送信すると、user_id
ユーザーBの。ただし、以前にボットの使用を開始していない限り、メッセージを直接送信することはできません。
この動作により、回避策を実行し、電話番号でユーザーにクエリを送信したり、必要に応じて少なくともユーザーの電話番号を確認したりできます。
そのためには、最初にcontact
メッセージを作成する必要があります。誰がメッセージを送信したかは関係ありません。ボットもメッセージを送信できます。アイデアは、Telegramにuser_id
新しいcontact
メッセージの。このオブジェクトについては、ここで読むことができます: Contact Object
使用する必要があるメソッドは sendContact であり、ターゲットchat_id
、a 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
は、関心のある部分です。これで、メッセージを削除できます。
問題があります: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>";
ご覧のとおり、この2番目のメッセージを送信するには、3つの情報が必要です。
1)ユーザーの電話番号。 Telegramからは入手できません。つまり、ユーザーに尋ねる必要があります。
2)chat_id。前の呼び出しから取得します
3)前の呼び出しからも取得したfirst_name
User_idは次の場所にあります。
$jsondata['result']['contact']['user_id']
いくつかの詳細:
1)Telegramはfirst_nameをチェックしないようです。したがって、最初の呼び出しから取得したものとは異なるfirst_nameの2番目の呼び出しに送信する場合は重要ではありません(ただし、同じものを送信する方が安全です。すべての場合、最初の呼び出しから取得します!)
2)間違った電話番号で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を使用してグループまたはチャンネルからユーザーを禁止することもできます。