web-dev-qa-db-fra.com

Comment obtenir l'ID utilisateur d'un numéro de téléphone dans un télégramme

En créant un bot pour envoyer un message à plusieurs contacts dans Telegram, l'utilisateur peut partager le contact avec bot. Ensuite, j'utilise getUpdates et j'obtiens le numéro de téléphone. Pour utiliser la méthode sendMessage, j'ai besoin de l'identifiant chat_id. maintenant comment obtenir le chat_id d’un utilisateur avec son numéro de téléphone?

13
Majid Sajadi

Pour que les services Internet restent en vie, ils doivent se battre avec n'importe quel type de spam. En conséquence, les robots Telegram ne peuvent pas commencer à envoyer des messages aux utilisateurs qui n'ont pas encore commencé à utiliser le bot!

Ce n'est que lorsqu'un utilisateur commence à utiliser le bot que vous pouvez voir son chat_id et lui envoyer des messages.

Cela dit, si un utilisateur (utilisateur A) vous envoie un contact détails d'un autre utilisateur (appelons celui-ci, utilisateur B), vous pouvez voir user_id de l'utilisateur B. Cependant, vous ne pouvez toujours pas envoyer de messages directement, il/elle a également commencé à utiliser le bot avant.

Ce comportement nous permet de créer une solution de contournement et d'interroger les utilisateurs par numéro de téléphone ou au moins de confirmer le numéro de téléphone d'un utilisateur, si nécessaire.

Pour ce faire, vous devez d’abord créer un message contact. Peu importe qui envoie le message, même le bot peut l'envoyer. L'idée est de laisser Telegram remplir le user_id du nouveau message contact. Vous pouvez lire sur cet objet ici: Contact Object

La méthode que nous devons utiliser est sendContact et elle a besoin d’un chat_id cible, d’un first_name et d’un phone_number. Désormais, first_name peut être n’importe quelle chaîne et sa valeur n’est pas pertinente pour le processus. En outre, chat_id peut être l'identification du chat de n'importe quel utilisateur, même le vôtre. Il peut également s'agir du nom d'un groupe ou d'un canal dans lequel le bot est un administrateur disposant d'un accès en écriture, par exemple, @my_private_bot_channel. En bref, n'importe quel bot peut poster un message. Il vous suffit donc de fournir le phone_number.

Après l'envoi du message, vous obtiendrez une réponse du serveur, accompagnée du Message que votre bot vient d'envoyer. Le champ contact de ce message nouvellement créé contient des informations sur l'utilisateur que vous venez de partager avec son contact, éventuellement avec son télégramme user_id qui correspond à l'identifiant de chat de l'utilisateur.

Vous pouvez ensuite supprimer votre message avec la méthode deleteMessage .

Voici un exemple de requête dans le format requête/réponse, mais vous devriez probablement utiliser un framework pour cela:

https://api.telegram.org/{BOT_TOKEN}/sendContact?chat_id=123456789&phone_number=+989123456789&first_name=Some+Random+String

La réponse à cette demande est la suivante:

{
    "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 est la partie qui nous intéresse. Vous pouvez maintenant supprimer votre message.

21
علیرضا

Il y a un problème: vous ne pouvez pas envoyer un message d'un bot à un utilisateur en tant qu'initiateur de la conversation, même si vous avez le user_id.

1
saied sao

Connaître le user_id peut être utile pour ban et unban. Voici comment je le fais sur mon site web:

1) créez un petit code aléatoire et montrez-le à l'utilisateur en lui disant de l'envoyer à votre bot.

2) lisez le message en utilisant getUpdate. Donc en 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>";

Vous aurez 3 informations:

  $chat_id = $jsondata['result'][0]['message']['chat']['id'];
  $first_name = $jsondata['result'][0]['message']['chat']['first_name'];
  $text = $jsondata['result'][0]['message']['text'];

Il vous suffit de comparer le texte que vous avez lu avec le code que vous demandez à l'utilisateur d'envoyer. Si c'est la même chose, vous pouvez lire le chat_id et le prénom.

A ce stade, vous avez le chat_id qui est suffisant pour écrire à l'utilisateur en mode "privé". Pour cela, pas besoin de connaître le user_id.

Si vous voulez l'ID utilisateur, vous devez envoyer un autre message. Comme celui-ci:

   $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>";

Comme vous pouvez le constater, pour envoyer ce second message, vous avez besoin de 3 informations:

1) le numéro de téléphone de l'utilisateur. Vous NE POUVEZ PAS l'obtenir de Telegram. Cela signifie que vous devez le demander à l'utilisateur.

2) le chat_id. Vous l'obtenez de l'appel précédent

3) le prénom que vous obtenez également de l'appel précédent

Le user_id est situé à:

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

Quelques détails:

1) Il semble que Telegram ne vérifie pas le prénom. Donc, si vous envoyez pour le second appel, un prénom différent de celui que vous avez reçu lors du premier appel, cela n'a pas d'importance (mais peut-être plus sûr d'envoyer le même message. Dans tous les cas, vous l'obtenez dès le premier appel!)

2) si vous effectuez le deuxième appel avec un numéro de téléphone incorrect, vous obtiendrez un résultat SANS l'entrée user_id.

Donc vous devez faire:

   $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) Le numéro de téléphone doit avoir l'indicatif du pays. +5599888887777 est OK mais 99888887777 ne l’est pas et vous donnera une réponse sans l’entrée user_id.

Vous pouvez maintenant parler à l'utilisateur à l'aide de l'identifiant de chat et lui interdire l'accès aux groupes ou aux canaux à l'aide de son identifiant d'utilisateur.

0
Peter