VK API PHP 8.0.17 Массив photo строка, пустой массив photos_list
Работаю с 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);
Ответы (1 шт):
Автор решения: Stanislav Shtepa
→ Ссылка
Пример реализации с помощью либы 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();