web-dev-qa-db-ja.com

電報で電話番号のuser_idを取得する方法

Telegramの複数の連絡先にメッセージを送信するボットを作成しています。ユーザーはボットと連絡先を共有できます。次に、getUpdatesを使用して電話番号を取得します。 sendMessageメソッドを使用するには、chat_idが必要です。今、彼の電話番号でユーザーのchat_idを取得する方法?これを行うには、この方法よりも良い方法はありますか?

15
Majid Sajadi

インターネットサービスを存続させるには、あらゆる種類のスパムと戦う必要があります。その結果、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は、関心のある部分です。これで、メッセージを削除できます。

24
علیرضا

問題があります:user_idを持っている場合でも、会話の開始者としてボットからユーザーにメッセージを送信できません。

1
saied sao

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を使用してグループまたはチャンネルからユーザーを禁止することもできます。

0
Peter