Search code examples
async-awaittelegram-botpython-multithreading

How to make my telegram-bot multi-threading?


I have a trouble. I need make my telegram-bot multi-threading. My bot will help users to buy films and will work with database. I use Webhooks-method for receiving requests from Telegram-server and Stripe(module request). I read a lot about threading module in python and about async functions but I am not sure for all 100% about how to make my bot multi-threading. I will very appreciated for help, because I am stuck on this question. For now I give you main function of my app, if you need more, tell me:

@app.route('/', methods=["POST"])
def process():
    print(request.json)  # receiving requests (messages) in json format that are sent to the Flask server from the Telegram server and Stripe

    if check_if_successful_payment(request) == True:
        # Processing a request from Stripe
        # chat_id = request.json["data"]["object"]["metadata"]["chat_id"]
        stripe.api_key = get_from_env("PAYMENT_TOKEN")
        webhook_list = stripe.WebhookEndpoint.list()
        chat_id = webhook_list.data[0].metadata.chat_id
        send_message(chat_id, "The payment was successful! Enjoy watching the movie!")
        print("The payment was successful!")
        webhook_id = webhook_list.data[0].id
        stripe.WebhookEndpoint.delete(
            webhook_id,
        )
    else:
        # Processing a request from Telegram
        chat_id = request.json["message"]["chat"]["id"]
        send_message(chat_id, check_message(chat_id, request.json["message"]["text"]))
        send_pay_button(chat_id=chat_id, text="Test payment",
                        price_id=check_price_id(request.json["message"]["text"]))

    return {"ok": True}


if __name__ == '__main__':
    app.run(debug=True)

Solution

  • If your bot works on Webhooks, you can use Aiogram instead of Flask for receiving messages from users. Aiogram has special decorator for simultaneous messages processing from many users - async_task: https://docs.aiogram.dev/en/latest/_modules/aiogram/dispatcher/dispatcher.html#Dispatcher.async_task