error 404: message not found aiogram 3

создаю бота для раскодировки qr-кодов. написал функцию для обработки фото, поиска на них qr кодов и расшифровки. вылезает ошибка

@decode_router.message(lambda message: True)
async def decode(message: Message):
    await main.bot.send_message(message.chat.id, "Decoding...")
    fl = await main.bot.download_file(message.photo, f"qrcode{message.from_user.id}.png")
    fl = FSInputFile(f"qrcode{message.from_user.id}.png", f"qrcode{message.from_user.id}.png")
    img = cv2.imread(f"qrcode{message.from_user.id}.png")
    detector = cv2.QRCodeDetector()
    data, ver, binary = detector.detectAndDecode(img)
    if ver is not None:
        await message.answer(data)
    else:
        await message.answer("No QR code detected.")
    os.remove(f"qrcode{message.from_user.id}.png")


aiohttp.client_exceptions.ClientResponseError: 404, message='Not Found', url=URL('https://api.telegram.org/file/bottoken/%5BPhotoSize(file_id='AgACAgIAAxkBAAIBFmZ4pB0X2mFPTV_s946k5-BCEQn_AAJL2TEb3QrJS0QwT7WdzZFlAQADAgADcwADNQQ',%20file_unique_id='AQADS9kxG90KyUt4',%20width=90,%20height=90,%20file_size=2652),%20PhotoSize(file_id='AgACAgIAAxkBAAIBFmZ4pB0X2mFPTV_s946k5-BCEQn_AAJL2TEb3QrJS0QwT7WdzZFlAQADAgADeAADNQQ',%20file_unique_id='AQADS9kxG90KyUt9',%20width=370,%20height=370,%20file_size=12681),%20PhotoSize(file_id='AgACAgIAAxkBAAIBFmZ4pB0X2mFPTV_s946k5-BCEQn_AAJL2TEb3QrJS0QwT7WdzZFlAQADAgADbQADNQQ',%20file_unique_id='AQADS9kxG90KyUty',%20width=320,%20height=320,%20file_size=20649)%5D')

прикол в том, что файл качается в директорию, но открыть его невозможно, типо он якобы поврежден был. как это фиксить? где ошибся? заранее спасибо


Ответы (1 шт):

Автор решения: Medvedev

Ошибка возникает из-за некорректного скачивания файла:

  1. message.photo возвращает список объектов PhotoSize - здесь необходимо обращаться по индексу, фото с самым большим размером в конце списка [-1], затем берем file_id по нему будем скачивать.
  2. Согласно документации в download_file(file_path, "text.txt") file_path - это путь к файлу, "text.txt"- имя файла. То есть скачать по file_id не получится. Для скачивания по file_id подойдет метод download(document).

Готовый код:

@decode_router.message(lambda message: True)
async def decode(message: Message):
    await main.bot.send_message(message.chat.id, "Decoding...")

    fl = await main.bot.download(file=message.photo[-1].file_id, 
                        destination=f"qrcode{message.from_user.id}.png")

    img = cv2.imread(f"qrcode{message.from_user.id}.png")
    detector = cv2.QRCodeDetector()
    data, ver, binary = detector.detectAndDecode(img)

    if ver is not None:
        await message.answer(data)
    else:
        await message.answer("No QR code detected.")
    os.remove(f"qrcode{message.from_user.id}.png")
→ Ссылка