Задать вопрос
@redmuschket

Как реализовать callback c использованием aiogram длиной более 10 секунд?

У меня по нажатию на кнопку запускается опрос AI. Ответ может формироваться минуты, а в будущем, может, часы. Прогресс-бар реализовать пока проблематично. AI предложила вариант asyncio.create_task, но это решило проблему только от части. В логи всё равно выходит
2025...  - aiogram.dispatcher - ERROR - [...] - Failed to fetch updates - TelegramNetworkError: HTTP Client says - Request timeout error
2025... - aiogram.dispatcher - WARNING - [...] - Sleep for 1.000000 seconds and try again... (tryings = 0, bot id = ...)
Раньше было всё на answer, но сейчас хочу достичь результат, чтобы у меня было одно сообщение в истории чата и файлы для пользователей, если он таковые запрашивал.
@router.callback_query(F.data.startswith("analog:"))
async def get_analog(callback: CallbackQuery, state: FSMContext):
    logger.debug("The user chose to get analogues")
    patent_id = callback.data.split(":")[1]
    tg_id = str(callback.from_user.id)

    msg = await callback.message.edit_text(" Обрабатываю ваш запрос...")

    try:
        success, token = await _auth_user.get_user_db()
        if not success:
            await callback.message.edit_text("❌ Ошибка авторизации. Попробуйте снова.")
            return
    except Exception as e:
        logger.error(f"Token error: {e}")
        await callback.message.edit_text("❌ Ошибка при проверке токена.")
        return

    await asyncio.create_task(
        process_analog_task(
            bot=callback.bot,
            chat_id=msg.chat.id,
            message_id=msg.message_id,
            patent_id=patent_id,
            access_token=access_token,
            state=state
        )
    )

async def process_analog_task(
        bot,
        chat_id: int,
        message_id: int,
        patent_id: str,
        access_token: str,
        state: FSMContext
):
    analog_service = AnalogService()
    try:
        await bot.edit_message_text(
            " Ищем аналоги... (это может занять несколько минут)",
            chat_id=chat_id,
            message_id=message_id
        )

        result = await analog_service.create_analog(patent_id, access_token)
        if result:
            await state.set_state(UserStates.analogues_received)
            await bot.edit_message_text(
                "✅ Аналоги успешно получены!",
                chat_id=chat_id,
                message_id=message_id,
                reply_markup=analog_tools(patent_id)
            )
        else:
            await bot.edit_message_text(
                "❌ Не удалось найти аналоги",
                chat_id=chat_id,
                message_id=message_id,
                reply_markup=analog_tools(patent_id))

    except Exception as e:
        logger.error(f"Error in analog processing: {e}")
        await bot.edit_message_text(
            f"❌ Ошибка",
            chat_id=chat_id,
            message_id=message_id,
            reply_markup=analog_tools(patent_id))
  • Вопрос задан
  • 68 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
И зачем тут await asyncio.create_task await? Так что начни с понимания работы create_task с await и без него
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы