Работа с Яндекс.Direct API
Rus
Eng
Работа с Яндекс.Direct API

Для работы с API Яндекс.Direct первым делом регистрируем приложение. Процесс регистрации описывать не буду, он интуитивно понятен. Скажу только, что при создании приложения не забудьте отметить галочку возле Использование API Яндекс.Директа

Далее создаем заявку на получение доступа к API. Заполнить с первого раза у меня не удалось. Меня попросили описать кучу сопутствующей информации.

Заявка отклонена. Опишите, пожалуйста, более подробно, как и какие методы API Директа использует Ваша программа: названия методов; для каких целей используются методы; схема и последовательность вызова методов; с какой частотой производится вызов каждого метода (раз в минуту, раз в час и т. д.) и для каких целей выбрана именно эта частота. Также опишите, как программа производит обработку ошибок, возникающих при работе с API, и как программа учитывает текущие ограничения API Директа.

В моем случае приложение лишь собирало статистику использования Яндекс.Директ и я ответил соответствующим образом:

1. Приложение будет обращаться к сервису Reports по адресу https://api.direct.yandex.com/json/v5/reports и с помощью фильтра в параметрах получать данные статистики за требуемый период.
2. Методы и цели будут использоваться для получения статистики
3. В общем виде: получение токена->запрос к сервису и получение статистики->дальнейшая работа с данными
4. Раз в час, день, неделю. По запросу клиента
5. Цель одна - удовлетворить нужды клиента
6. При получении ошибки скрипт выводит сообщение об ошибке и останавливает свою работу.
7. Ограничения API превышены быть не должны, предполагается их легальное и достаточно редкое использование

Так же советую ознакомиться с документацией и примерами

Получение OAuth токена

// Идентификатор приложения
$client_id = 'Идентификатор приложения';
// Пароль приложения
$client_secret = 'Пароль приложения';

/// Если скрипт был вызван с указанием параметра "code" в URL,
// то выполняется запрос на получение токена
if (isset($_GET['code']))
{
    // Формирование параметров (тела) POST-запроса с указанием кода подтверждения
    $query = array(
        'grant_type' => 'authorization_code',
        'code' => $_GET['code'],
        'client_id' => $client_id,
        'client_secret' => $client_secret
    );
    $query = http_build_query($query);

    // Формирование заголовков POST-запроса
    $header = "Content-type: application/x-www-form-urlencoded";

    // Выполнение POST-запроса и вывод результата
    $opts = array('http' =>
        array(
            'method'  => 'POST',
            'header'  => $header,
            'content' => $query
        )
    );
    $context = stream_context_create($opts);
    $result = file_get_contents('https://oauth.yandex.ru/token', false, $context);
    $result = json_decode($result);

    // Токен необходимо сохранить для использования в запросах к API Директа
    echo $result->access_token;
}
// Если скрипт был вызван без указания параметра "code",
// пользователю отображается ссылка на страницу запроса доступа
else
{
    echo '<a href="https://oauth.yandex.ru/authorize?response_type=code&client_id='.$client_id.'">Страница запроса доступа</a>';
}
// Токен можно кинуть в базу, связав с пользователем, например, а за пару дней до конца токена напомнить, чтобы обновил

Получение логинов клиентов

public function getLogins (){
        //--- Подготовка и выполнение запроса -----------------------------------//
        // Установка HTTP-заголовков запроса
        $headers = array(
            "Authorization: Bearer $this->sToken",            // OAuth-токен. Использование слова Bearer обязательно
            "Client-Login: $this->sGlobalClientLogin",        // Логин клиента рекламного агентства
            "Accept-Language: ru",                            // Язык ответных сообщений
            "Content-Type: application/json; charset=utf-8"   // Тип данных и кодировка запроса
        );

        // Параметры запроса к серверу API Директа
        $params = array(
            'method' => 'get',                                // Используемый метод сервиса Campaigns
            'params' => array(
                'SelectionCriteria' => (object) array(),      // Критерий отбора кампаний. Для получения всех кампаний должен быть пустым
                'FieldNames' => array('Login')                // Названия параметров, которые требуется получить AccountQuality, Archived, ClientId, ClientInfo, CountryId, CreatedAt, Currency, Grants, Login, Notification, OverdraftSumAvailable, Phone, Representatives, Restrictions, Settings, Type, VatRate
            )
        );
        // Преобразование входных параметров запроса в формат JSON
        $body = json_encode($params, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

        // Инициализация cURL
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $this->sUrlClients);
        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);

        // Выполнение запроса, получение результата
        $result = curl_exec($curl);

        //--- Обработка результата выполнения запроса ---------------------------//
        if(!$result) {
            $array = array(
                'response' => 'Ошибка cURL: '.curl_errno($curl).' - '.curl_error($curl)
            );
        }else {
            // Разделение HTTP-заголовков и тела ответа
            $responseHeadersSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
            $responseHeaders = substr($result, 0, $responseHeadersSize);
            $responseBody = substr($result, $responseHeadersSize);

            if (curl_getinfo($curl, CURLINFO_HTTP_CODE) != 200) {
                $array = array(
                    'response' => "HTTP-ошибка: ".curl_getinfo($curl, CURLINFO_HTTP_CODE)
                );
            }
            else {
                // Преобразование ответа из формата JSON
                $responseBody = json_decode($responseBody);

                if (isset($responseBody->error)) {
                    $apiErr = $responseBody->error;
                    $array = array(
                        'response' => "Ошибка API {$apiErr->error_code}: {$apiErr->error_string} - {$apiErr->error_detail} (RequestId: {$apiErr->request_id})"
                    );
                }
                else {

                    // Извлечение HTTP-заголовков ответа: RequestId (Id запроса) и Units (информация о баллах)
                    $responseHeadersArr = explode("\r\n", $responseHeaders);
                    foreach ($responseHeadersArr as $header) {
                        if (preg_match('/(RequestId|Units):/', $header)) {
                            $array['HEADERS'][] = $header;
                        }
                    }

                    // Вывод списка рекламных кампаний
                    foreach ($responseBody->result->Clients as $client) {
                        $array['LOGINS'][] = $client->Login;
                    }
                }
            }
        }

        curl_close($curl);

        return $array;
    }

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

Список доступных для получения полей

// Настройки для вывода содержимого буфера, которые позволяют делать вывод на экран
// при использовании функции sleep
ob_implicit_flush();

function getStats($login){
    //--- Входные данные ---------------------------------------------------//
    // Адрес сервиса Reports для отправки JSON-запросов (регистрозависимый)
    $url = 'https://api.direct.yandex.com/json/v5/reports';
    // OAuth-токен пользователя, от имени которого будут выполняться запросы
    $token = 'Токен';
    // Логин клиента рекламного агентства
    // Обязательный параметр, если запросы выполняются от имени рекламного агентства
    $clientLogin = $login;

    //--- Подготовка запроса -----------------------------------------------//
    // Создание тела запроса
    $params = [
        "params" => [
            "SelectionCriteria" => [
                "DateFrom" => "2019-07-16",
                "DateTo" => "2020-03-12"
            ],
            "FieldNames" => ["Date", "CampaignName","LocationOfPresenceName", "Impressions", "Clicks", "Cost"],
            "ReportName" => "Новый отчет: ".$login,
            "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) {

            $array = array(
                'response' => 'Ошибка 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) {

                $array = array(
                    'response' => array('400')
                );

                $array['response'][]="Параметры запроса указаны неверно или достигнут лимит отчетов в очереди";
                $array['response'][]="RequestId: {$requestId}";
                $array['response'][]="JSON-код запроса:{$body}";
                $array['response'][]="JSON-код ответа сервера:{$responseBody}";

                break;

            } elseif ($httpCode == 200) {
                $array = array(
                    'response' => array('200')
                );

                $array['response'][]="Отчет создан успешно";
                $array['response'][]="RequestId: {$requestId}";
                $array['BODY']=$responseBody;

                break;

            } elseif ($httpCode == 201) {

                $array = array(
                    'response' => array('201')
                );

                $array['response'][]="Отчет успешно поставлен в очередь в режиме офлайн";
                $array['response'][]="Повторная отправка запроса через {$retryIn} секунд";
                $array['response'][]="RequestId: {$requestId}";

                sleep($retryIn);

            } elseif ($httpCode == 202) {

                $array = array(
                    'response' => array('202')
                );

                $array['response'][]="Отчет формируется в режиме offline.";
                $array['response'][]="Повторная отправка запроса через {$retryIn} секунд";
                $array['response'][]="RequestId: {$requestId}";

                sleep($retryIn);

            } elseif ($httpCode == 500) {

                $array = array(
                    'response' => array('500')
                );

                $array['response'][]="При формировании отчета произошла ошибка. Пожалуйста, попробуйте повторить запрос позднее";
                $array['response'][]="RequestId: {$requestId}";
                $array['response'][]="JSON-код ответа сервера:<br>{$responseBody}";

                break;

            } elseif ($httpCode == 502) {

                $array = array(
                    'response' => array('502')
                );

                $array['response'][]="Время формирования отчета превысило серверное ограничение.";
                $array['response'][]="Пожалуйста, попробуйте изменить параметры запроса - уменьшить период и количество запрашиваемых данных.";
                $array['response'][]="RequestId: {$requestId}";

                break;

            } else {

                $array = array(
                    'response' => array('UnkwownError')
                );

                $array['response'][]="Произошла непредвиденная ошибка.";
                $array['response'][]="RequestId: {$requestId}";
                $array['response'][]="JSON-код запроса: {$body}";
                $array['response'][]="JSON-код ответа сервера:<br>{$responseBody}";

                break;

            }
        }
    }

    curl_close($curl);

    return $array;
}

Парсим отчет со статистикой в формате tsv на php

Ответ приходит в таком формате

2019-09-23	витальные запросы / рся	Воронеж	28	0	0
2019-09-23	витальные запросы / рся	Воронежская область	1	0	0
2019-09-23	витальные запросы / рся	Россошь	1	0	0
2019-09-23	витальные запросы / рся	Юг	1	0	0
2019-09-23	купить вб / поиск	Воронеж	14	1	24860000
2019-09-23	купить вб / поиск	Воронежская область	4	0	0
2019-09-23	витальные запросы / поиск	Воронеж	22	0	0
2019-09-23	витальные запросы / поиск	Воронежская область	3	0	0
2019-09-23	витальные запросы / поиск	Москва	7	0	0
2019-09-23	витальные запросы / поиск	Нарьян-Мар	1	0	0

Работать с ним весьма проблематично, но нам на помощь приходит функция explode

$delimiter = "\n";
$splitcontents = explode($delimiter, $contentReport);
foreach ( $splitcontents as $line )
{
    $bits = explode("\t", $line);
}

В итоге на каждой итерации получаем

Array
(
    [0] => 2019-09-23
    [1] => витальные запросы / рся
    [2] => Воронежская область
    [3] => 1
    [4] => 0
    [5] => 0
)

Автоматическая загрузка данных из Яндекс.Директ в Google Analitics

Создаем сервисный аккаунт для обращения к GA по API.

После регистрации аккаунта добавляем его в администраторы проекта Google Analitics и сохраняем файлик service-account-credentials.json

Комментарии

Комментариев еще нет, Вы можете стать первым кто его оставит

Оставьте комментарий

На сайте используется система премодерирования комментариев, поэтому ваше сообщение будет опубликовано лишь после одобрения модератором

Вы отвечаете на комментарий пользователя

Отправить

ОБРАТНАЯ СВЯЗЬ

Напишите мне

Вы разрабатываете новый сервис, вносите доработки в существующий и хотите лучше чем у конкурентов? Вы обратились по адресу. Предлагаю вам комплексную разработку сайтов студийного уровня. У меня вы можете заказать дизайн, верстку, програмированние, разработку нетрадиционного функционала, реализацию связи между CMS, CRM и Data Analitics, а так же все остальное касаемое сайтов, кроме продвижения.

Обращайтесь, я всегда проконсультирую по всем вопросам и помогу подобрать наиболее эффективное решение для Вашего бизнеса. Я занимаюсь созданием сайтов в Новосибирске и в других регионах России, также работаю со странами СНГ. Вы останетесь довольны нашим сотрудничеством

Во время отправки произошла ошибка, пожалуйста попробуйте еще раз через некоторое время
Сообщение отправлено успешно

Телефоны

+7(993) 007-18-96

Email

info@tichiy.ru

Адрес

Россия, г. Москва

Отправляя форму Вы автоматически подтверждаете, что ознакомились и принимаете Политику конфиденциальности сайта

Написать мне
Отправить
Отправляя форму Вы автоматически подтверждаете, что ознакомились и принимаете Политику конфиденциальности сайта
Отправка успешна!
Thank you for your feedback. I will answer you within the next working hours
Отправка не удалась
Во время отправки запроса произошла ошибка. Пожалуйста, подождите и попробуйте снова через некоторое время или свяжитесь со мной