Получение статистики за произвольные даты

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);
?>