Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

VK API: загрузка фото на стену возвращает пустое photo

#java #curl #http #vkontakte_api #вконтакте


Пытаюсь прикрепить фото к посту, но upload-сервер возвращает

{"server":619324,"photo":"[]","hash":"235eb464133565b70d01ee4b174b2697"}

Шаги

Получаю uload_url через photos.getWallUploadServer(group_id)
Делаю POST-запрос на uload_url, где параметр формы photo содержит jpg-файл.

Дамп POST-запроса
Это дамп запроса, которые я получаю с Java-версии
POST /upload.php?act=do_add&mid=231464696&aid=-14&gid=74806856&hash=2b2c4e818d938b4202e736bccb6de22e&rhash=d22a5b85bf5bd8298f193b4318c8d54d&swfupload=1&api=1&wallphoto=1
 HTTP/1.1
Content-Length: 233477
Content-Type: multipart/form-data; boundary=0g6_BF339gILdnLw48ZE7ZTnTHz-pcIMiQG7Y
Host: cs619324.vk.com
Connection: Keep-Alive
Cookie: remixlang=0
Cookie2: $Version=1

--0g6_BF339gILdnLw48ZE7ZTnTHz-pcIMiQG7Y
Content-Disposition: form-data; name="photo"; filename="photo.jpg"
Content-Type: image/jpeg

(Бинарное содержимое файла)
...

Как я делаю запрос через curl
$ curl -F photo=@photo.jpg $uload_url

Как я делаю запрос на Java
Используется Apache HTTP-client 4. Результат аналогичен curl.
HttpPost post = new HttpPost(server.toURI());
HttpEntity entity = MultipartEntityBuilder.create()
        .setLaxMode()
        .addBinaryBody(fileName, image, ContentType.create("image/jpeg"), fileName
+ ".jpeg")
        .build();
post.setEntity(entity);
getNewHttpClient().execute(post);

HttpClient getNewHttpClient() {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    trustStore.load(null, null);
    SSLSocketFactory sf = new EmptySSLSocketFactory(trustStore);
    sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
    HttpConnectionParams.setConnectionTimeout(params, 3 * 60 * 1000);

    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", sf, 443));

    ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

    return new DefaultHttpClient(ccm, params);
}



Аналогичные действия для заливки фото в альбом (photos.getUploadServer) работают
корректно.
Находил похожие сообщения об ошибках, но не помогло.
    


Ответы

Ответ 1



Используй Fiddler и проксируй все запросы через него - это поможет быстрее понять в чём ошибка. Для начала попробуй в браузере на старнице метода выполнить загрузку файла и в Fiddler посмотреть как формируется запрос, затем проверь как работает твой код. Ошибка будет видна практически сразу. В моём случае PHP не отправляло содержимое файла.

Комментариев нет:

Отправить комментарий