VK API PHP 8.0.17 Массив photo строка, пустой массив photos_list

Рейтинг: 0Ответов: 1Опубликовано: 03.06.2023

Работаю с VK API на PHP 8.0.17. Нужно загрузить фотографию на сервер и получить ответ, однако что-то не так и переменная $temp_photo оказывается строкой и нарушает дальнейшую работу программы.

Что не так:

Первый var_dump - "photo" не массив, а текст

okarray(3) {
  ["server"]=>
  int(521232)
  ["photo"]=>
  string(2) "[]"
  ["hash"]=>
  string(32) "b0a5c40ef46e5090202f088dc662d9fc"
}

Второй - уже выходящая из этого ошибка

array(1) {
  ["error"]=>
  array(3) {
    ["error_code"]=>
    int(100)
    ["error_msg"]=>
    string(78) "One of the parameters specified was missing or invalid: photos_list is invalid"
    ["request_params"]=>
    array(6) {
      [0]=>
      array(2) {
        ["key"]=>
        string(6) "server"
        ["value"]=>
        string(6) "534136"
      }
      [1]=>
      array(2) {
        ["key"]=>
        string(5) "photo"
        ["value"]=>
        string(2) "[]"
      }
      [2]=>
      array(2) {
        ["key"]=>
        string(4) "hash"
        ["value"]=>
        string(32) "15edc07540a36cbbcffbe751a91aee89"
      }
      [3]=>
      array(2) {
        ["key"]=>
        string(1) "v"
        ["value"]=>
        string(5) "5.131"
      }
      [4]=>
      array(2) {
        ["key"]=>
        string(6) "method"
        ["value"]=>
        string(24) "photos.saveMessagesPhoto"
      }
      [5]=>
      array(2) {
        ["key"]=>
        string(5) "oauth"
        ["value"]=>
        string(1) "1"
      }
    }
  }
}

Код:

$request_params = array(
    'peer_id' => $chat_id,
    'access_token' => $photos_token,
    'v' => '5.131'
);
                                    
$get_params = http_build_query($request_params);
                                    
$temp_info = json_decode(file_get_contents('https://api.vk.com/method/photos.getMessagesUploadServer?'. $get_params));
                                    
$temp_album_id = $temp_info->response->album_id;
$temp_upload_url = $temp_info->response->upload_url;
$temp_user_id = $temp_info->response->user_id;
$temp_group_id = $temp_info->response->group_id;

// Инициализируем cURL
$curl = curl_init($temp_upload_url);
                                    
$random = 0;
$file = 'grinding/' . $random . '.png';
$file = new CURLFile($file, 'image/jpeg', 'test_name');
                                    
$data = array('test_file' => $file);
// Говорим cURL, что это POST-запрос
curl_setopt($curl, CURLOPT_POST, 1);
// Говорим cURL, какие поля будем отправлять
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
// Говорим cURL, что нам нужно знать, что ответит сервер, к которому мы будем обращаться
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

// Выполняем cURL-запрос. В этой переменной будет JSON-ответ от ВКонтакте
$curl_result = curl_exec($curl);
$temp_info = json_decode($curl_result, true);

// Закрываем соединение
curl_close($curl);
                                    
$temp_server = $temp_info['server'];
$temp_photo = $temp_info['photo'];
$temp_hash = $temp_info['hash'];

// var_dump($temp_info); НОМЕР ОДИИИИИИИИИИИИИИИИИИИИН

$request_params = array(
    'server' => $temp_server,
    'photo' => $temp_photo,
    'hash' => $temp_hash,
    'access_token' => $photos_token,
    'v' => '5.131'
);
                                    
$get_params = http_build_query($request_params);
                                    
$temp_info = json_decode(file_get_contents('https://api.vk.com/method/photos.saveMessagesPhoto?'. $get_params), true);
                                    
// var_dump($temp_info); НОМЕР ДВААААААААААААА

// С помощью messages.send отправляем ответное сообщение
$request_params = array(
    'message' => 'Картинка',
    'peer_id' => $chat_id,
    'attachment' => 'photo' . $temp_info['response'][0]['owner_id'] . '_' . $temp_info['response'][0]['id'],
    'access_token' => $messages_token,
    'v' => '5.131',
    'random_id' => 0
);
                                    
$get_params = http_build_query($request_params);
                                    
file_get_contents('https://api.vk.com/method/messages.send?'. $get_params);

Ответы

▲ 0

Пример реализации с помощью либы https://github.com/ctapu4ok/vk-messenger-sdk

<?php declare(strict_types=1);

if (file_exists('vendor/autoload.php')) {
    require_once 'vendor/autoload.php';
}

use ctapu4ok\VkMessengerSdk\EventHandler;
use ctapu4ok\VkMessengerSdk\Logger;
use ctapu4ok\VkMessengerSdk\Settings;

enum Params
{
    public const API_HASH = 'vk1.a.GLlGmwNDe1iuRjb0a.....';
    public const GROUP_ID = 12345678;
    public const CONFIRM_STRING = 'c683e9eb12cebb65ce323467d8ab32508e55c7a0ecfecc0a0e92e31d8785adf4';

    public const VERSION = '5.81';
}

/**
 * Данный пример не является асинхронным!  На текущий момент не реализован асинхронный функционал работы с файлами
 */
class MessengerEvent extends EventHandler
{
    public function onStart(): void
    {
        $this->wrapper->getAPI()->logger('The event handler was initialized');
    }

    public function messageNew(int $group_id, ?string $secret, array $object): void
    {

        /**
         * Получаем сервер для загрузки
         */
        $photoAlbums = $this->wrapper->getAPI()->vk->photos()->getMessagesUploadServer([
            'peer_id' => $object['message']['peer_id']
        ]);
        /**
         * Загружаем фотографию на сервер
         */
        $uploadedPhoto = $this->wrapper->getAPI()->vk->photos()->uploadPhotoToServer([
            'server' => $photoAlbums['upload_url'],
            'photo' => __DIR__.'/../assets/vk-messenger-logo.jpg'
        ]);
        /**
         * Сохраняем фото в сообщении
         */
        $savedMessage = $this->wrapper->getAPI()->vk->photos()->saveMessagesPhoto([
            'server' => $uploadedPhoto['server'],
            'photo'=>$uploadedPhoto['photo'],
            'hash' => $uploadedPhoto['hash']
        ]);
        /**
         * Отправляем сообщение
         * @var $this->wrapper Main wrapper
         * @var $this->wrapper->getAPI()->vk The main VK API methods src/API/Actions
         */
        $msg_id = $this->wrapper->getAPI()->vk->messages()->send([
            'user_id' => $object['message']['from_id'],
            'random_id' => floor(microtime(true) * 1000),
            'peer_id' => $object['message']['peer_id'],
            'message' => 'Hello World!',
            'attachment' => 'photo'.$savedMessage[0]['owner_id'].'_'.$savedMessage[0]['id']
        ]);
    }
}

function extracted(): void
{
    $Settings = new Settings();

    $Settings->getAppInfo()->setApiHash(Params::API_HASH);
    $Settings->getAppInfo()->setGroupId(Params::GROUP_ID);
    $Settings->getAppInfo()->setConfirmString(Params::CONFIRM_STRING);
    $Settings->getAppInfo()->setApiVersion(Params::VERSION);

    MessengerEvent::loop($Settings);
}

extracted();