Здравствуйте, мне необходимо загрузить файл, который я получаю из сообщения с помощью библиотеки vkbottle, с серверов ВК в
io.BytesIO() или просто получить
bytes, но никак не могу найти хорошего способа сделать это. Есть ли у самой vkbottle метод загрузки фото и документов в байты?
Подойдет ли использование requests для этой цели?
img_data = requests.get(message_file.photo.sizes[-5].url).content
Также есть ли смысл реализовывать что-то
такое?
КОДasync def handle_message_event(self, event: Message):
payload = None
if event.payload:
payload = json.loads(event.payload)
files = []
for message_file in event.attachments:
file_in_io = BytesIO()
if message_file.doc != None:
print(f"Doc: {message_file.doc.url}")
"""
функция для загрузки документа в io.BytesIO()
"""
files.append(file_in_io)
if message_file.photo != None:
print(f"Photo: {message_file.photo.sizes[-5].url}")
"""
функция для загрузки фото в io.BytesIO()
"""
files.append(file_in_io)
Note: в последствии мне нужно будет отправить этот файл, документацию по отправке нашел, по идее должно работать через метод
.get_bytes_io(data) (
если нет, поправьте) (
ссылка на документацию)
UPD:
Вот что получилось у меня, подходит ли такое решение? (работает, но в поиске более лаконичного)
Кодasync def download_file(
url: str, _session: aiohttp.ClientSession | None = None
) -> bytes:
if _session != None:
session = _session
else:
session = aiohttp.ClientSession()
async with session:
async with asyncio.BoundedSemaphore(5):
async with session.get(url) as resp:
if resp.status == 200:
return await resp.read()
else:
await asyncio.sleep(1)
return await download_file(url=url, _session=session)