Почему с сервера не загружается фото в Вконтакте?

Написал код, который делает пост в ВК на стену группы. С домашнего ПК на тестовом сайте все хорошо работает, проходит авторизация, получаю токен, загружаю фото, делаю пост на стену.
Но перелил код на сервер и там все хорошо кроме загрузки фото, вот тут не могу понять, почему не загружает фото с сервера в ВК.
Ошибка возникает в строке:
r = requests.post(server['upload_url'], files={'photo': open(path_img, "rb")})

точнее возвращает пустой массив, вместо данных о фото.

Полностью код загрузки и поста на стену:
# логин в ВК, получение токена
token_userid = auth(settings.VK_USER_ID, 'wall,photos,groups,messages,offline', settings.VK_LOGIN, settings.VK_PASS)
vkapi = vk.API(settings.VK_USER_ID, settings.VK_LOGIN, settings.VK_PASS)
vkapi.access_token = token_userid[0]

# заливаем фото на сервер
server = vkapi.photos.getWallUploadServer(uid = settings.VK_USER_ID)
r = requests.post(server['upload_url'], files={'photo': open(path_img, "rb")})

params = {
    'server': r.json()['server'],
    'photo': r.json()['photo'],
    'hash': r.json()['hash']
}
wallphoto = vkapi.photos.saveWallPhoto(**params)

# постим пост в групе ВК
params = {
        'owner_id': "-%s" % settings.VK_OWNER_ID,
        'message': text
    }
params.update({'attachments': 'photo%s_%s' % (wallphoto[0]['owner_id'], wallphoto[0]['id'])})
vkapi.wall.post(**params)


На рабочем сервере выдаёт ошибку:
100. One of the parameters specified was missing or invalid: photos_list is invalid. params = [{u'value': u'1', u'key': u'oauth'}, {u'value': u'photos.saveWallPhoto', u'key': u'method'}, {u'value': u'[]', u'key': u'photo'}, {u'value': u'5.20', u'key': u'v'}, {u'value': u'38fdgrt6gbe9da99ffd3543sd45tgd2cd0a4c43c895c084a3935da434152dfgd5ye8e882eda3ec010', u'key': u'access_token'}, {u'value': u'1424430663', u'key': u'timestamp'}, {u'value': u'7a09456dcb20a78cffgfd56ga2c1387e', u'key': u'hash'}, {u'value': u'622930', u'key': u'server'}]

Вот содержимое print r.content на сервере:
{"server":622930,"photo":"[]","hash":"7a09456dcb20a78cffgfd56ga2c1387e"}

Вот содержимое print r.content на тестовом:
{"server":622930,"photo":"[{\"photo\":\"8fef98a5ad:y\",\"sizes\":[[\"s\",\"622930060\",\"1e4ca\",\"QS7Ao6-3iMo\",75,55],[\"m\",\"622930060\",\"1e4cb\",\"VUD4bjBXOdw\",130,95],[\"x\",\"622930060\",\"1e4cc\",\"VUT57dKPXq8\",604,441],[\"y\",\"622930060\",\"1e4cd\",\"jC-nUngsn_Q\",650,475],[\"o\",\"622930060\",\"1e4ce\",\"b-fra9d6VxI\",130,95],[\"p\",\"622930060\",\"1e4cf\",\"YBX-uR8X39M\",200,146],[\"q\",\"622930060\",\"1e4d0\",\"exVnL8tsclw\",320,234],[\"r\",\"622930060\",\"1e4d1\",\"_YpZpDnmS7g\",510,373]],\"kid\":\"67031f3e9c0a0eeb531f9597371d940f\"}]"," hash":"12571bf9ca75d2ef452dc9f765632964"}
  • Вопрос задан
  • 5551 просмотр
Пригласить эксперта
Ответы на вопрос 1
trec
@trec Автор вопроса
В общем решил проблему. Честно не совсем понял в чем разница, но нагуглил как другие решали подобные проблемы.

Вместо переданных данных в такой форме в requests.post:
r = requests.post(server['upload_url'], files={'photo': open(path_img, "rb")})


Делаем так:
data = {}
files = {'photo': (instance.img_name(), open(path_img, 'rb'))}
url = server['upload_url'].split('?')[0]
for key, value in urlparse.parse_qs(server['upload_url'].split('?')[1]).iteritems():
	data[key] = value

r = requests.post(url, data, files=files)


instance.img_name() - имя файла с фото
url - полученный адрес от ВК (только адрес, без параметров)
data - словарь параметров в url
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы