262 lines
8.8 KiB
PHP
262 lines
8.8 KiB
PHP
<?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;
|
||
}
|
||
}
|