Comment puis-je obtenir une authentification dans un bot de télégramme?
les robots télégraphiques sont prêts.
si nous utilisons l'analogie du navigateur web et des sites Web, les applications client de télégramme sont comme les clients de navigateur.
les salons de discussion des télégrammes 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 robots télégraphiques?
on m'a dit que je pouvais utiliser des liens profonds. Voir la description ici
je vais reproduire ci-dessous:
- créer un bot avec un nom d'utilisateur approprié, par exemple @ExampleComBot
- configurer un webhook pour les messages entrants
- Générer une chaîne aléatoire d'une durée suffisante, par exemple $memcache_key = "vCH1vGWJxfSeofSAs0K5PA"
- mettez la valeur 123 avec la touche $ memcache_key dans Memcache pendant 3600 secondes (une heure)
- Afficher notre utilisateur le bouton https://telegram.me/ExampleComBot?start=vCH1vGWJxfSeofSAs0K5PA
- configurer le processeur webhook pour interroger Memcached avec le paramètre qui est passé dans les messages entrants commençant par /démarrer. Si la clé existe, enregistrez le chat_id passé au webhook comme suit: telegram_chat_id pour l'utilisateur 123. Retirez la clé de Memcache.
- Maintenant, quand nous voulons envoyer une notification à l'utilisateur 123, vérifier s'ils ont le champ telegram_chat_id. Si oui, utilisez le sendMessage méthode dans L'API Bot pour leur envoyer un message dans un télégramme.
je sais comment faire l'étape 1.
je veux comprendre le reste.
C'est l'image que j'ai en tête lorsque je tente de déchiffrer l'étape 2.
ainsi les divers clients de télégramme communiquent avec le serveur de télégramme en parlant à Exempllebot sur leurs applications. La communication est les deux sens.
L'Étape 2 suggère que le serveur de télégramme mettra à jour le serveur ExampleBot via un webhook. Un webhook est juste une URL.
jusqu'à présent, ai-je raison?
Quelle est la prochaine étape vers l'utilisation de ceci pour l'authentification?
4 réponses
mise à Jour: j'ai créé un dépôt GitHub avec une application PHP très simple pour illustrer le concept expliqué ci-dessous:
https://github.com/pevdh/telegram-auth-example
si vous utilisez un webhook ou non est hors de propos. Le "deep-linking", a expliqué:
- permet à l'utilisateur de se connecter sur un site web réel avec une authentification nom d'utilisateur-mot de passe réelle.
- générer un unique hashcode (nous l'appellerons unique_code)
- Enregistrer unique_code->nom d'utilisateur à une base de données ou une valeur-clé de stockage.
- Afficher à l'utilisateur l'URL https://telegram.me/YOURBOTNAME?start=unique_code
- dès que L'utilisateur ouvre cette URL dans Telegram et appuie sur 'Start', votre bot reçoit un message texte contenant '/start unique_code', où unique_code est bien sûr remplacé par le hashcode lui-même.
- laisser le bot récupérer le nom d'utilisateur en interrogeant la base de données ou la clé de stockage de valeur pour unique_code.
- Enregistrer chat_id->nom d'utilisateur à une base de données ou une valeur-clé de stockage.
lorsque votre bot reçoit un autre message, il peut interroger le message.chat.id dans la base de données pour vérifier si le message provient de cet utilisateur spécifique. (Et d'agir en conséquence)
un peu de code (à l'aide de 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)
Note: le unique_code ne sera pas affiché comme '/start unique_code', only '/ start', dans le client Telegram, mais votre bot recevra quand même'/start unique_code'.
vous avez raison pour l'instant.
Toutefois, 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 commencer un chat direct avec votre bot ou tout simplement utiliser users chat_id dans groupchat pour commencer à leur envoyer un message.
veuillez noter que vous aurez accès à user chat_id uniquement lorsque l'utilisateur communique avec le bot en "privacy mode" qui est le mode par défaut pour les bots.
j'ai juste mis en œuvre une solution d'authentification utilisant deep linking pour Django.
cette solution génère des clés d'authentification pour associer les conversations télégraphiques et les utilisateurs Django. Quand un utilisateur de télégramme veut accéder à la zone restreinte il reçoit un message de télégramme avec un lien pour se connecter dans le web. Un site web connecté fournit un lien pour commencer un nouveau chat authentifié en utilisant le lien profond.
il y a Aussi un démo pour un exemple de sondage que seul l'utilisateur connecté ne peut pas voter par télégramme.
à partir de février 2018 vous pouvez utiliser Télégramme De Connexion Widget pour autoriser les gens sur votre site Web par télégramme.