Get statistics for any dates
PHP 5 using JSON with the cURL library
This example shows a request to the Reports service, along with the result processing and output. The mode for generating the report is selected automatically. If the report is added to the offline queue, the repeat requests are executed.
The report contains statistics on impressions, clicks, and expenditures for all the advertiser's campaigns for any specified period, with grouping by date, campaign name, and user location.
To use the example, specify the OAuth access token in the input data. If you're submitting a request on behalf of an agency, be sure to include the client's login. In the request message body, specify the start and end dates of the report period and a report name that is unique among the advertiser's reports.
<?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);
?>