Api яндекс директ ошибки

API Яндекс.Директа – это интерфейс рекламной системы для разработчиков программ. Он позволяет автоматизировать работу с Яндекс.Директ и использовать все его функции – от получения статистики до создания рекламных кампаний с нуля. И всё абсолютно бесплатно.

Результат работы с API – ваше приложение по управлению контекстной рекламой в Яндекс.Директ с собственными настройками и алгоритмами. Кстати, для этого совсем не обязательно быть профи в программировании – достаточно базовых знаний PHP или Python.

Как всё это применять и что нужно, чтобы начать работу – смотрите в этой статье.

Для чего нужен API Яндекс.Директ

API Директа дает возможность разрабатывать и внедрять алгоритмы для управления рекламными кампаниями под ваши нужды. Это пригодится как агентствам, так и крупным рекламодателям, которые запускают и ведут масштабные кампании. Их деятельность предполагает множество рутинных действий, например:

  • Массовое создание и редактирование кампаний, объявлений и ключевых фраз;
  • Управление ставками;
  • Получение статистики по показам и кликам;
  • Прогноз бюджета.

Инструмент API позволяет создать приложение, в котором все нужные вам однотипные операции выполняются автоматически и в котором можно создавать удобные инструменты для просмотра и редактирования кампаний. Автоматизировать можно практически всё, даже обновление цены за клик по заданному вами алгоритму.

Вы разрабатываете что-то наподобие Директ Коммандера. Эта программа – готовое решение Яндекса на основе API Яндекс.Директа. Как её применять, смотрите руководство по старой и новой версиям.

Приложения, созданные по API Яндекс.Директа, рассчитаны на пользователей, у которых есть аккаунт в Директе. Это прямые рекламодатели, агентства и их клиенты с доступом только на чтение (могут только получать и просматривать данные) или на редактирование (они получают в API все те же самые функции, что в интерфейсе).

Структура API

По сути API Директа – это набор сервисов, каждый из которых привязан к конкретному классу объектов и имеет отдельный URL. Объекты API взаимосвязаны между собой, как показано на скриншоте:

API Яндекс.Директ – структура API

Изображение из руководства Яндекса для разработчиков

Сервисы верхнего уровня – Campaign и AdGroup. Первый содержит настройки рекламной кампании, второй нужен для работы с группами объявлений.

На следующем уровне – сервисы Ad (параметры объявления), Keyword (ключевые фразы), Audience Target (условия нацеливания на аудиторию) и DynamicTextAdTarget (условия нацеливания для динамических объявлений).

Далее идут сервисы для работы с элементами объявления: AdImage (изображениями), VCard (виртуальной визиткой), SitelinksSet (блоком быстрых ссылок), AdExtension (расширением к объявлению).

Для управления условиями ретаргетинга и подбора аудитории есть специальный сервис – RetargetingList.

У каждого сервиса свой набор методов для выполнения операций с его объектами. Основные методы, которые доступны для всех объектов – это добавление (add), изменение параметров (update), удаление (delete) и получение параметров (get).

Есть также специфические методы, которые поддерживают определенные объекты. Например, отправление объявлений на модерацию (moderate) – метод для сервиса Ads. Весь список доступных методов по областям применения смотрите в документации API.

Итак, с чего начать, чтобы разработать собственное приложение для работы с контекстной рекламой в Яндекс.Директе? Во-первых, нужен доступ к API. Далее рассмотрим пошагово, как его получить.

Шаг 1: создание и регистрация приложения на Яндекс.OAuth

Авторизуйтесь в Яндекс.Директе. Используйте для этого аккаунт разработчика – именно от этого имени ваше приложение будет выполнять запросы и управлять данными.

Перейдите по ссылке oauth.yandex.ru. Нажмите кнопку «Зарегистрировать новое приложение»:

API Яндекс.Директ – переход к регистрации нового приложения

В правой части страницы – ссылки на справочные материалы для разработчиков.

Далее вы попадаете на форму «Создание приложения», где нужно указать все его необходимые параметры:

API Яндекс.Директ – форма создания приложения

Обязательные опции помечены звездочкой, это «Название» и «Доступы». Но чем больше информации о приложении вы укажете, тем более прозрачно оно будет для пользователей. Они будут знать, какой именно программе разрешают доступ к своему аккаунту.

В блоке «Платформы» отметьте галочкой «Веб-сервисы»:

API Яндекс.Директ – платформы для приложения

Появится поле адреса. В нем вы указываете, куда направлять пользователя после того, как он разрешил или отказал приложению в доступе. Адресов Callback URI может быть несколько, например, для тестового и боевого режима.

На этапе создания приложения нажмите ссылку «Подставить URL для разработки».

API Яндекс.Директ – адрес перенаправления пользователя

В поле появится тестовый адрес, который позволит получать отладочные токены вручную. Они нужны для проверки работы приложения, подробнее об этом далее в статье.

В блоке «Доступы» выберите «Яндекс.Директ» и отметьте «Использование API Яндекс.Директа»:

API Яндекс.Директ – выбор доступа

Завершите создание приложения:

API Яндекс.Директ – завершение регистрации

На этом регистрация закончена. При этом OAuth-сервер Яндекса сразу же генерирует и показывает на странице идентификатор и пароль приложения.

API Яндекс.Директ – идентификатор и пароль приложения

Они понадобятся вам далее.

Шаг 2: создание заявки на доступ

В аккаунте Яндекс.Директа долистайте до нижнего меню и перейдите по ссылке «API»:

API Яндекс.Директ – переход к настройкам API

Далее нажмите «Получить доступ к API»:

API Яндекс.Директ – ссылка на получение доступа к API

Вы попадете на страницу настроек API. Чтобы она была доступна, нужно выполнить формальное требование: в интерфейсе Яндекс.Директа должна быть минимум одна рекламная кампания с одним объявлением и одной ключевой фразой.

При первом входе нужно принять пользовательское соглашение:

API Яндекс.Директ – пользовательское соглашение

На странице «Настройки API» перейдите на вкладку «Мои заявки», чтобы создать и отправить заявку на доступ к API. Нажмите кнопку «Новая заявка» и выберите её тип.

API Яндекс.Директ – кнопка для создания заявки

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

Так как приложение еще не разработано, создайте заявку на тестовый доступ. Для этого:

1) Из выпадающего списка выберите идентификатор, который получили после регистрации приложения на OAuth-сервере:

API Яндекс.Директ – создание заявки на доступ

2) Укажите email для связи со службой поддержки;

3) Заполните остальные данные о приложении по максимуму – укажите, для чего оно предназначено, его основные функции и возможности и т.д.:

API Яндекс.Директ – параметры приложения в заявке

4) Подтвердите согласие с пользовательским соглашением и отправьте заявку.

API Яндекс.Директ – согласие с правилами разработки

Статус заявки отслеживайте здесь же – на вкладке «Мои заявки» в настройках. Дождитесь её одобрения – это может занять до 7 дней. Только после этого можно начинать разрабатывать приложение. В случае отклонения – узнайте причины и исправьте ошибки.

На стадии рассмотрения можно преобразовывать заявку на ограниченный доступ в заявку на полный доступ. После внесения любых изменений она автоматически отправляется на повторное рассмотрение.

На вкладке «Мои приложения» можно увидеть, какие приложения уже имеют доступ к аккаунту Яндекс.Директ через API. В том числе, если вы использовали Директ.Коммандер, он появится в этом списке:

API Яндекс.Директ – список приложений, у которых есть доступ к аккаунту

Шаг 3: создание тестового пользователя и тестовых данных для него

1) Зарегистрируйте аккаунт тестового пользователя в Яндекс.Директе;

2) Создайте от его имени рекламную кампанию в интерфейсе Яндекс.Директа – достаточно одного объявления с одним ключевиком, чтобы получить доступ к API;

3) В разделе API интерфейса Директа нажмите ссылку «Получить доступ к API» и примите пользовательское соглашение;

4) Включите песочницу – среду для отладки приложения, где можно управлять тестовыми кампаниями без реальных показов и внесения средств.

Для этого откройте вкладку «Песочница» на странице настроек API и начните ею пользоваться:

API Яндекс.Директ – использование песочницы

В следующем окне задайте параметры песочницы:

API Яндекс.Директ – настройки песочницы

Поставьте галочку «Создать тестовые кампании». Если вы выбрали роль «Клиент» создаются три кампании. Для роли «Агентство» – 3 клиента с 3 кампаниями, их логины формируются автоматически. На одну кампанию каждого клиента зачисляется некоторая сумма.

Включение флажка «Общий счет» создает клиента с подключенным общим счетом. Для агентства опция недоступна.

Нажмите «Продолжить», чтобы начать управлять песочницей.

Внимание! Если сменить параметры, все данные удаляются. Нужно создавать песочницу заново.

5) От имени тестового пользователя получите отладочный токен. С помощью него можно проверять работу приложений.

Когда пользователь авторизуется в Яндекс.Директе и нажимает кнопку «Подтвердить», то есть дает доступ к своим данным приложения, сервер Яндекса генерирует токен и передает его приложению.

Как всё происходит:

  • Приложение направляет пользователя на страницу Яндекс.OAuth;
  • На этой странице пользователь разрешает доступ к своим данным приложению;
  • Яндекс.OAuth перенаправляет пользователя на адрес, указанный в поле Callback URL. Код подтверждения или описание ошибки передается в параметре URL перенаправления;
  • Приложение получает адрес перенаправления и извлекает код подтверждения;
  • Приложение отправляет POST-запрос с этим кодом;
  • Яндекс.OAuth возвращает токен в теле ответа.

Если объяснять с технической стороны, запрос к API выполняется по протоколу HTTPS методом POST (отправление данных). В этом запросе содержится HTTP-заголовок с токеном пользователя, от имени которого осуществляется запрос. Ответ содержит заголовок RequestId – это уникальный идентификатор запроса.

Некоторые приложения (например, консольные или установленные на телевизорах Smart TV) не могут получить код подтверждения из URL. В этом случае пользователь самостоятельно его получает от Яндекс.OAuth и вводит в приложении или на странице авторизации.

Полученный токен используется для запросов к API до истечения времени его жизни. Он должен быть доступен только вашему приложению, поэтому лучше не сохранять его в куках браузера.

Далее вы выполняйте запросы к песочнице. Вот пример запроса:

API Яндекс.Директ – пример запроса к песочнице

Практика использования API Яндекс.Директ

В инструменте API множество методов для разных объектов, многие из них дорабатываются и улучшаются со временем. Рассмотрим подробно, как их применять на практике.

Для примера возьмем создание отчета по поисковым запросам, прогноз бюджета и ретаргетинг. Этому действию соответствует метод CreateNewWordstatReport. Он запускает на сервере формирование отчета о статистике поисковых запросов. Это занимает не больше минуты.

Отчет содержит ту же статистику, которая доступна в сервисе Яндекс Wordstat за прошедший месяц.

Ограничения:

  • За сутки можно получить статистику для тысячи фраз;
  • На сервере хранится максимум 5 отчетов по всем кампаниям;
  • Отчеты хранятся на сервере в течение 5 часов, а затем автоматически удаляются.

Так выглядит структура входных данных в формате JSON:

{

   «method»: «CreateNewWordstatReport»,

   «param»: {

      /* NewWordstatReportInfo */

      «Phrases«: [

         (string)

         …

      ],

      «GeoID«: [

         (int)

         …

      ]

   }

}

Phrases – это массив ключевых фраз, по которым нужно получить статистику поисковых запросов (добавить можно не более 10). минус-фразы из нескольких слов пишите в скобках, например: холодильник -морозильник -(морозильная камера) -ремонт.

GeoID – идентификаторы регионов, по которым нужно получить статистику поисковых запросов. Можно исключить регион, поставив минус. Если вы не указали этот параметр, либо указали только минус-регионы, либо минус-регионы совпадают c плюс-регионами, статистика выдается по всем регионам.

Вообще в API Яндекс.Директа можно решать самые разнообразные задачи, например:

— Интегрировать функции Яндекс.Директ и данные из собственной базы.

Примеры применения: автоматическое добавление в ключевые фразы названий брендов или моделей товаров, остановка / возобновление показов объявлений в зависимости от наличия товаров на складе, обновление текстов объявлений при изменении прайс-листа. И многое другое, в зависимости от данных, которые у вас есть;

— A/B-тестирование объявлений.

Принцип тот же, что в интерфейсе: в самом начале все варианты из группы объявлений показываются равномерно. По мере накопления статистики система выбирает объявление с самым высоким CTR (самое привлекательное по мнению целевой аудитории) и показывает его чаще;

— Мониторинг и анализ эффективности рекламных кампаний.

Можно настроить автоматическое получение сводной и детальной статистики по показам, кликам, конверсиям и другим показателям и выгрузку её в сторонние программы (системы поддержки принятия решений, системы финансового учета и т.д.)

Все примеры использования API смотрите в меню «Практика использования» по ссылке.

Важное преимущество программы на основе API – при просмотре и редактировании кампаний, рекламных групп, объявлений и ключевых фраз не нужно ждать загрузки страниц, как в интерфейсе Яндекс.Директа. И конечно, это экономит время специалистов по настройке контекстной рекламы.

Хотите тоже написать статью для читателей Yagla? Если вам есть что рассказать про маркетинг, аналитику, бизнес, управление, карьеру для новичков, маркетологов и предпринимателей. Тогда заведите себе блог на Yagla прямо сейчас и пишите статьи. Это бесплатно и просто

Здравствуйте!
Учусь работать с Yandex Direct API. Я скопировал код-пример с их сайта:
https://tech.yandex.ru/direct/doc/examples-v5/php5…
Вставил свой токен, убрал логин (у меня НЕ агентство), изменил $url на песочницу. Попробовал запустить — все отлично выводится.

Я заменил $url вот на такой:
https://api-sandbox.direct.yandex.com/json/v5/reports
Это для получения клики и стоимость, его я нашел вот тут:
https://tech.yandex.ru/direct/doc/reports/example-…
Мне выводится ошибка:

Warning: file_get_contents(https://api-sandbox.direct.yandex.com/json/v5/reports): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in D:1Developdomainsdirectindex.php on line 44

Да, я знаю, что для кликов и стоимости нужны другие параметры (переменная $params).
Я в $params убрал все кроме 'method' => 'get'. Для кампаний мне стало выводиться сообщение:

Ошибка API 8000: Некорректный запрос — params не может иметь значение null (RequestId: 402619380448874005)

А вот для клики и стоимость та же самая ошибка. То есть, проблема в ссылке? Как решить эту ошибку?

api яндекса как взаимодействовать

Для автоматизации работы с Яндекс.Директ все сервисы используют доступ через API. Это позволяет получать доступ ко всему функционалу Директа, от получения статистики и управления ставками до создания рекламных кампаний с нуля. Для использования API Директа не обязательно быть профессиональным программистом, достаточно базовых знаний в PHP или Python. Также желательно разобраться, как работают инструмент cURL и формат обмена данными JSON (это не сложно). Наглядный пример взаимодействия с API Директа – «Директ Коммандер».

Чтобы можно было попробовать API на практике, Яндекс предоставляет тестовый доступ к песочнице, которая имитирует работающие рекламные кампании. На которых можно испытать работу своих скриптов.

Получить «боевой» доступ к реальным рекламным кампаниям не сложно, нужно заполнить заявку и приложить листинг работающего скрипта.

В этой статье я расскажу об использовании API Яндекс.Директ для получения статистики при помощи PHP, а также о регистрации приложения и получении тестового доступа.

С чего начать?

1. Регистрируем приложение

Чтобы зарегистрировать своё приложение для работы с API, войдите в свой аккаунт на Яндексе и перейдите по ссылке https://oauth.yandex.ru/, нажмите кнопку «Зарегистрировать новое приложение».

Вы попадёте на страницу «Создание приложения». Здесь нужно заполнить все поля, отмеченные звёздочкой (*), остальное не обязательно. В поле «Название приложения» пишем любое название, например «Первое тестовое приложение», далее в блоке «Платформы» отмечаем галкой «Веб-сервисы», для заполнения поля «Callback URI #1», необходимо кликнуть по ссылке «Подставить URL для разработки», в блоке «Доступы» выбираем «Яндекс.Директ» и ставим галку «Использование API Яндекс.Директа»

Пролистываем страницу до конца, нажимаем кнопку «Создать приложение». После этого откроется страница с названием и параметрами нового приложения. Сразу же скопируйте и сохраните ID нового приложения. Это потребуется в дальнейшем.

Поздравляю! Вы зарегистрировали своё первое приложение в Яндекс.OAuth!

OAuth-авторизация позволяет приложению работать с сервисами Яндекса от имени пользователя без авторизации по паролю (для этого используется специальный токен). Уровень доступа для приложения определяется пользователем.

2. Получаем доступ к API

Чтобы приложение могло использовать API Яндекс.Директа, ему необходимо получить доступ к этому инструменту.

Войдите в Яндекс.Директ под тем же логином, на который зарегистрировано приложение в OAuth. Пролистайте страницу до самого низа, найдите блок «Управление кампаниями», перейдите по ссылке API.

На открывшейся странице переходим по ссылке «Получить доступ к API»

Далее соглашаемся с Условиями использования. После этого откроется страница «Настройки API» c активной вкладкой «Параметры», где нужно заполнить «Координаты технического специалиста по работе с API Директа» — Контактное лицо и Эл. Почта. На вкладке «Мои приложения» можно увидеть, какие приложения имеют доступ к аккаунту Яндекс.Директ через API на текущий момент. Например, если вы использовали Директ.Коммандер для работы с рекламными кампаниями, то увидите его в списке этих приложений.

Чтобы открыть доступ нашему приложению к API, переходим на вкладку «Мои заявки» и создаём новую заявку на тестовый доступ.

В заявке необходимо заполнить все поля, отмеченные красной звёздочкой (*).

Выбираем, ранее зарегистрированное приложение из списка, указываем e-mail для службы поддержки Яндекса, в специфике работы можно выбрать Прямого рекламодателя, предназначением работы программы будет  автоматизация регулярной работы с кампаниями в Директе. В качестве новых возможностей укажите «Ежедневно снимает новые показатели статистики», а ожидаемой датой разработки можно установить любой день.

Остаётся согласиться с условиями Пользовательского соглашения и отправить заявку. После одобрения доступа к API (это займёт менее часа), можно начинать разработку приложения. Статус заявки будет отображаться на вкладке «Мои приложения».

3. Получаем статистику Яндекс.Директ при помощи PHP

Для доступа к рекламным кампаниям через API потребуется токен разработчика. Чтобы его получить (только после одобрения заявки на доступ!) переходим по ссылке

https://oauth.yandex.ru/authorize?response_type=token&client_id=ИДЕНТИФИКАТОР_ПРИЛОЖЕНИЯ

Копируем ссылку, вставляем в адресную строку браузера, копируем ID приложения, он отображается на вкладке «Мои заявки». Переходим по созданной ссылке. Загрузится страница с подтверждением доступа, где необходимо нажать кнопку «Разрешить».

На следующем экране отобразится тот самый авторизационный токен, который нужно сохранить.

Для работы с тестовым доступом обязательно потребуется доступ к песочнице. Иначе, API Директа будет возвращать ошибку.

Переходим на вкладку «Песочница», и включаем её.

Теперь можно приступать к написанию кода для запросов к API Яндекс.Директ на PHP

Общаться с API будем через cURL на языке JSON-запросов. В версиях PHP от 5.2.0 функционал для обработки JSON уже вшит в ядро. Поэтому, если вы будете использовать более ранние версии для написания кода, тогда придётся подключать сторонние библиотеки, для обработки JSON.

В данном примере используется PHP 5.6

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

<!DOCTYPE html>
<html lang=»ru»>
<head>
<meta charset=»utf-8″ />
<meta http-equiv=»X-UA-Compatible» content=»IE=edge» />
<meta name=»viewport» content=»width=device-width, initial-scale=1.0″ />
<title>Статистика Яндекс.Директ через API</title>
<link rel=»stylesheet» href=»css/normalize.css» />
</head>
<!— Тело страницы —>
<body>
<?php
// Настройки для вывода содержимого буфера, которые позволяют делать вывод на экран
// при использовании функции sleep
ob_implicit_flush();

//— Входные данные —————————————————//
// Адрес сервиса Reports для отправки JSON-запросов (регистрозависимый)
$url = ‘https://api-sandbox.direct.yandex.com/json/v5/reports’; // при работе с песочницей, используем поддомен api-sandbox
// OAuth-токен пользователя, от имени которого будут выполняться запросы, его получали на предыдущем этапе
$token = ‘ПОЛУЧЕННЫЙ_ТЕСТОВЫЙ_ТОКЕН’;
// Логин клиента рекламного агентства
// Обязательный параметр, если запросы выполняются от имени рекламного агентства
// Укажите здесь логин аккаунта на котором получен тестовый доступ к API Директа
$clientLogin = ‘ЛОГИН_НА_КОТОРОМ_ЗАРЕГИСТРИРОВАНО_ПРИЛОЖЕНИЕ’;
//— Подготовка запроса ————————————————//
// Создание тела запроса
$report_name = date(«Y-m-d-H-i-s»); // Используем текущую дату и время с точностью до секунд в качестве названия отчёта, т.к. при каждом запросе должно передаваться уникальное название отчёта
$params = [
«params» => [
«SelectionCriteria» => [
«DateFrom» => «2018-06-01», // начальная дата в формате ГГГГ-ММ-ДД
«DateTo» => «2018-06-08» // конечная дата для выборки статистики
],
«FieldNames» => [«Date», «CampaignName», «LocationOfPresenceName», «Impressions», «Clicks», «Cost»],
«ReportName» => «НАЗВАНИЕ_ОТЧЕТА»,
«ReportType» => «CUSTOM_REPORT», // прописываем произвольный тип отчёта
«DateRangeType» => «CUSTOM_DATE», // произвольный период запроса
«Format» => «TSV», // формат ответа API
«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);
?>
</body>
</html>

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

Чтобы было удобнее читать результат работы скрипта, можно немного модифицировать наш код. Для вывода используется формат TSV. Это аналог формата CSV, единственным отличием является разделитель значений колонок. В CSV разделителем является запятая “,”, а в TSV – табуляция.

Результат выборки статистики для каждого дня записан с новой строки, чтобы вывести его построчно в окне браузера, после каждой строки отчёта нужно вставить тэг переноса строки <br>.

Используем следующий алгоритм:

$responseBody = explode («n»,$responseBody); // преобразовываем отчёт в массив, разделитель «новая строка»
foreach ($responseBody as $response_row) {
echo $response_row.»<br>»; // выводим каждую строку отчёта и добавляем в конце тэг переноса строки
}

Вставляем этот код в строке 129, вместо echo $responseBody;

Запускаем скрипт, на выходе получаем более удобочитаемый формат вывода отчёта.

Отчёт сформирован за каждый день с 01.06.2018 по 08.06.2018 по следующим показателям:

  • Date – дата,
  • CampaignName – название кампании,
  • LocationOfPresenceName – таргетинг,
  • Impressions – количество показов,
  • Clicks – количество кликов,
  • Cost – стоимость.

Этот пример наглядно демонстрирует возможность взаимодействия с API Директа. Кроме получения статистики можно редактировать рекламные кампании и управлять ставками вплоть до уровня ключевого слова.

Получить больше информации о типах отчётов и данных, которые можно запросить, вы сможете получить в разделе официальной документации по API Яндекс.Директа https://tech.yandex.ru/direct перейдя в раздел «Документация»

Провести Аудит РК!

Подпишись и следи за выходом новых статей в нашем монстрограмме

Остались вопросы?

Не нашли ответ на интересующий Вас вопрос? Или не нашли интересующую Вас статью?  Задавайте вопросы и темы статей которые Вас интересуют в комментариях.

Приветствую всех.

Возникла проблема с отправкой запроса к API Яндекс Директ.
Выложил ссылки на справку по Яндексу на всякий, потому что проблема возникает при отправке запросов именно к нему (в приложенном файле, а то местный антиспам не дает отправить сообщение). Тех. поддержка Яндекса может читать только общедоступную справку и давать консультации только теми словами, что уже и так написано в справке. Собственно они мне так и ответили, что если бы я писал на cURL или питоне, то они бы подсказали. Хотя я даже в этом случае сомневаюсь в их компетентности…
Попробовал отправить запросы этим же кодом к API Youtube, запрос улетел без капризов и был получен ответ.

При отправке запроса к API Яндекс Директ получаю следующие ошибки (в зависимости от опции WinHttpRequestOption_SecureProtocols):

  • при включенных SSL 2/3 — Ошибка 80072f7d: Ошибка поддержки безопасных каналов.
  • при включенном TLS 1.0 — Ошибка 80072f99: В сертификате клиента отсутствовали учетные данные.

По коду:
Строки с закомментированными опциями — все то, что я пробовал, чтобы запрос улетел.
Строки с закомментированными заголовками — все заголовки, которые были добавлены Rest Api Client’ом (кроме Host, это отсебятина). Основные, что требуются — это Authorization, Client-Login, Content-Type и Accept-Language.
Также пробовал использовать XMLHTTP2 v6.0 для отправки запроса, ошибки аналогичные, только их коды другие.

Возможно, Excel действительно не предназначен для таких запросов, но хочется верить, что все получится :)
Если есть замечания по обработке статусов http или еще чему, принимаю критику, но первостепенная задача — отправка запроса, а дальше уже

гори оно огнем

дело техники.

Скрытый текст


Работа с Яндекс.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("rn", $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

Теги:

JSONphp

Возможно, вам также будет интересно:

  • Api ms win crt stdio l1 1 0 dll ошибка
  • Api ms win crt runtime l1 1 0 dll ошибка атол
  • Api ms win crt runtime l1 1 0 dll ошибка viber
  • Api ms win crt runtime l1 1 0 dll ошибка crfxfnm
  • Api ms win core winrt l1 1 0 dll ошибка

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии