电报机器人现在已经准备好。

如果我们使用网络浏览器和网站的类比,则电报客户端应用程序就像浏览器客户端一样。

电报聊天室就像网站。

假设我们有一些只想限制某些用户使用的信息,在网站上,我们将进行身份验证。

我们如何在电报机器人上实现相同的效果?

有人告诉我可以使用深层链接。查看说明here

我将在下面复制它:



我知道该怎么做第一步。

我想了解其余的内容。

这是我尝试破译步骤2时想到的图像。

因此,当在其应用程序上与ExampleBot进行通信时,各种电报客户端会与电报服务器进行通信。通信是双向的。

步骤2建议Telegram Server将通过Webhook更新ExampleBot Server。 Webhook只是一个URL。

到目前为止,我正确吗?

将其用于身份验证的下一步是什么?

最佳答案

更新:我用一个非常简单的PHP应用程序创建了一个GitHub存储库,以说明下面解释的概念:

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

是否使用Webhook无关紧要。
“深层链接”说明:

  • 让用户使用实际的用户名-密码身份验证登录实际的网站。
  • 生成唯一的哈希码(我们将其称为unique_code)
  • 将unique_code-> username保存到数据库或键值存储中。
  • 向用户显示URL https://telegram.me/YOURBOTNAME?start=unique_code
  • 现在,一旦用户在Telegram中打开此URL并按“开始”,您的机器人就会收到一条包含“/start unique_code”的文本消息,其中unique_code当然会被实际的哈希码代替。
  • 让bot通过查询数据库或键值存储中的unique_code来检索用户名。
  • 将chat_id-> username保存到数据库或键值存储中。

  • 现在,当您的漫游器收到另一条消息时,它可以在数据库中查询message.chat.id,以检查该消息是否来自该特定用户。 (并据此处理)

    一些代码(使用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)
    

    注意:在Telegram客户端中,unique_code不会显示为“/start unique_code”,而只会显示为“/start”,但是您的漫游器仍会收到“/start unique_code”。

    关于python - 如何在电报机器人中获得身份验证?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31042219/

    10-09 17:13