Get statistics for a selection of rows

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 the past month, with grouping by date, campaign name, and ad ID. The report filters the rows with the most expensive clicks, where the number of clicks is lower than the set value and the CPC is higher than the set value.

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 body of the request message, specify the floor for the number of clicks and the CPC, as well as 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" => [
            "Filter" => [
                [
                    "Field" => "Clicks",
                    "Operator" => "LESS_THAN",
                    "Values" => ["ПОРОГ_КЛИКОВ"]
                ],
                [
                    "Field" => "Cost",
                    "Operator" => "GREATER_THAN",
                    "Values" => ["ПОРОГ_СТОИМОСТИ"]
                ]
            ]],
        "FieldNames" => ["Date", "CampaignName", "AdId", "Impressions", "Clicks", "Cost"],
        "ReportName" => "НАЗВАНИЕ_ОТЧЕТА",
        "ReportType" => "AD_PERFORMANCE_REPORT",
        "DateRangeType" => "LAST_MONTH",
        "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);
?>