Страницы

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

понедельник, 9 декабря 2019 г.

Как установить шапку группы через VK API?

#java #vkontakte_api


Для начала вот, что такое шапка группы:

В документации API не сказано абсолютно ничего про загрузку. Вылазки через неофициальные
клиенты больше не помогают, ибо в них такое не реализовано (отсылка к этому вопросу).
Путём просмотра запросов, обнаружил, что сигнатура вызовов не похоже не на один метод/способ
загрузки файлов, указанный здесь. Итак, что я смог отрыть из запросов:


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

{"error":"ERR_UPLOAD_FILE_NOT_UPLOADED: file not found","bwact":"owner_cover","server":836521,"mid":151665536,"_sig":"83447078c5079124026b80d90f116398"}



Однако после исполнения загрузки в коде, получаем:

{"error":"ERR_UPLOAD_BAD_SIGNATURE","bwact":"owner_cover","server":836521,"_sig":"d762c16dc795c4f65b59aafdaa39628a"}



Метод, используемый VK (обычно метод виден в параметре act. Допустим, при загрузке
аудио-сообщения, было add_doc), в документации отсутствует и выглядит так: act=owner_cover.

    


Ответы

Ответ 1



Ура! Ура! Ура! Вопрос снова решен :) Правда, сразу скажу, господа, что тут, намного сложнее, чем то, что я решал раньше - тык. Внимание: все запросы мы будем производить с cookie. Без них - никак. Вообщем, поехали: Получаем ссылку для загрузки нашего ковра (в VK шапка называется cover): Запрос делаем сюда: https://vk.com/al_page.php В headers прикрепляем наши cookie В тело POST-запроса пишем это: act=owner_photo_box&al=1&cover=1&oid=-id вашей группы Если все прошло успешно, получаем примерно такую страницу в ответ: В конце страницы будут ссылки. Нам нужна первая (идет сразу после OwnerPhoto.uploadInit). См. скриншот: Наша ссылка получилась такая: https:\/\/pu.vk.com\/c837731\/upload.php?act=owner_cover&oid=-136618761&square=&mid=151665536&server=837731&_origin=https%3A%2F%2Fvk.com&_sig=c55042259e8ee7c612cdcd9861961cdf Загружаем наше фото на сервера VK, используя ссылку, полученную в предыдущем пункте: Как загрузить файл в формате multipart/form-data я описывал здесь (стандартная библиотека Java) или намного короче и более красиво можно загрузить с помощью библиотеки OkHttp - процесс описан здесь. ВНИМАНИЕ: теперь VK принимает картинки только с полем file в post-запросе! Вот так (тут на Java) - multipart.addFilePart("file", uploadFile1); Если картинка будет в поле с другим названием, вы получите такую ошибку: {"error":"ERR_UPLOAD_FILE_NOT_UPLOADED: file not found","bwact":"owner_cover","server":638219,"mid":151665536,"_sig":"9417bfeb4cca32304ed587818d931931"} В ответ получим описание нашей фотки в таком формате: `{"oid":"-136618761","photo":{"photo":"6fae155614x","sizes":[["x","837731536","18af4","9lzKWBYrE2w",795,1060],["y","837731536","18af5","8knjXW2i2K8",810,1080],["o","837731536","18af6","-w20s8JJGNA",810,1080]],"kid":"9d20ccbaa7b6ec6d7171716dcd5bade1","debug":"xxoyooo"},"x_src":"v837731536\/18af4\/9lzKWBYrE2w.jpg","x_size":[795,1060],"size":[810,1080],"bwact":"owner_cover","server":837731,"mid":151665536,"_sig":"fe9a46f1b2e26f4a1c56bbc36850a10e"}` Сохраняем наше произведение искусства: Берем первую часть нашей ссылки, полученной в первом пункте с номером сервера, и подставляем к ней act=owner_cover_crop&_query= и описание нашей фотки, полученное из пункта выше. В нашем случае выглядит так: https://pu.vk.com/c837731/upload.php?act=owner_cover_crop&_query={"oid":"-136618761","photo":{"photo":"2b522d8e86x","sizes":[["x","837731536","18aa5","tuY07_54Ovk",795,497],["y","837731536","18aa6","RxPs7YD5hCs",1590,994],["o","837731536","18aa7","nmZ4LwQDbgw",2880,1800]],"kid":"621fad611afefb9048b478bcc627ab12","debug":"xxoyooo"},"x_src":"v837731536\/18aa5\/tuY07_54Ovk.jpg","x_size":[795,497],"size":[2880,1800],"bwact":"owner_cover","server":837731,"mid":151665536,"_sig":"efb64dcfd413f8e1cd52c86c9ffe98d6"} Это наш URL, к которому будем обращаться. В header обязательно вставляем наши cookie Ответ получим такой: {"oid":"-136618761","data":["xAAzIYwAAAAAx7sTQAAGK9PZcylgWKxNsYAAGK9fJJ411totivOAAGK9vsNtLPCSRjQAAAGK91LwRyB-lQoPBAAGK-LTMIdOtvbDACAAGK-W1AR45kIrfADAAGK-n6SOgL5ttKpEAAGK-6ApZsVYFCSa","0,0,795,200",0,"810,1080","795,1060"],"bwact":"owner_cover_crop","server":837731,"mid":151665536,"_sig":"7e008ee2a25eaafe4921763ee3b3691d"} Заставляем VK повиноваться и вставить нашу многострадальную картинку в шапку: Делаем запрос на этот адрес: https://vk.com/al_page.php Обязательно в headers вставляем cookie В тело POST-запроса вставляем строку, полученную в пункте выше и добавляем перед ней _query=, а после нее - &act=owner_photo_save&al=1&from=groups. Выглядеть тело будет так: _query={"oid":"-136618761","data":["xAAzIYwAAAAAx7sTQAAGKnqTNf2fQ6fuoYAAGKn3Z9dX-ImPaLOAAGKoG1FCgvWBDhHAAAGKqJRsM9D7RwUzBAAGKqWp6mu7odOTZCAAGKqsVKNMJ80uh9DAAGKq99X4PZhrf1wEAAGKrFjQIUH8hRcw","0,536,2880,724",0,"2880,1800","795,497"],"bwact":"owner_cover_crop","server":837731,"mid":151665536,"_sig":"3aeeb1dff8888aed8bf8f65c91568bb0"}&act=owner_photo_save&al=1&from=groups Следите за разрешением фото, когда будете его загружать. Если не подойдет - VK начнет обрезать, но вы можете в запросах указать размеры (думаю, понятно где и как). Вообще, VK рекомендует 1590×400... Спасибо за внимание! Надеюсь кому-то помог...

Ответ 2



Недавно появились методы API для этого: photos.getOwnerCoverPhotoUploadServer photos.saveOwnerCoverPhoto Вызываем первый метод (там нас просят выбрать область для обрезки, если указать не пропорциональное 795x200, будет вырезан верх выбранной области), загружаем файл по полученной ссылке, передаём полученные hash и photo во второй метод — шапка обновлена.

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

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