Есть скрипт, который грузит до 5 (максимум который позволяет VK API) фотографий. Загрузка по документации:
1. получить токен
2. получить ссылку для загрузки на сервер
3. отправить POST запрос с файлами
4. после загрузки сохранить методом photos.save
Вот на 4м пункте затык. Мне нужно к каждой фотографии определенное описание добавлять, а метод photos.save, судя по документации, умеет только ко всему пулу фотографий описание клепать. Как приписывать описание в моем случае? Хотелось бы избежать POST-запросов в цикле по одному файлу.
Функция загрузки:
public static function uploadImages($files, $group_id, $album_id)
{
//Получаем сервер для загрузки изображения
$params = array(
'group_id' => $group_id,
'album_id' => $album_id
);
$api_res = self::queryApi("photos.getUploadServer", $params);
try
{
if($api_res)
{
$server = $api_res->response->upload_url;
$post = array();
$query = self::$connection->query("SELECT * FROM `images` WHERE `id` IN (".$files.");");
if($query)
{
$i = 1;
while($row = $query->fetch_assoc())
{
if(!empty($row['image'])){
if(file_exists(config::$full_path.'images//'.$row['image'])){
$img = $row['image'];
}else{
$img = 'no-image.jpg';
}
}else{
$img = 'no-image.jpg';
}
$post['file'.$i] = new CURLFile(config::$full_path.'images/'.$img);
$i++;
}
}else
throw new Exception("Ошибка при запросе в базу данных. Error: ".self::$connection->error, 1);
if($ch = curl_init($server))
{
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
$json = json_decode(curl_exec($ch));
curl_close($ch);
$params_save = array(
'server' => $json->server,
'photos_list' => $json->photos_list,
'album_id' => $album_id,
'hash' => $json->hash,
'group_id' => $group_id,
'caption' => 'test message for checking uploading photos to VK.com' //вот это описание припишется ВСЕМ фотографиям, загружаемым в одном запросе
);
$photo_save = self::queryApi('photos.save', $params_save);
if($photo_save)
{
return $photo_save;
}
else throw new Exception("При сохранении фотографий в альбом произошла ошибка.", 1);
}
else throw new Exception("Ошибка инициализации cURL", 1);
}
else throw new Exception("При обращении к API photos.getUploadServer произошла ошибка.", 1);
}catch(Exception $e){
echo $e->getMessage();
return false;
}
}
Функция обращения к API:
public static function queryApi($api, $params = null, $type = 0)
{
//своеобразный костыль-хак, чтоб не писать отдельную функцию для авторизации =)
//если пришел 0-обращение к АПИ, если что-то другое (1) - попытка авторизации
if($type == 0)
{
$server = 'https://api.vk.com/method/';
}else{
$server = 'https://oauth.vk.com/';
}
$params['access_token'] = $_SESSION['vk']['access_token'];
$params['v'] = config::$vk_api['ver'];
$postparams = http_build_query($params);
try{
if($curl = curl_init())
{
curl_setopt($curl, CURLOPT_URL, $server.$api);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postparams);
$result = json_decode(curl_exec($curl));
curl_close($curl);
if(isset($result->error))
{
//Шаблон для ошибок
if($type == 0)
{
$error_msg = "При запросе к VK API возникла ошибка. ERROR CODE: ".$result->error->error_code."; MESSAGE: ".$result->error->error_msg;
}else{
$error_msg = "При попытке авторизации произошла ошибка. ERROR: ".$result->error."; DESCRIPTION: ".$result->error_description;
}
throw new Exception($error_msg, 1);
}
else
{
return $result;
}
}
else
{
throw new Exception("Ошибка инициализации модуля cURL.", 1);
}
}catch(Exception $e){
echo $e->getMessage();
return false;
}
}