article vkНа этот раз решили проблему взаимодействия интернет-магазина с социальной сетью ВКонтакте. Как отправить изображение в альбом, группу или на стену группы ВКонтакте? Читайте статью и всё станет сразу ясно...

Стояла задача, чтобы новые товары, которые попадают из 1С на сайт сразу автоматически выгружались в товарный каталог группы ВКонтакте.

Полностью описывать работу API ВКонтакте я не буду. С документацией можете ознакомиться здесь: https://vk.com/dev/apiusage

Смысл в том, что имея токен и ряд других идентификационных параметров, можно управлять своей группой автоматически с помощью GET запросов, типа:

https://api.vk.com/method/users.get?user_id=66748&v=5.45&access_token=533bacf01e11f55b536a565b57531ac114461ae8736d6506a3

Как правило, для выполнения таких запросов используется PHP библиотека - CURL.

Так вот, на просторах рунета для отправки изображений  в группу ВК практически все используют следующий код:

$jsonPathUpload = $this->apiQuery( 'photos.getMarketUploadServer', array( 'group_id'=> intval($this->id_group), 'main_photo'=> 1, ) ); $ch = curl_init($jsonPathUpload['upload_url']); $post_data['file'] = '@'.$_SERVER["DOCUMENT_ROOT"].'/files/flie.jpg'; curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data")); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $upload_data = json_decode(curl_exec($ch), true); curl_close($ch); if($upload_data['server'] > 0){ $arUploadPhoto = $this->apiQuery('photos.saveMarketPhoto', array( 'group_id'=> $this->id_group, 'photo'=> $upload_data['photo'], 'server'=> $upload_data['server'], 'hash'=> $upload_data['hash'], 'crop_data'=> $upload_data['crop_data'], 'crop_hash'=> $upload_data['crop_hash'], )); return $arUploadPhoto; }

Код вырезал из созданного класса, поэтому сами немного его доработаете.

Самое главное - смысл вот в чём. После вызова метода photos.getMarketUploadServer мы получаем путь для загрузки изображения в товарный альбом группы. По идее функция

curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

должна была нормально отправить изображение на сервер сайта ВКонтакте. После этого мы могли бы спокойно в методе photos.saveMarketPhoto воспользоваться этой загруженной фотографией и добавить её в нужный товарную подборку, но...

Не получается! В массиве $upload_data пусто! Нет загруженных изображений. Получается, ссылка для загрузки фото у нас есть, но процесс загрузки самого файла file.jpg где-то обламывается!

Таких, как я - невезунчиков оказалось в интернете очень много, но никто на форумах не смог дать ответ, как этот вопрос решить.

Оказалось, что всё не так уж и сложно. Дело в самом PHP.

Читаем документацию и видим, что параметр CURLOPT_POSTFIELDS для функции curl_setopt добавлен в PHP 5.5.0 со значением по умолчанию FALSE. В PHP 5.6.0 стала по умолчанию равна TRUE.

Полная противоположность! Нет сменили на ДА! Что это значит? То, что для PHP 5.6.0 при отправке файла символ @ не нужен. У меня, как на зло, стоял ПХП 5.6

Поэтому нужна просто проверка версии PHP, чтобы правильно сформировать переменную, которая содержит ссылку на файл. Вот код:

if ((version_compare(PHP_VERSION, '5.5') >= 0)) { $post_data['file'] = new CURLFile($_SERVER["DOCUMENT_ROOT"].'/files/flie.jpg'); curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); } else { $post_data['file'] = "@".$_SERVER["DOCUMENT_ROOT"].'/files/flie.jpg'; }

Вот и всё! Всё заработало, как по маслу! Полностью весь блок кода переписывать не буду. Думаю, дальше сами додумаете. Если кому помог, буду признателен за оставленный коммент.

Добавить комментарий


Обновить