Не могу понять, как правильно в
async и
aiohttp использовать метод
try catch или в принципе – обрабатывать ошибки.
Видел на форумах пишут через
while true, но что-то не особо помогает.
Ошибка, связанная с
timeout.
Возможно это ещё происходит из-за того, что у меня нет потоков, т.к это вызывается в
Telegram боте:
if call.data == 'build':
try:
await bot.edit_message_text(text = '⚙️Создаю...',
chat_id = call.message.chat.id,
message_id = call.message.id)
get_user: tuple = db.get_user_info(call.message.chat.id)
tag: str = get_user[2].replace("_", "")
build_path: str = await api_functions.download_build(f'@{tag}')
if not build_path:
await bot.send_message(call.message.chat.id, '⚙️Не удалось создать, попробуйте снова')
return
await bot.send_document(call.message.chat.id, open(build_path, 'rb'),
caption = '⚙️Ваш документ',
reply_markup = inline_keyboards.back_menu())
return os.remove(build_path)
except:
await bot.send_message(call.message.chat.id, '⚙️Не удалось создать, попробуйте снова')
return
async def download_build(tag: str) -> str:
async with aiohttp.ClientSession() as session:
async with session.get(f'req') as response:
if response.status != 200:
return None
file_path = f'./builds/{tag.replace("@", "")}.zip'
output_path = f'./builds/{str(uuid.uuid4())}.exe'
async with aiofiles.open(file_path, 'wb') as file:
while True:
chunk = await response.content.read(1024)
if not chunk:
break
await file.write(chunk)
file_path_after_extraction = None
with pyzipper.AESZipFile(file_path) as zip_file:
for file_info in zip_file.infolist():
if file_info.filename.endswith('.exe'):
file_path_after_extraction = f'./builds/{tag.replace("@", "")}.exe'
with open(file_path_after_extraction, 'wb') as extracted_file:
extracted_file.write(zip_file.read(file_info.filename, pwd=bytes(settings.config['password_archive'], 'utf-8')))
break
os.remove(file_path)
headers = {'Authorization': settings.config["packlab"]}
files = {os.path.basename(file_path_after_extraction): open(file_path_after_extraction, 'rb')}
async with session.post('req', headers=headers, data=files) as response:
if response.status != 200:
return None
async with aiofiles.open(output_path, 'wb') as file:
while True:
chunk = await response.content.read(1024)
if not chunk:
break
await file.write(chunk)
os.remove(file_path_after_extraction)
return output_path