How do I get authentication in a telegram bot?

后端 未结 4 1725
栀梦
栀梦 2021-01-30 16:40

Telegram Bots are ready now.

If we use the analogy of web browser and websites, the telegram client applications are like the browser clients.

The Telegram Chatr

4条回答
  •  离开以前
    2021-01-30 17:14

    Update: I created a GitHub repository with a very simple PHP application to illustrate the concept explained below:

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


    Whether you use a webhook or not is irrelevant. The "deep linking" explained:

    1. Let the user log in on an actual website with actual username-password authentication.
    2. Generate a unique hashcode (we will call it unique_code)
    3. Save unique_code->username to a database or key-value storage.
    4. Show the user the URL https://telegram.me/YOURBOTNAME?start=unique_code
    5. Now as soon as the user opens this URL in Telegram and presses 'Start', your bot will receive a text message containing '/start unique_code', where unique_code is of course replaced by the actual hashcode.
    6. Let the bot retrieve the username by querying the database or key-value storage for unique_code.
    7. Save chat_id->username to a database or key-value storage.

    Now when your bot receives another message, it can query message.chat.id in the database to check if the message is from this specific user. (And handle accordingly)

    Some code (using 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: the unique_code will not be shown as '/start unique_code', only '/start', in the Telegram client, but your bot will still receive '/start unique_code'.

提交回复
热议问题