vk/hood/vk/system/api/methods/photos.php

262 lines
8.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace hood\vk\api\methods;
use hood\vk\robots\robot,
hood\vk\robots\group;
use hood\accounts\vk as account;
use Exception;
/**
* Фотографии (изображения)
*
* @method public static function put(RobotAbstract $from, int $to, string $message, int $mode = 2) Отправить сообщение
*
* @see https://vk.com/dev/photos.getUploadServer
* @see https://vk.com/dev/messages.getById
*
* @package hood\vk\api\methods
* @author Arsen Mirzaev Tatyano-Muradovich <red@hood.su>
*
* @todo Добавить обработку ошибок ($request['errors];)
*/
final class photos extends method
{
/**
* $url
*/
protected $url;
/**
* Сохранить
*
* @param robot $robot Робот
* @param int $album_id Альбом
* @param int|null $group_id Группа
* @param string|null $caption Описание
* @param float|null $latitude Географическая широта (-90, 90)
* @param float|null $longitude Географическая долгота (-180, 180)
*
* @see https://vk.com/dev/photos.save
*
* @return array|null Ответ сервера
*/
public static function save(robot $robot, int $album_id, array $images, string $upload_url = null, string|null $caption = null, int|null $group_id = null, float|null $latitude = null, float|null $longitude = null): ?array
{
if (isset($robot->account)) {
// Если инициализирован аккаунт
// Порядок инициализации ДОЛЖЕН соответствовать порядку в документации
// Ключ
$settings['access_token'] = $robot->account->key;
// Версия API
$settings['v'] = $robot->version;
// Альбом
$settings['album_id'] = $album_id;
// Группа
if (isset($group_id)) {
$settings['group_id'] = $group_id;
}
//загрузить
$upload = self::uploadMessage($robot, $upload_url, ...$images);
// Сервер
$settings['server'] = $upload['server'];
// Изображения
$settings['photos_list'] = $upload['photos_list'];
// Хеш
$settings['hash'] = $upload['hash'];
// Широта
if (isset($latitude)) {
$settings['latitude'] = $latitude;
}
// Долгота
if (isset($longitude)) {
$settings['longitude'] = $longitude;
}
// Описание
if (isset($caption)) {
$settings['caption'] = $caption;
}
return (array) $robot->browser->api('photos.save', $settings);
}
throw new Exception('Аккаунт не инициализирован');
}
/**
* Загрузить
*
* @param Type $var
* @return void
*/
public static function upload(string ...$images): void
{
if (count($images) > 5) {
throw new Exception('Запрещено отправлять более 5 фотографий');
}
}
/**
* загрузить
*/
public static function uploadMessage(robot $robot, string $upload_url, string ...$images)
{
return $robot->browser->api($upload_url, ...$images);
}
/**
* Получить сервер для загрузки изображений
*
* @param robot $robot Робот
* @param int|null $album_id Альбом
* @param int|group|null $group_id Группа
*
* @see https://vk.com/dev/photos.getUploadServer
*
* @return array|null Ответ сервера
*/
public static function getUploadServer(robot $robot, int|null $album_id = null, int|group|null $group_id = null): ?array
{
if (isset($robot->account)) {
// Если инициализирован аккаунт
// Порядок инициализации ДОЛЖЕН соответствовать порядку в документации API ВКонтакте
// Ключ
$settings['access_token'] = $robot->account->key;
// Версия API
$settings['v'] = $robot->version;
// Альбом
match (true) {
isset($album_id) => $settings['album_id'] = $album_id,
default => $settings['album_id'] = self::getAlbums($robot)
};
// Группа
if (isset($group_id)) {
// При неудачном чтении воспринимать как целочисленное атомарное значение
$settings['group_id'] = $group_id->id ?? $group_id;
}
return (array) $robot->browser->api('photos.getUploadServer', $settings);
}
throw new Exception('Аккаунт не инициализирован');
}
/**
* Получить альбомы
*
* @param robot $robot Робот
* @param array $album_ids = null Идентификаторы альбомов
* @param int $offset = null Смещение для выборки подмножества
* @param int $count = null Количество для возврата
* @param bool $need_system = null Активация возврата системных альбомов
* @param bool $need_covers = null Активация возврата поля с обложкой альбома
* @param bool $photo_sizes = null Активация специального формата размеров фотографий
*
* @see https://vk.com/dev/photos.getUploadServer
*
* @return array Ответ сервера
*/
public static function getAlbums(robot $robot, array $album_ids = null, int $offset = null, int $count = null, bool $need_system = null, bool $need_covers = null, bool $photo_sizes = null): array
{
// Настройки
$settings['access_token'] = $robot->key;
$settings['v'] = $robot->version;
$settings['owner_id'] = $robot->id;
if (isset($album_ids)) {
$settings['album_ids'] = implode(',', $album_ids);
}
if (isset($offset)) {
$settings['offset'] = $offset;
}
if (isset($count)) {
$settings['count'] = $count;
}
if (isset($need_system)) {
$settings['need_system'] = (int) $need_system;
}
if (isset($need_covers)) {
$settings['need_covers'] = (int) $need_covers;
}
if (isset($photo_sizes)) {
$settings['photo_sizes'] = (int) $photo_sizes;
}
// Запрос
$request = $robot->browser->request('POST', 'photos.getUploadServer', $settings)->getBody()->getContents();
return (array) $request;
}
/**
* загрузить фото и получить его id
*
* $robot робот
*
* $img фото
*/
public function get_photo(robot $robot, $img)
{
// Реиницилазиция
$this->robot->api->reinit();
// Инициализация настроек
$this->robot->api['group_id'] = $robot->id;
$this->robot->api['peer_id'] = 0;
if (!isset($this->url)) {
// Получить адрес сервера для загрузки фотографии в личное сообщение
$this->url = json_decode($robot->browser->request('POST', 'photos.getMessagesUploadServer', [
'form_params' => $this->robot->api['settings']
])->getBody()->getContents())->response->upload_url;
}
//загрузить
$response = json_decode($robot->browser->request('POST', $this->url, [
'multipart' => [
[
'Content-type' => 'multipart/form-data',
'name' => 'photo',
'contents' => $img
]
]
])->getBody()->getContents());
$this->robot->api->reinit();
$this->robot->api['group_id'] = $robot->id;
$this->robot->api['server'] = $response->server;
$this->robot->api['photo'] = $response->photo;
$this->robot->api['hash'] = $response->hash;
//сохранить
$response = json_decode($robot->browser->request('POST', 'photos.saveMessagesPhoto', [
'form_params' => $this->robot->api['settings']
])->getBody()->getContents());
//Ссылка на фото
return 'photo' . $response->response[0]->owner_id . '_' . $response->response[0]->id;
}
}