python - que - ¿Cómo obtengo la autenticación en un bot de telegrama?
programar bot telegram (4)
Telegram Bots está listo ahora.
Si utilizamos la analogía del navegador web y los sitios web, las aplicaciones del cliente de telegramas son como los clientes del navegador.
Los Chatrooms de Telegram son como sitios web.
Supongamos que tenemos cierta información que solo queremos restringir a ciertos usuarios, en los sitios web tendremos autenticación.
¿Cómo logramos el mismo efecto en los Telegram Bots?
Me dijeron que puedo usar enlaces profundos. Ver descripción here
Voy a reproducirlo a continuación:
- Crea un bot con un nombre de usuario adecuado, p. Ej. @ExampleComBot
- Configurar un webhook para los mensajes entrantes
- Genere una cadena aleatoria de una longitud suficiente, por ejemplo, $ memcache_key = "vCH1vGWJxfSeofSAs0K5PA"
- Ponga el valor 123 con la clave $ memcache_key en Memcache durante 3600 segundos (una hora)
- Muestre a nuestro usuario el botón https://telegram.me/ExampleComBot?start=vCH1vGWJxfSeofSAs0K5PA
- Configure el procesador webhook para consultar Memcached con el parámetro que se pasa en los mensajes entrantes que comienzan con / start. Si la clave existe, registre el chat_id pasado al webhook como telegram_chat_id para el usuario 123. Elimine la clave de Memcache.
- Ahora cuando queremos enviar una notificación al usuario 123, verifique si tienen el campo telegram_chat_id. En caso afirmativo, utilice el método sendMessage en la API Bot para enviarles un mensaje en Telegram.
Sé cómo hacer el paso 1.
Quiero entender el resto.
Esta es la imagen que tengo en mente cuando trato de descifrar el paso 2.
Entonces, los diferentes clientes de telegramas se comunican con el servidor de Telegram cuando hablan con ExampleBot en sus aplicaciones. La comunicación es bidireccional.
El paso 2 sugiere que el servidor Telegram actualizará el servidor ExampleBot a través de un webhook. Un webhook es solo una URL.
Hasta ahora, ¿estoy en lo correcto?
¿Cuál es el siguiente paso para usar esto para la autenticación?
A partir de febrero de 2018, puede usar el widget de inicio de sesión de Telegram para autorizar a las personas en su sitio web a través de Telegram.
Acabo de implementar una solución de autenticación utilizando enlaces profundos para Django .
Esta solución genera tokens de autenticación para asociar chats de Telegram y usuarios de Django. Cuando algún usuario de telegrama quiere acceder al área restringida, recibe un mensaje de telegrama con un enlace para iniciar sesión en la web. Un sitio web registrado proporciona un enlace para iniciar un nuevo chat autenticado mediante enlaces profundos.
También hay una demostración para un ejemplo de encuesta que solo el usuario que ha iniciado sesión no puede votar a través de un telegrama.
Usted está correcto hasta ahora.
Sin embargo, sus requisitos son un poco vagos. Veámoslo de otra manera. Si desea enviar información restringida a usuarios especiales, debe solicitar al usuario que inicie un chat directo con su bot o simplemente use los usuarios chat_id en chat grupal para comenzar a enviarles un mensaje.
Tenga en cuenta que tendrá acceso al usuario chat_id solo cuando el usuario se comunique con el bot en "modo de privacidad", que es el modo predeterminado para los bots.
Actualización : Creé un repositorio GitHub con una aplicación PHP muy simple para ilustrar el concepto que se explica a continuación:
https://github.com/pevdh/telegram-auth-example
Si usa un webhook o no es irrelevante. El "enlace profundo" explicó:
- Permita que el usuario inicie sesión en un sitio web real con autentificación de usuario-contraseña real.
- Genera un hashcode único (lo llamaremos código único)
- Guarde unique_code-> username en una base de datos o almacenamiento de clave-valor.
- Muestre al usuario la URL https://telegram.me/YOURBOTNAME?start=unique_code
- Ahora, tan pronto como el usuario abra esta URL en Telegram y presione ''Start'', su bot recibirá un mensaje de texto que contenga ''/ start unique_code'', donde unique_code es reemplazado por el código hash actual.
- Permita que el bot recupere el nombre de usuario consultando la base de datos o el almacenamiento de clave-valor para unique_code.
- Guarde chat_id-> username en una base de datos o almacenamiento de clave-valor.
Ahora, cuando su bot recibe otro mensaje, puede consultar message.chat.id en la base de datos para verificar si el mensaje es de este usuario específico. (Y maneje en consecuencia)
Algún código (usando 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)
Nota: unique_code no se mostrará como ''/ start unique_code'', solo ''/ start'', en el cliente de Telegram, pero su bot aún recibirá ''/ start unique_code''.