web-dev-qa-db-fra.com

Comment obtenir l'authentification dans un bot de télégramme?

Les bots Telegram sont prêts maintenant.

Si nous utilisons l'analogie du navigateur Web et des sites Web, les applications client de télégramme sont comme les clients navigateur.

Les Telegram Chatrooms sont comme des sites Web.

Supposons que nous ayons des informations que nous ne voulons restreindre qu'à certains utilisateurs, sur les sites Web, nous aurons une authentification.

Comment obtenir le même effet sur les Telegram Bots?

On m'a dit que je pouvais utiliser le lien profond. Voir description ici

Je vais le reproduire ci-dessous:

  1. Créez un bot avec un nom d'utilisateur approprié, par ex. @ExampleComBot
  2. Configurer un webhook pour les messages entrants
  3. Générez une chaîne aléatoire d'une longueur suffisante, par ex. $ memcache_key = "vCH1vGWJxfSeofSAs0K5PA"
  4. Mettez la valeur 123 avec la clé $ memcache_key dans Memcache pendant 3600 secondes (une heure)
  5. Montrez à notre utilisateur le bouton https://telegram.me/ExampleComBot?start=vCH1vGWJxfSeofSAs0K5PA
  6. Configurez le processeur de webhook pour interroger Memcached avec le paramètre transmis dans les messages entrants commençant par/start. Si la clé existe, enregistrez le chat_id transmis au webhook en tant que telegram_chat_id pour l'utilisateur 123. Supprimez la clé de Memcache.
  7. Maintenant, lorsque nous voulons envoyer une notification à l'utilisateur 123, vérifiez s'il a le champ telegram_chat_id. Si oui, utilisez la méthode sendMessage dans l'API Bot pour leur envoyer un message dans Telegram.

Je sais comment faire l'étape 1.

Je veux comprendre le reste.

C'est l'image que j'ai en tête lorsque j'essaie de déchiffrer l'étape 2.

Enter image description here

Ainsi, les différents clients de télégramme communiquent avec le serveur de télégramme lorsqu'ils parlent à ExampleBot sur leurs applications. La communication est bidirectionnelle.

L'étape 2 suggère que le serveur Telegram mettra à jour le serveur ExampleBot via un webhook. Un webhook n'est qu'une URL.

Jusqu'à présent, ai-je raison?

Quelle est la prochaine étape vers l'utilisation de ceci pour l'authentification?

29
Kim Stacks

Mise à jour : J'ai créé un référentiel GitHub avec une application PHP PHP très simple pour illustrer le concept expliqué ci-dessous:

https://github.com/pevdh/telegram-auth-example


Que vous utilisiez un webhook ou non n'est pas pertinent . Le "lien profond" a expliqué:

  1. Laissez l'utilisateur se connecter sur un site Web réel avec une authentification par nom d'utilisateur et mot de passe.
  2. Générez un code de hachage unique (nous l'appellerons code_unique)
  3. Enregistrez unique_code-> nom d'utilisateur dans une base de données ou un stockage de valeurs-clés.
  4. Montrez à l'utilisateur l'URL https://telegram.me/YOURBOTNAME?start=unique_code
  5. Maintenant, dès que l'utilisateur ouvre cette URL dans Telegram et appuie sur `` Démarrer '', votre bot recevra un message texte contenant '/ start unique_code', où unique_code est bien sûr remplacé par le code de hachage réel.
  6. Laissez le bot récupérer le nom d'utilisateur en interrogeant la base de données ou le stockage de valeurs-clés pour unique_code.
  7. Enregistrez chat_id-> nom d'utilisateur dans une base de données ou un stockage de valeurs-clés.

Maintenant, lorsque votre bot reçoit un autre message, il peut interroger message.chat.id dans la base de données pour vérifier si le message provient de cet utilisateur spécifique. (Et gérer en conséquence)

Du code (en utilisant pyTelegramBotAPI ):

import telebot
import time

bot = telebot.TeleBot('TOKEN')

def extract_unique_code(text):
    # Extracts the unique_code from the sent /start command.
    return text.split()[1] if len(text.split()) > 1 else None

def in_storage(unique_code): 
    # Should check if a unique code exists in storage
    return True

def get_username_from_storage(unique_code): 
    # Does a query to the storage, retrieving the associated username
    # Should be replaced by a real database-lookup.
    return "ABC" if in_storage(unique_code) else None

def save_chat_id(chat_id, username):
    # Save the chat_id->username to storage
    # Should be replaced by a real database query.
    pass

@bot.message_handler(commands=['start'])
def send_welcome(message):
    unique_code = extract_unique_code(message.text)
    if unique_code: # if the '/start' command contains a unique_code
        username = get_username_from_storage(unique_code)
        if username: # if the username exists in our database
            save_chat_id(message.chat.id, username)
            reply = "Hello {0}, how are you?".format(username)
        else:
            reply = "I have no clue who you are..."
    else:
        reply = "Please visit me via a provided URL from the website."
    bot.reply_to(message, reply)

bot.polling()

while True:
    time.sleep(0)

Remarque: le code_unique ne sera pas affiché comme '/ start code_unique', seulement '/ start', dans le client Telegram, mais votre bot recevra toujours '/ start code_unique'.

43
Pete

Vous avez raison jusqu'à présent.

Cependant, vos exigences sont un peu vagues. Regardons cela d'une autre manière. Si vous souhaitez envoyer des informations restreintes à des utilisateurs spéciaux, vous devez demander à l'utilisateur de démarrer une conversation directe avec votre bot ou simplement utiliser les utilisateurs chat_id dans groupchat pour commencer à leur envoyer un message.

Veuillez noter que vous n'aurez accès à l'utilisateur chat_id que lorsque l'utilisateur communique avec le bot en "mode de confidentialité" qui est le mode par défaut pour les bots.

4
Vahid Mafi

Depuis février 2018, vous pouvez utiliser Telegram Login Widget pour autoriser les personnes sur votre site Web via Telegram.

4
Groosha

Je viens d'implémenter ne solution d'authentification en utilisant un lien profond pour Django .

Cette solution génère des jetons d'authentification pour associer les chats Telegram et les utilisateurs Django. Lorsque certains utilisateurs de télégrammes souhaitent accéder à une zone restreinte, ils reçoivent un message de télégramme avec un lien pour se connecter au Web. Un site Web connecté fournit un lien pour démarrer une nouvelle conversation authentifiée en utilisant un lien profond.

Il y a aussi ne démo pour un exemple de sondage que seul l'utilisateur connecté ne peut pas voter par télégramme.

3
Juan Madurga