Обертка на PHP7+ для работы с REST API v1 сервиса Бизон 365 c троттлингом запросов к API и логированием в файл.
- PHP >= 7.0;
- класс
HTTP
>= 3.0 - НТТР(S) клиент с троттлингом запросов, поддержкой маркера BOM в теле сообщения формата JSON и выводом отладочной информации о запросах и ответах в STDOUT; - класс
DebugLogger
>= 2.0 - логгер, сохраняющий отладочную информацию в файл вместе с данными об объеме используемой оперативной памяти и прошедшем времени; - произвольный автозагрузчик классов, реализующий стандарт PSR-4.
Установка через composer:
$ composer require andrey-tech/bizon365-api-php:"^2.2"
или добавить
"andrey-tech/bizon365-api-php": "^2.2"
в секцию require файла composer.json.
Для работы с REST API v1 сервиса Бизон 365 используется класс \App\Bizon365\Bizon365API
.
При возникновении ошибок выбрасывается исключение класса \App\Bizon365\Bizon365APIException
.
В настоящее время в классе реализованы:
- методы работы со страницами регистрации и подписчиками вебинаров;
- методы для получения отчетов по проведенным вебинарам и автовебинарам.
Поддерживается оба способа авторизации в сервисе Бизон 365:
- предварительная авторизация с получением cookie;
- авторизация через токен пользователя.
__construct(string $authToken = null)
Конструктор класса.$authToken
- токен авторизации (для авторизации посредством токена пользователя).
auth(string $username, string $password) :array
Выполняет предварительную авторизация с получением cookie и возвращает ответ от API.$username
- имя пользователя;$password
- пароль пользователя.
logout() :array
Выполняет выход из системы и возвращает ответ от API.setLogger($logger)
Устанавливает объект класса, выполняющего логирование отладочной информации в файл.- объект класса, реализующего интерфейс
\App\DebugLogger\DebugLoggerInterface
.
- объект класса, реализующего интерфейс
Дополнительные параметры настройки доступны через публичные свойства класса \App\Bizon365\Bizon365API
:
Нестатическое свойство | По умолчанию | Описание |
---|---|---|
$logger |
null | Хранит объект класса \App\DebugLogger\DebugLogger , выполняющего логирование запросов и ответов к API в файл. Если null, то логирование не выполняется. |
$http |
\App\HTTP\HTTP |
Хранит объект класса \App\HTTP\HTTP , отправляющего запросы к API |
Методы для получения отчетов по проведенным вебинарам и автовебинарам находятся в трейте \App\Bizon365\WebinarViewers
:
getWebinarList(int $skip = 0, int $limit = 100, bool $liveWebinars = true, bool $autoWebinars = true) :array
Возвращает список доступных отчетов по вебинарам.$skip
- пропустить указанное число записей;$limit
- ограничить количество записей (не более 100);$liveWebinars
- искать среди живых вебинаров;$autoWebinars
- искать среди автовебинаров.
getAllWebinarList(int $skip = 0, int $limit = 100, bool $liveWebinars = true, bool $autoWebinars = true) :array
Возвращает список всех доступных отчетов по вебинарам.$skip
- пропустить указанное число записей;$limit
- количество записей в одном ответе от API (не более 100);$liveWebinars
- искать среди живых вебинаров;$autoWebinars
- искать среди автовебинаров.
getWebinarViewers(string $webinarId, int $skip = 0, int $limit = 1000) :array
Возвращает список зрителей вебинара.$webinarId
- ID вебинара;$skip
- пропустить указанное число записей;$limit
- ограничить количество записей (не более 1000);
getAllWebinarViewers(string $webinarId, int $skip = 0, int $limit = 1000) :array
Возвращает список всех зрителей вебинара.$webinarId
- ID вебинара;$skip
- пропустить указанное число записей;$limit
- количество записей в одном ответе от API (не более 100);
use App\Bizon365\{Bizon365API, Bizon365APIException};
try {
$bizon365 = new Bizon365API();
// Выполняем предварительную авторизацию
$bizon365->auth('ivan@example.com', 'klfi89309gkds');
// Получаем список из 100 доступных отчетов по вебинарам
$webinars = $bizon365->getWebinarList($skip = 0, $limit = 100);
print_r($webinars);
// Получаем список всех доступных отчетов по вебинарам
$webinars = $bizon365->getAllWebinarList();
print_r($webinars);
// Получаем список из 100 зрителей первого вебинара
$webinarId = $webinars[0]['webinarId'];
$viewers = $bizon365->getWebinarViewers($webinarId, $skip = 0, $limit = 100);
print_r($viewers);
// Получаем список всех зрителей первого вебинара
$viewers = $bizon365->getAllWebinarViewers($webinarId);
print_r($viewers);
// Выполняем выход
$bizon365->logout();
} catch (Bizon365APIException $e) {
printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}
Методы для работы со страницами регистрации и подписчиками находятся в трейте \App\Bizon365\WebinarSubsribers
:
getWebinarSubpages(int $skip = 0, int $limit = 50) :array
Возвращает список страниц регистрации и их рассылок.$skip
- пропустить указанное число записей;$limit
- ограничить количество записей (не более 50).
getAllWebinarSubpages(int $skip = 0, int $limit = 50) :array
Возвращает список всех страниц регистрации и их рассылок.$skip
- пропустить указанное число записей;$limit
- количество записей в одном ответе от API (не более 50).
getWebinarSubscribers(string $pageId, int $skip = 0, int $limit = 1000, string $webinarTimeMin = null, string $webinarTimeMax = null, string $registeredTimeMin = null, string $registeredTimeMax = null, string $url_marker = null) :array
Возвращает список подписчиков для заданной страницы регистрации.$pageId
- ID страницы регистрации;$skip
- пропустить указанное число записей;$limit
- ограничить количество записей (не более 1000);$webinarTimeMin
- нижняя граница для времени сеанса, на который зарегистрированы подписчики, в формате ISO8601;$webinarTimeMax
- верхняя граница для времени сеанса, на который зарегистрированы подписчики, в формате ISO8601;$registeredTimeMin
- нижняя граница для времени регистрации подписчика в формате ISO8601;$registeredTimeMax
- верхняя граница для времени регистрации подписчика в формате ISO8601;$url_marker
- значение маркера из URL, идентификатор партнера.
getAllWebinarSubscribers(string $pageId, int $skip = 0, int $limit = 1000, string $webinarTimeMin = null, string $webinarTimeMax = null, string $registeredTimeMin = null, string $registeredTimeMax = null, string $url_marker = null) :array
Возвращает список всех подписчиков для заданной страницы регистрации.$pageId
- ID страницы регистрации;$skip
- пропустить указанное число записей;$limit
- количество записей в одном ответе от API (не более 1000);$webinarTimeMin
- нижняя граница для времени сеанса, на который зарегистрированы подписчики, в формате ISO8601;$webinarTimeMax
- верхняя граница для времени сеанса, на который зарегистрированы подписчики, в формате ISO8601;$registeredTimeMin
- нижняя граница для времени регистрации подписчика в формате ISO8601;$registeredTimeMax
- верхняя граница для времени регистрации подписчика в формате ISO8601;$url_marker
- значение маркера из URL, идентификатор партнера.
use App\Bizon365\{Bizon365API, Bizon365APIException};
try {
// Авторизация через токен пользователя
$token = 'exampleIBJ4P30oN38H2W4nr1Va4ry4PnH7s4p38S5Xv6B7EoI';
$bizon365 = new Bizon365API($token);
// Получаем список из 100 страниц регистрации и их рассылок
$subpages = $bizon365->getWebinarSubpages($skip = 0, $limit = 100);
print_r($subpages);
// Получаем список комнат
$response = $this->http->getResponse(false);
print_r($response['rooms']);
// Получаем список всех страниц регистрации и их рассылок
$subpages = $bizon365->getAllWebinarSubpages();
print_r($subpages);
// Получаем список всех подписчиков вебинаров на заданной странице регистрации за 31 июля 2020 г.
$pageId = '123456:as';
$webinarTimeMin = '2020-07-31T00:00:00+03:00';
$webinarTimeMax = '2020-07-31T23:59:59+03:00';
$subscribers = $bizon365->getAllWebinarSubscribers($pageId, 0, 1000, $webinarTimeMin, $webinarTimeMax);
// Выполняем выход
$bizon365->logout();
} catch (Bizon365APIException $e) {
printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}
Класс \App\HTTP\НТТР
обеспечивает:
- формирование POST запросов к API Бизон 365 по протоколу HTTPS;
- настраиваемый троттлинг запросов к API (по умолчанию отключен);
- вывод отладочной информации о запросах к API в STDOUT.
При возникновении ошибок выбрасывается исключение с объектом класса \App\HTTP\HTTPException
.
use App\Bizon365\{Bizon365API, Bizon365APIException};
use App\HTTP\HTTP;
try {
$bizon365 = new Bizon365API();
// Устанавливаем максимальный уровень вывода отладочных сообщений в STDOUT
$bizon365->http->debugLevel = HTTP::DEBUG_URL | HTTP::DEBUG_HEADERS | HTTP::DEBUG_CONTENT;
// Устанавливаем троттлинг запросов на уровне не более 1 запрос в секунду
$bizon365->http->throttle = 1;
// Устанавливаем таймаут обмена данными в 30 секунд
$bizon365->http->curlTimeout = 30;
// Выполняем авторизацию
$bizon365->auth('ivan@example.com', 'klfi89309gkds');
} catch (Bizon365APIException $e) {
printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}
Примеры отладочных сообщений:
[1] ===> POST https://online.bizon365.ru/api/v1/auth/login
POST /api/v1/auth/login HTTP/1.1
Host: online.bizon365.ru
User-Agent: HTTP-client/2.x.x
Accept: */*
Content-type: application/x-www-form-urlencoded
Content-Length: 47
username=ivan@example.como&password=klfi89309gkds
[1] <=== RESPONSE 0.6192s (200)
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 15 Jun 2020 12:08:03 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 125
Connection: keep-alive
X-DNS-Prefetch-Control: off
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Download-Options: noopen
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, X-Token
Access-Control-Allow-Method: HEAD OPTIONS GET POST PUT UPDATE PATCH
Access-Control-Max-Age: 86400
Access-Control-Allow-Credentials: true
ETag: W/"7d-8pw4R/X+sbjhsu6o6SkgY7bXiYo"
set-cookie: appsid=s%3AmQiE5vQbA-8WS4KCyPS9MHmgKIB1GHA-.XAESPMGN%2FUa4zYLca7UsbIVFjMYjOjw4hjE5N%2Fj2ZBU; Path=/; Expires=Mon, 15 Jun 2020 13:07:48 GMT; HttpOnly
{"message":"Успешная авторизация. Куки отправлены вместе с этим ответом."}
Класс \App\DebugLogger\DebugLogger
обеспечивает логирование запросов и ответов к API Бизон 365 в файл.
При возникновении ошибок выбрасывается исключение класса \App\DebugLogger\DebugLoggerException
.
static instance(string $logFileName = 'debug.log') :self
Возвращает единственный объект данного класса для заданного лог-файла$logFileName
.$logFileName
- имя лог-файла.
save(mixed $info, object $object = null, string $header = null) :void
Сохраняет подлежащую логированию информацию в файл.$info
- строка, массив или объект для логирования;$object
- ссылка на объект класса в котором выполняется логирование;$header
- строка заголовка для сохраняемой в лог файл информации.
Дополнительные параметры устанавливаются через публичные свойства класса \App\DebugLogger\DebugLogger
:
Нестатическое свойство | По умолчанию | Описание |
---|---|---|
$isActive |
false | Включает или выключает логирование для конкретного файла, задаваемого параметром $logFileName метода instance() |
Статическое свойство | По умолчанию | Описание |
---|---|---|
$logFileDir |
temp/ |
Устанавливает каталог, в котором сохраняются лог-файлы |
mkdirMode |
0755 | Устанавливает режим доступа для создаваемых каталогов для хранения лог файлов в виде восьмеричного числа |
$uniqIdLength |
7 | Длина уникального буквенно-цифрового [a-z0-9]+ идентификатора объекта класса DebugLogger для сохранения в лог файле, позволяющего находить записи, созданные одним и тем же процессом |
use App\Bizon365\{Bizon365API, Bizon365APIException};
use App\DebugLogger\DebugLogger;
try {
$bizon365 = new Bizon365API();
// Устанавливаем каталог для сохранения лог файлов
DebugLogger::$logFileDir = 'logs/';
// Создаем объект класса логгера
$logFileName = 'debug_bizon365api.log';
$logger = DebugLogger::instance($logFileName);
// Включаем логирование
$logger->isActive = true;
// Устанавливаем логгер
$bizon365->setLogger($logger);
// Выполняем авторизацию
$bizon365->auth('ivan@example.com', 'klfi89309gkds');
} catch (Bizon365APIException $e) {
printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}
Пример результатов логирования:
*** oun0lym [2020-06-15 12:08:06.732048 +00:00 Δ- s, 0.53/2.00 MiB] ********************
* Class: App\Bizon365\Bizon365API
ЗАПРОС: POST https://online.bizon365.ru/api/v1/auth/login
{
"username": "ivan@example.com",
"password": "klfi89309gkds"
}
*** oun0lym [2020-06-15 12:08:07.364074 +00:00 Δ0.632026 s, 0.53/2.00 MiB] ********************
* Class: App\Bizon365\Bizon365API
ОТВЕТ: POST https://online.bizon365.ru/api/v1/auth/login
{
"message": "Успешная авторизация. Куки отправлены вместе с этим ответом."
}
*** oun0lym [2020-06-15 12:08:07.364074 +00:00 Δ0.632026 s, 0.53/2.00 MiB] ********************
* Class: App\Bizon365\Bizon365API
oun0lym
- уникальный буквенно-цифровой [a-z0-9]+ идентификатор объекта классаDebugLogger
, позволяющий находить в лог файле записи, созданные одним и тем же процессом;2020-06-15 12:08:07.364074 +00:00
- дата и время сохранения информации с точностью до микросекунд;Δ0.632026 s
- время, прошедшее с момента предыдущего сохранения информации в секундах и микросекундах;0.53/2.00 MiB
- данные об используемой оперативной памяти в единицах количества информации с двоичными приставками:0.53
- максимальный объем памяти, который был выделен PHP-скрипту системой;2.00
- реальный объем памяти, выделенный PHP-скрипту системой;
Class: App\Bizon365\Bizon365API
- полное имя класса из которого выполнено сохранение в лог файл.
© 2019-2021 andrey-tech
Данный код распространяется на условиях лицензии MIT.