VK API загрузка нескольких фото на стену

154
07 августа 2021, 01:20

Всем примет,имею такой код,он работает с одним фото,но как можно загрузить разом 5 фоток? Понимаю,что по логике надо этот код,до поста на стену прогонять по N = к-во фото,но вот как это все сделать?

      <?php
$group_id     = 'XXX';
$access_token = 'XXXX';
$message      = 'Hello, world!';
$image        = 'test.jpg';
$url = vk('photos.getWallUploadServer', [
    'group_id' => $group_id,
    'v' => '5.85',
    'access_token' => $access_token
])->response->upload_url; // Обращаемся сразу к <response[upload_url]>
if (isset($url))
{
    $upload = json_decode(curl($url, ['photo' => new CURLFile($image)]));
    if (isset($upload->server))
    {
        $save = vk('photos.saveWallPhoto', [
            'group_id' => $group_id,
            'server' => $upload->server,
            'access_token' => $access_token,
            'hash' => $upload->hash,
            'photo' => $upload->photo,
            'v' => '5.85'
        ])->response[0]; // Обращаемся сразу к <response[0]>
        if (isset($save))
        {
            $post = vk('wall.post', [
                'owner_id' => '-'.$group_id,
                'access_token' => $access_token,
                'from_group' => 1,
                'message' => $message,
                'attachments' => 'photo'.$save->owner_id.'_'.$save->id,
                'v' => '5.85'
            ]);
            print_r($post);
        }
    }
}
function vk($method, $params)
{
    return json_decode(curl('https://api.vk.com/method/'.$method, $params));
}
function curl($url, $params = false)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if (isset($params))
    {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    }
    $upd = curl_exec($ch);
    curl_close($ch);
    return $upd;
}

И так же мучает вопрос,как загружать фото по ссылке,а не с моего хостинга?

Этот вопрос решил так

  $content = file_get_contents(''.$_GET['url'].'');
    file_put_contents('images/test.jpg', $content);
    $image        = 'images/test.jpg';

Название фото буду давать по vk_id юзера и потом удалять.

Answer 1

Вопрос решился таким костылем. $vkid получаю от вк,далее обрабатываю $array = explode(',', $url_photo);

И после чего выполняю

if (file_exists($file1)) {

Столько раз,сколько у нас фоток найдено в папке.И каждый ответ вношу в массив по такой схеме

$ids[] = 'photo'.$fok['response'][0]['owner_id'].'_'.$fok['response'][0]['id'];

Далее пример кода в сборке.

foreach($array as $image) {
  $img = 'images/'.$vkid.'-'.$count++.'.png';
    file_put_contents($img, file_get_contents($image));
}
   $imga = array();
    $ids = array();
     $photos =  explode(',', $url_photo);
foreach ($photos as $item) {
$file1 = 'images/'.$vkid.'-0.png';
$file2 = 'images/'.$vkid.'-1.png';
$file3 = 'images/'.$vkid.'-2.png';
$file4 = 'images/'.$vkid.'-3.png';
$file5 = 'images/'.$vkid.'-4.png';
}
if (file_exists($file1)) {
 $getwall = 'https://api.vk.com/method/photos.getWallUploadServer?v=5.52&group_id='.$myidgr.'&access_token='.$tok;
   $dl = file_get_contents($getwall);
   $dl = json_decode($dl); ///Декодируем json
   $dl = $dl->response->upload_url; ///Получаем ссылку загрузки от Вконтакте
            $file = new CURLFile(realpath("$file1")); ///Загружаем картинку
            $ch = curl_init($dl);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => $file));
            $data = curl_exec($ch);
            curl_close($ch);
            $fot = $data; ///Получаем данные из массива
            $fot = json_decode($data); ///Декодируем json
            $fot = $fot->photo; ///Получаем данные из массива
            $hash = json_decode($data); ///Декодируем json
            $hash = $hash->hash; ///Получаем данные из массива
            $serv = json_decode($data); ///Декодируем json
            $serv = $serv->server; ///Получаем данные из массива
///Сохраняем фото на сервер Вконтакте
$savephoto = 'https://api.vk.com/method/photos.saveWallPhoto?v=5.52&group_id='.$myidgr.'&hash='.$hash.'&server='.$serv.'&photo='.$fot.'&access_token='.$tok;
      $result = file_get_contents($savephoto);
      $fok = json_decode($result,true); ///Декодируем json
   $ids[] = 'photo'.$fok['response'][0]['owner_id'].'_'.$fok['response'][0]['id'];
}

И так уже отправляю фото с текстом на стену.

$ids=implode(',',$ids);
                if (isset($ids))
        {
            $post = vk('wall.post', [
                'owner_id' => '-'.$myidgr,
                'access_token' => $tok,
                'from_group' => 1,
                'message' => "Категория: $cat \n $text \n Автор: $author",
                'attachments' => $ids,
                'v' => '5.85',
                'publish_date' => time()+80000
            ]);
}

Если у кого-то будут вопросы по моему коду или еще что-то пишите. Знаю что код г**но,но результата я добился.

READ ALSO
Слетают права на сервере

Слетают права на сервере

Более месяца работал стабильноБуквально на днях начала появляться проблема: у сайта (cmf modx) отнимаются права доступа, и ни один плагин не работает,...

230
Отправка формы обратной связи с AJAX/JQUERY

Отправка формы обратной связи с AJAX/JQUERY

У меня есть рабочая форма обратной связи, когда я пишу в форме action="popphp", и нажимаю на сабмит, она перенаправляется по адресу site

174
Как получить json из post-запроса

Как получить json из post-запроса

Есть 2 файлаПервый обращается ко второму методом post и передает json

179
Выбор номера телефона из входящих вызовов

Выбор номера телефона из входящих вызовов

Есть метод с выбором контакта из списка контактов:

318