@Fre4ka

Как запустить асинхронную функцию в pyTelegramBotAPI | Python?

Как запустить асинхронную функцию ? Использую библиотеку telebot (pyTelegramBotAPI).
Код:

@bot.callback_query_handler(func=lambda call: call.data.startswith("pay_"))
async def pay_aaio(call):
    user_id = call.from_user.id
    try:
        # Code
​
        while True:
            # Отправляем запрос на проверку статуса оплаты
            response = requests.get(url_aaio)
​
            if '<span class="mb-2">Заказ просрочен. Оплатить заказ необходимо было' in response.content.decode():
                await bot.send_message(user_id, "Срок ссылки истёк. Вы не успели оплатить =(")
                break
            elif '<span class="mb-2">Заказ успешно был оплачен</span>' 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 asyncio.run(pay_aaio(call))
  • Вопрос задан
  • 684 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Umys
вам нужно использовать логику asyncio там, где вы запускаете ваш бот. Для этого сначала импортируйте asyncio в вашем коде:

import asyncio

Замените ваш код, который запускает бота на следующий:

def main():
loop = asyncio.get_event_loop()
loop.create_task(bot.polling(none_stop=True))
loop.run_forever()
И теперь, измените вызов await asyncio.run(pay_aaio(call)) на вот это:

await pay_aaio(call)
Окончательный код должен выглядеть следующим образом:

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:
# Code
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()
Таким образом, вы смогли прикрепить всю вашу асинхронную логику к одному основному циклу событий asyncio и теперь смогли успешно вызвать асинхронную функцию pay_aaio.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы