Как правильно запустить асинхронную функцию в pyTelegramBotAPI с использованием языка программирования Python?

  • 24 августа 2023 г. 7:56
Ответы на вопрос 2
В приведенном коде имеется одна проблема - рекурсивный вызов функции `pay_aaio(call)` внутри блока `try-except`. Это может вызвать бесконечную рекурсию и привести к переполнению стека вызовов. 

Для исправления этой проблемы, вам нужно включить условие выхода из рекурсии в ваш код. Например, вы можете использовать переменную `continue_processing`, которая будет устанавливаться в `False` для прерывания цикла рекурсии. 

Измененный код будет выглядеть следующим образом:

```python
continue_processing = True

@bot.callback_query_handler(func=lambda call: call.data.startswith("pay_"))
async def pay_aaio(call):
    user_id = call.from_user.id
    global continue_processing

    try:
        # Code

        while continue_processing:
            # Отправляем запрос на проверку статуса оплаты

            if '<span class="mb-2">Заказ просрочен. Оплатить заказ необходимо было' in response.content.decode():
                await bot.send_message(user_id, "Срок ссылки истёк. Вы не успели оплатить =(")
                continue_processing = False
            elif '<span class="mb-2">Заказ успешно был оплачен</span>' in response.content.decode():
                await bot.send_message(user_id, f'✅ Оплата на сумму *{amount}* прошла успешно! Ваш баланс пополнен.', parse_mode='Markdown')
                continue_processing = False
            else:
                print("Заказ не оплачен.")
            await asyncio.sleep(5)

    except Exception as e:
        print(e)
        pass

    if continue_processing:
        await pay_aaio(call)
```

Таким образом, код будет возвращаться в начало функции только при установленном значении `continue_processing = True`, а при установке значения `False` цикл рекурсии будет прерван.
import asyncio
import telebot
import requests

bot = telebot.TeleBot("YOUR_API_KEY")

@bot.callback_query_handler(func=lambda call: call.data.startswith("pay_"))
async def pay_aaio(call):
    user_id = call.from_user.id

    try:
        while True:
            response = requests.get(url_aaio)

            if 'Заказ просрочен. Оплатить заказ необходимо было' in response.content.decode():
                await bot.send_message(user_id, "Срок ссылки истёк. Вы не успели оплатить =(")
                break
            elif 'Заказ успешно был оплачен' in response.content.decode():
                await bot.send_message(user_id, f'✅ Оплата на сумму *{amount}* прошла успешно! Ваш баланс пополнен.', parse_mode='Markdown')
                break
            else:
                await print("Заказ не оплачен.")

            await asyncio.sleep(5)

    except Exception as e:
        await print(e)
        pass

    await pay_aaio(call)

def main():
    loop = asyncio.get_event_loop()
    loop.create_task(bot.polling(none_stop=True))
    loop.run_forever()

if __name__ == '__main__':
    main()
Похожие вопросы