python273 / vk_api

Модуль для создания скриптов для ВКонтакте | vk.com API wrapper
https://pypi.org/project/vk-api/
Apache License 2.0
1.33k stars 321 forks source link

Загрузка фото с ПК #146

Closed DanielTenebris closed 6 years ago

DanielTenebris commented 6 years ago

Я пытаюсь реализовать парсинг и загрузку фото, но что-то идёт не так. Спустя множества попыток я так и не понял из-за чего у меня некорректно это работает. Я получаю owner_id и id фото, форматирую для вложения, передаю вложение, но оно оказывается пустым. Фото же 404. Как будто оно не загружено на сервер.

Фото находится у меня на ПК. Я её выгружаю с сайта, загружаю к себе в папку и потом передаю на загрузку вк, но этого не происходит. Фото просто не загружается. Никакие примеры из examples мне не помогли.

Вопрос: Как я должен действовать, чтобы загрузить фото с диска в вк и приложить его к вложениям сообщения. Что я могу делать не так?

Что я делаю сейчас:

  1. Генерирую url фото
  2. Загружаю фото в папку Далее вот такая вещь происходит:
    <...>
    with open ('/img/path/img.jpg', 'rb') as image:
    photo = VkUpload(vk).photo_messages(photos=image.raw)[0]
    attachments.append('photo{}_{}'.format(photo['owner_id', 'photo['id'])

    И дальше фото должно отправляться в attachments вместе с текстом и форвардом на сообщение юзера, но он (вложения) оказывается пустым и ничего не прикрепляет.

Код воспроизвожу по памяти. Вчера удалил всю реализацию загрузки фото в ВК, решив переписать всё заново набравшись информации.

photo выдаёт мне список такого вида {'id': 456252910, 'album_id': -3, 'owner_id': myId, <форматы_фото> и acceskey}

Вроде бы всё хорошо, но нет. В форматах фото оказывается страница 404. Фото не прикрепляется к сообщению и вообще ничего не работает. Что я не так делаю? Почему так происходит? Извините, если задаю глупые или неуместные вопросы, но я правда не знаю как мне быть иначе. Спасибо большое за понимание.

python273 commented 6 years ago

Если фото сохранено на диске, то можно просто передать путь: https://github.com/python273/vk_api/blob/master/examples/upload_photo.py#L20-L32

python273 commented 6 years ago

{'id': 456252910, 'album_id': -3, 'owner_id'

Хотя ответ вроде нормальный, так что может проблема в коде отправки, а не загрузки

python273 commented 6 years ago
image = vk_upload.photo_messages('./upload_files/art.png')[0]

attachments = [
    'photo{}_{}'.format(image['owner_id'], image['id'])
]
forward_messages = [674097]

vk.messages.send(
    user_id=183433824,
    attachment=','.join(attachments),
    forward_messages=','.join(str(i) for i in forward_messages)
)
screen shot 2018-06-24 at 1 38 44 pm
DanielTenebris commented 6 years ago

@python273 спасибо большое, а если я хочу прямо с url`a получить, можно как-то без записи в файл это сделать? Будет ли быстрее? Хм. Я могу возвращать из модуля который отвечает за загрузку картинки в папку img.raw, но насколько я помню когда я img.raw ретурнил и потом вместо пути указывал то что мне вернуло (img.raw), то толку от этого не было.

python273 commented 6 years ago

С просто указанием ссылки (как в веб версии ВК) через апи никак нельзя, насколько я знаю. Пример с загрузкой картинки по URL и загрузкой в ВК без сохранения на диск тут: https://github.com/python273/vk_api/blob/master/examples/messages_bot/messages_bot.py#L62-L63