Задать вопрос
@f_u_s_s
Любопытный кодер

Как добавлять описания к загружаемым фотографиям в альбом VK?

Есть скрипт, который грузит до 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;
        }
    }
  • Вопрос задан
  • 1180 просмотров
Подписаться 2 Комментировать
Подписчики вопроса 2 К ответам на вопрос (0)