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
→ Ссылка
Ошибка возникает из-за некорректного скачивания файла:
message.photo
возвращает список объектовPhotoSize
- здесь необходимо обращаться по индексу, фото с самым большим размером в конце списка[-1]
, затем беремfile_id
по нему будем скачивать.- Согласно документации в
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")