@solarkaaa

Как сделать параллельный цикл aiogram?

Помогите, друг сделал код на java и на нём сделал бота. Мы хотим отслеживать состояние ботов, и чтобы отследить состояние ботов я кидаю на его сайт запрос, если игроки рядом, то его код кидает на сайт информацию о них, и я создал def near_player, там прописан бесконечный цикл чтобы какждые 2 секунды кидался запрос на сайт, и проверял. Но цикл не работает. Я хочу обрабатывать цикл бесконечно, Но он только при нажатии на /check_status. Я его туда пока-что поставил потому-что если его туда не поставить, он будет выдавать ошибки и не работать. Если сделать async_task в main, то не будет работать всё равно
import logging

import asyncio

from aiohttp import ClientSession

from aiogram import Dispatcher, types, Bot

from aiogram.filters import CommandStart, Command

dp = Dispatcher()

@dp.message(CommandStart())

async def start(message: types.Message):

    await message.answer('Введите команду /check_status чтобы проверить статус ботов')

async def near_player(message: types.Message):

    url = ''

    try:

        async with ClientSession() as session:

            while True:

                async with session.get(url,timeout=3) as response:

                    if response.status == 200:

                        print('Успешно отправлен запрос на проверку игроков рядом')

                    else:

                        print(response.status)

                    await asyncio.sleep(2)

                    if "Рядом найдены игроки:" in await response.text(encoding='windows-1251'):

                        print(await response.text(encoding='windows-1251'))

                        await message.answer(await response.text(encoding='windows-1251'))

    except Exception as e:

        print(e)

async def check_status(message: types.Message):

    url = ''

    try:

        async with ClientSession() as session:

            async with session.get(url, timeout=3) as response:

                if response.status == 200:

                    await message.answer("запрос успешно выполнен. Проверка статуса ботов")

                    print("запрос успешно выполнен.")

                    await message.answer(f"Полученные данные: {await response.text(encoding='windows-1251')}")

                    print(f"Полученные данные: {await response.text(encoding='windows-1251')}")

                else:

                    await message.answer(response.status)

                    print(response.status)

    except Exception as e:

        await message.answer(f"Ошибка при выполнении запроса: {e}")

        print(f"Ошибка при выполнении запроса: {e}")

@dp.message(Command('check_status'))

async def check_ip(message: types.Message):

    await near_player(message)

    await check_status(message)

async def main():

    logging.basicConfig(level=logging.INFO)

    bot = Bot(

        token='"'

    )

    await dp.start_polling(bot)

if __name__ == "__main__":

    logging.basicConfig(level=logging.INFO)

    asyncio.run(main())
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Выносишь цикл проверки в отдельную корутину check_loop(), в main() делаешь
async def main():
    logging.basicConfig(level=logging.INFO)
    async with ClientSession() as session:  # сессию лучше по сто раз не создавать
        check_task = asyncio.create_task(check_loop(session))  # создай её однажды и передай в check_loop
        try:
            bot = Bot(
                token='"'
            )
            await dp.start_polling(bot)
        finally:
            check_task.cancel()  # внутри check_loop() сгенерируется прерывание asyncio.CancelledError

Единственное, придётся в коде/конфиге прописать id чата, куда check_loop() будет отправлять сообщение с результатами.
Ответ написан
Комментировать
@Everything_is_bad
рассказано было уже 100500 раз, надо открыть доку по asyncio и прочитать её, там ты узнаешь про create_task
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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