Добавлен Guzzle, переписаны под него запросы.

This commit is contained in:
Kostya Kalimagin 2021-01-03 16:59:35 +08:00
parent 329d698803
commit e07b82ddde
5 changed files with 52 additions and 46 deletions

View File

@ -27,7 +27,8 @@
"psr/log": "1.*", "psr/log": "1.*",
"monolog/monolog": ">=1.6", "monolog/monolog": ">=1.6",
"jasny/error-handler": "^0.2.0", "jasny/error-handler": "^0.2.0",
"hood/accounts": "^0.0.2" "hood/accounts": "^0.0.2",
"guzzlehttp/guzzle": "^7.2"
}, },
"require-dev": { "require-dev": {
"phpdocumentor/phpdocumentor": ">=2.9", "phpdocumentor/phpdocumentor": ">=2.9",

2
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "890608b64debcef7c0a1d909dc4bd81e", "content-hash": "6bfb42640d4d673c945e4d28222eb67a",
"packages": [ "packages": [
{ {
"name": "guzzlehttp/guzzle", "name": "guzzlehttp/guzzle",

View File

@ -10,65 +10,65 @@ use hood\vk\core,
/** /**
* LongPoll * LongPoll
* *
* @property string $key Ключ к серверу * @property string $key Ключ к серверу
* @property string $server Сервер * @property string $server Сервер
* @property string $ts Идентификатор последнего события * @property string $ts Идентификатор последнего события
* *
* @method public function __construct(object $robot) Инициализация * @method public function __construct(object $robot) Инициализация
* @method public function get(int $wait = 25) Получить события * @method public function get(int $wait = 25) Получить события
* @method public function handle(callable $function, int $wait = 25) Обработать события * @method public function handle(callable $function, int $wait = 25) Обработать события
* *
* @see https://vk.com/dev/bots_longpoll * @see https://vk.com/dev/bots_longpoll
* @see https://vk.com/dev/groups.getLongPollServer * @see https://vk.com/dev/groups.getLongPollServer
* @see https://vk.com/dev/groups.setLongPollSettings * @see https://vk.com/dev/groups.setLongPollSettings
* *
* @package hood\vk\api * @package hood\vk\api
* @author Arsen Mirzaev Tatyano-Muradovich <red@hood.su> * @author Arsen Mirzaev Tatyano-Muradovich <red@hood.su>
* *
* @todo Добавить обработку ошибок ($request['errors];) * @todo Добавить обработку ошибок ($request['errors];)
*/ */
final class longpoll final class longpoll
{ {
/** /**
* Робот * Робот
* *
* @var string * @var string
*/ */
private robot $robot; private robot $robot;
/** /**
* Ключ к серверу * Ключ к серверу
* *
* @see $this->get() * @see $this->get()
* *
* @var string * @var string
*/ */
private string $key; private string $key;
/** /**
* Сервер (URL) * Сервер (URL)
* *
* @see $this->get() * @see $this->get()
* *
* @var string * @var string
*/ */
private string $server; private string $server;
/** /**
* Идентификатор последнего события * Идентификатор последнего события
* *
* От него отсчитываются новые, необработанные события * От него отсчитываются новые, необработанные события
* *
* @see $this->get() * @see $this->get()
* *
* @var string * @var string
*/ */
private string $ts; private string $ts;
/** /**
* Инициализация * Инициализация
* *
* @param robot $robot Робот * @param robot $robot Робот
*/ */
public function __construct(robot $robot) public function __construct(robot $robot)
@ -85,11 +85,11 @@ final class longpoll
$this->robot = $robot; $this->robot = $robot;
// Остановка процессов-дубликатов // Остановка процессов-дубликатов
if (!file_exists(core::init()->path['temp'])) { if (!file_exists(core::init()->path_temp)) {
// Если не существует каталога temp, то создать // Если не существует каталога temp, то создать
mkdir(core::init()->path['temp'], 0775, true); mkdir(core::init()->path_temp, 0775, true);
} }
if (file_exists($lock = core::init()->path['temp'] . '/' . $this->robot->id . '_' . (int) $this->robot->session . '.longpoll')) { if (file_exists($lock = core::init()->path_temp . '/' . $this->robot->id . '_' . (int) $this->robot->session . '.longpoll')) {
// Если существует файл-блокировщик, то удалить его // Если существует файл-блокировщик, то удалить его
unlink($lock); unlink($lock);
} }
@ -97,12 +97,12 @@ final class longpoll
/** /**
* Установить настройки * Установить настройки
* *
* Полная настройка и активация LongPoll * Полная настройка и активация LongPoll
* *
* @param bool $status = true Активация или деактивация * @param bool $status = true Активация или деактивация
* @param string ...$params Изменяемые параметры * @param string ...$params Изменяемые параметры
* *
* @return array * @return array
*/ */
public function post(bool $status = true, string ...$params): array public function post(bool $status = true, string ...$params): array
@ -134,12 +134,12 @@ final class longpoll
if ($param !== 'all') { if ($param !== 'all') {
// Если параметр не указывает на установку всех значений // Если параметр не указывает на установку всех значений
// Установка значения // Установка значения
$settings[$param] = $status; $settings[$param] = $status;
} else { } else {
// Иначе установить все значения // Иначе установить все значения
// Если передан параметр: установка ВСЕХ значений // Если передан параметр: установка ВСЕХ значений
$settings['message_new'] = $status; $settings['message_new'] = $status;
$settings['message_reply'] = $status; $settings['message_reply'] = $status;
@ -186,14 +186,14 @@ final class longpoll
} }
} }
return $this->robot->browser()->post('https://api.vk.com/method/groups.setLongPollSettings', $settings); return $this->robot->browser->request('POST', 'groups.setLongPollSettings', $settings);
} }
/** /**
* Получить события * Получить события
* *
* @param int $wait Время ожидания новых событий (в секундах) * @param int $wait Время ожидания новых событий (в секундах)
* *
* @return array * @return array
*/ */
public function get(int $wait = 25): array public function get(int $wait = 25): array
@ -202,40 +202,44 @@ final class longpoll
// Если не инициализирован LongPoll-сервер // Если не инициализирован LongPoll-сервер
// Запрос на получение доступа и данных LongPoll-сервера // Запрос на получение доступа и данных LongPoll-сервера
$response = $this->robot->browser()->post('https://api.vk.com/method/groups.getLongPollServer', [ echo 'запрос на получение данных лонгполл';
'group_id' => $this->robot->id, $response = json_decode($this->robot->browser->request('POST', 'groups.getLongPollServer', [
'access_token' => $this->robot->key, 'form_params' => [
'v' => $this->robot->version 'group_id' => $this->robot->id,
])['response']; 'v' => $this->robot->version,
'access_token' => $this->robot->key
],
])->getBody()->getContents())->response;
// Ключ доступа // Ключ доступа
$this->key = $response['key']; $this->key = $response->key;
// Сервер хранящий события // Сервер хранящий события
$this->server = $response['server']; $this->server = $response->server;
// Идентификатор последнего события // Идентификатор последнего события
$this->ts = $response['ts']; $this->ts = $response->ts;
} }
// Запрос на получение событий // Запрос на получение событий
return $this->robot->browser()->post($this->server . '?act=a_check&key=' . $this->key . '&ts=' . $this->ts . '&wait=' . $wait); return json_decode($this->robot->browser->post($this->server . '?act=a_check&key=' . $this->key . '&ts=' . $this->ts . '&wait=' . $wait)->getBody()->getContents(), true);
} }
/** /**
* Обработать события * Обработать события
* *
* Получает и обрабатывает события * Получает и обрабатывает события
* *
* @param callable $function Обработка * @param callable $function Обработка
* @param int $wait Время ожидания новых событий (в секундах) * @param int $wait Время ожидания новых событий (в секундах)
* *
* @return array * @return array
*/ */
public function handle(callable $function, int $wait = 25): array public function handle(callable $function, int $wait = 25): array
{ {
// Файл-блокировщик и PID процесса // Файл-блокировщик и PID процесса
$lock = core::init()->path['temp'] . '/' . $this->robot->id . '_' . (int) $this->robot->session . '.longpoll'; $lock = core::init()->path_temp . '/' . $this->robot->id . '_' . (int) $this->robot->session . '.longpoll';
$pid = getmypid(); $pid = getmypid();
// Создание или пересоздание файла-блокировщика // Создание или пересоздание файла-блокировщика
@ -256,16 +260,16 @@ final class longpoll
break; break;
} }
if (!empty($request['response']['updates'])) { if (!empty($request['updates'])) {
// Если получены необработанные события // Если получены необработанные события
foreach ($request['response']['updates'] as $update) { foreach ($request['updates'] as $update) {
// Перебор полученных событий // Перебор полученных событий
$function($update); $function($update);
} }
// Обновление идентификатора последнего события // Обновление идентификатора последнего события
$this->ts = $request['response']['ts']; $this->ts = $request['ts'];
} }
} while (true); } while (true);

View File

@ -153,8 +153,8 @@ final class messages extends method
} }
// Запрос // Запрос
$request = $this->robot->browser->request('POST', 'messages.send', $settings); $request = $this->robot->browser->request('POST', 'messages.send', ['form_params' => $settings]);
// Очистка // Очистка
unset($settings); unset($settings);

View File

@ -84,6 +84,7 @@ abstract class robot
*/ */
protected int $messages_mode = 1; protected int $messages_mode = 1;
/** /**
* Конструктор * Конструктор
* *
@ -284,7 +285,7 @@ abstract class robot
return $this->browser ?? $this->browser = new browser([ return $this->browser ?? $this->browser = new browser([
'base_uri' => 'https://api.vk.com/method/', 'base_uri' => 'https://api.vk.com/method/',
'cookies' => true 'cookies' => true
]);; ]);
} else if ($name === 'proxy') { } else if ($name === 'proxy') {
return $this->proxy; return $this->proxy;
} else if ($name === 'captcha') { } else if ($name === 'captcha') {