Vast-Nectarine
@Vast-Nectarine
Пишу очень плохой код

Почему не получается загрузить фото во ВКонтакте?

Есть такой код. Он работает, может асинхронно загружать картинки на сервер, но мне не хочется создавать лишних файлов, так что я использую BytesIO
import ...

image_url = '...'
vk_session = vk_api.VkApi(token=TOKEN)
api = vk_session.get_api()

upload_url = api.photos.getMessagesUploadServer()['upload_url']

with open('/tmp/photo.jpg', 'wb') as f:
    f.write(httpx.get(image_url).content)
files = {'photo': open('/tmp/photo.jpg', 'rb')}

async def fetch(url, file):
    async with httpx.AsyncClient() as client:
        s = await client.post(url, files=file)
        return s.json()


async def main():
    responses = await asyncio.ensure_future(fetch(upload_url, files))
    print(responses)

if __name__ == '__main__':
    asyncio.run(main())


Но c BytesIO код не работает, поле 'photo' пустое
import ...
image_url = '...'
vk_session = vk_api.VkApi(token=TOKEN)
api = vk_session.get_api()

upload_url = api.photos.getMessagesUploadServer()['upload_url']

files = {'photo': BytesIO(httpx.get(image_url).content)}

async def fetch(url, file):
    async with httpx.AsyncClient() as client:
        s = await client.post(url, files=file)
        return s.json()


async def main():
    responses = await asyncio.ensure_future(fetch(upload_url, files))
    print(responses)


if __name__ == '__main__':
    asyncio.run(main())

Ответ - не ошибка, но поле 'photo' - пустое. Почему так происходит? Как загружать фото на сервера ВКонтакте, не создавая временных файлов?
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 2
dmitriy337
@dmitriy337
Python Dev from Ukraine
А не легче сделать файл,загрузить и сразу удалить ?
Ответ написан
Комментировать
@Dev12345
Какой-то кодер
Загружать фото можно вот так, с помощью метода VkUpload:
from vk_api import VkUpload

upload = VkUpload(vk_session)
send = upload.photo_messages(photos='название фотографии')
attach = "photo{}_{}".format(send[0]["owner_id"], send[0]["id"])


В messages.send в attachments передаешь attach.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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