maaGames
@maaGames
Погроммирую программы

Как загрузить фото на сервер VK (c++, curl)?

Знаю, что вопрос поднимается регулярно, но на PHP. Я же страдаю в stand-alone на C++. Под Windows. Без QT.

Цель: загрузка фото с локального компьютера на свою страницу ВК

Пытаюсь:
1. Авторизация и получение прав - всё отлично. Обошёлся без вебкитов и прочего, тупо через IWebBrowser2 аторизовываюсь. Всё ОК, могу писать текстовые сообщения на свою стену, ссылки добавлять...
2. https://api.vk.com/method/photos.getWallUploadServer
Тут тоже всё отлично, возвращает json с upload_url
3. Отлично закончилось. Как бы не пытался отправить запрос по upload_url, то у меня либо пустое поле "photo":"[]" в ответе, либо ошибка защиты (когда я пытался хэдер сформировать).
До сохранения фото не дошёл, как понимаете.

Пытался в POST передавать и "photo=ПОЛНЫЙ_ПУТЬ ДО_ФАЙЛА_НА ДИСКЕ" и "photo=http://url..." и "photo=КОДИРОВАННАЯ_base64_КАРТИНКА" - результат постоянен.

Понимаю, что что-то делаю не так, но никаких сообщений об ошибках ВК не возвращает. Подозреваю, что нужно каким-то особым образом сформировать CURLOPT_HTTPHEADER, но у меня получается лишь сделать ещё хуже...

Кто-нибудь объяснит мне, что я делаю не так?
  • Вопрос задан
  • 3055 просмотров
Решения вопроса 1
zenden2k
@zenden2k
PHP & C++ programmer
Так выглядит запрос (правда у меня загрузка не на стену а в альбом, но суть та же)
POST http://cs62xxxx.vk.com/upload.php?act=do_add&mid=6xxxxxxx&aid=213651645&gid=0&hash=1b88ccc2a73467387614fdc740241ec3&rhash=af7e667ec013e00d6b7a42234018xxxx&swfupload=1&api=1 HTTP/1.1
Host: cs62xxxx.vk.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0
Accept: */*
Accept-Encoding: deflate, gzip
Connection: Keep-Alive
Cookie: remixlang=0
Content-Length: 12573
Content-Type: multipart/form-data; boundary=------------------------23512563ad262e45

--------------------------23512563ad262e45
Content-Disposition: form-data; name="file1"; filename="screenshot 2015-03-09 001_en.png"
Content-Type: image/png
 PNG....содержимое файла
--------------------------23512563ad262e45--


это делается грубо говоря так:
struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL;

curl_formadd(&formpost,
                            &lastptr,
                            CURLFORM_COPYNAME, "file1",
                            CURLFORM_FILENAME, "screenshot 2015-03-09 001_en.png",
                            CURLFORM_FILE, "D:\\screenshot 2015-03-09 001_en.png",
                            CURLFORM_CONTENTTYPE, "image/png",
                            CURLFORM_END);
 curl_easy_setopt(curl_handle, CURLOPT_URL, upload_url);
 curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formpost);
 curl_result = curl_easy_perform(curl_handle);


В ответ получаете json с данными, которые надо будет передать для сохранения фото.

Взял отсюда https://github.com/zenden2k/image-uploader/blob/ma...
это не C++, но нижележащие вызовы curl (https://github.com/zenden2k/image-uploader/blob/1....)

Если хотите можете заюзать мою обертку в своем проекте, чтобы не мучаться с сишным апи
https://github.com/zenden2k/curl-cpp-wrapper
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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