Получение статистики за произвольные даты
PHP версии 5, формат JSON, используется библиотека cURL
Пример демонстрирует выполнение запроса к сервису Reports, обработку и вывод результата. Режим формирования отчета выбирается автоматически. Если отчет поставлен в очередь на формирование в режиме офлайн, выполняются повторные запросы.
Отчет содержит количество показов, кликов и расход средств по всем кампаниям рекламодателя за произвольный период, с группировкой по дате, наименованию кампании и региону местонахождения пользователя.
Для использования примера во входных данных укажите OAuth-токен. При запросе от имени агентства необходимо также указать логин клиента. В теле запроса укажите начальную и конечную даты отчетного периода, а также название отчета, уникальное для рекламодателя.
<?php
// Настройки для вывода содержимого буфера, которые позволяют делать вывод на экран
// при использовании функции sleep
ob_implicit_flush();
//--- Входные данные ---------------------------------------------------//
// Адрес сервиса Reports для отправки JSON-запросов (регистрозависимый)
$url = 'https://api.direct.yandex.com/json/v5/reports';
// OAuth-токен пользователя, от имени которого будут выполняться запросы
$token = 'ТОКЕН';
// Логин клиента рекламного агентства
// Обязательный параметр, если запросы выполняются от имени рекламного агентства
$clientLogin = 'ЛОГИН_КЛИЕНТА';
//--- Подготовка запроса -----------------------------------------------//
// Создание тела запроса
$params = [
"params" => [
"SelectionCriteria" => [
"DateFrom" => "НАЧАЛЬНАЯ_ДАТА",
"DateTo" => "КОНЕЧНАЯ_ДАТА"
],
"FieldNames" => ["Date", "CampaignName", "LocationOfPresenceName", "Impressions", "Clicks", "Cost"],
"ReportName" => "НАЗВАНИЕ_ОТЧЕТА",
"ReportType" => "CAMPAIGN_PERFORMANCE_REPORT",
"DateRangeType" => "CUSTOM_DATE",
"Format" => "TSV",
"IncludeVAT" => "NO",
"IncludeDiscount" => "NO"
]
];
// Преобразование входных параметров запроса в формат JSON
$body = json_encode($params);
// Создание HTTP-заголовков запроса
$headers = array(
// OAuth-токен. Использование слова Bearer обязательно
"Authorization: Bearer $token",
// Логин клиента рекламного агентства
"Client-Login: $clientLogin",
// Язык ответных сообщений
"Accept-Language: ru",
// Режим формирования отчета
"processingMode: auto",
// Формат денежных значений в отчете
// "returnMoneyInMicros: false",
// Не выводить в отчете строку с названием отчета и диапазоном дат
// "skipReportHeader: true",
// Не выводить в отчете строку с названиями полей
// "skipColumnHeader: true",
// Не выводить в отчете строку с количеством строк статистики
// "skipReportSummary: true"
);
// Инициализация cURL
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
/*
Для полноценного использования протокола HTTPS можно включить проверку SSL-сертификата сервера API Директа.
Чтобы включить проверку, установите опцию CURLOPT_SSL_VERIFYPEER в true, а также раскомментируйте строку с опцией CURLOPT_CAINFO и укажите путь к локальной копии корневого SSL-сертификата.
*/
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($curl, CURLOPT_CAINFO, getcwd().'\CA.pem');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
// --- Запуск цикла для выполнения запросов ---
// Если получен HTTP-код 200, то выводится содержание отчета
// Если получен HTTP-код 201 или 202, выполняются повторные запросы
while (true) {
$result = curl_exec($curl);
if (!$result) {
echo ('Ошибка cURL: '.curl_errno($curl).' - '.curl_error($curl));
break;
} else {
// Разделение HTTP-заголовков и тела ответа
$responseHeadersSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$responseHeaders = substr($result, 0, $responseHeadersSize);
$responseBody = substr($result, $responseHeadersSize);
// Получение кода состояния HTTP
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
// Извлечение HTTP-заголовков ответа
// Идентификатор запроса
$requestId = preg_match('/RequestId: (\d+)/', $responseHeaders, $arr) ? $arr[1] : false;
// Рекомендуемый интервал в секундах для проверки готовности отчета
$retryIn = preg_match('/retryIn: (\d+)/', $responseHeaders, $arr) ? $arr[1] : 60;
if ($httpCode == 400) {
echo "Параметры запроса указаны неверно или достигнут лимит отчетов в очереди<br>";
echo "RequestId: {$requestId}<br>";
echo "JSON-код запроса:<br>{$body}<br>";
echo "JSON-код ответа сервера:<br>{$responseBody}<br>";
break;
} elseif ($httpCode == 200) {
echo "Отчет создан успешно<br>";
echo "RequestId: {$requestId}<br>";
echo $responseBody;
break;
} elseif ($httpCode == 201) {
echo "Отчет успешно поставлен в очередь в режиме офлайн<br>";
echo "Повторная отправка запроса через {$retryIn} секунд<br>";
echo "RequestId: {$requestId}<br>";
sleep($retryIn);
} elseif ($httpCode == 202) {
echo "Отчет формируется в режиме offline.<br>";
echo "Повторная отправка запроса через {$retryIn} секунд<br>";
echo "RequestId: {$requestId}<br>";
sleep($retryIn);
} elseif ($httpCode == 500) {
echo "При формировании отчета произошла ошибка. Пожалуйста, попробуйте повторить запрос позднее<br>";
echo "RequestId: {$requestId}<br>";
echo "JSON-код ответа сервера:<br>{$responseBody}<br>";
break;
} elseif ($httpCode == 502) {
echo "Время формирования отчета превысило серверное ограничение.<br>";
echo "Пожалуйста, попробуйте изменить параметры запроса - уменьшить период и количество запрашиваемых данных.<br>";
echo "RequestId: {$requestId}<br>";
break;
} else {
echo "Произошла непредвиденная ошибка.<br>";
echo "RequestId: {$requestId}<br>";
echo "JSON-код запроса:<br>{$body}<br>";
echo "JSON-код ответа сервера:<br>{$responseBody}<br>";
break;
}
}
}
curl_close($curl);
?>