Использование API Яндекс.Директ на базе фреймворка Yii2
Решая ежедневные задачи, приходит желание их автоматизировать, ведь в какой-то степени программисты люди немного ленивые. Вот и у меня был такой случай. Работаю над несколькими сайтами фирмы и стоит такая задача: добавлять порядка десяти товарных позиций на сайт, в Я.Директ и AdWords. Перед собой поставил задачу. Реализовать добавление в сервисы контекстной рекламы объявления при добавление товаров на сайт.
Начну описывать этот процесс с работы API Я.Директ. Для этого нам необходим аккаунт на Яндексе.
В первую очередь нам необходимо создать приложение. Переходим по ссылке. Введёте название приложения, права и CallBack URL — это необходимый минимум.
Права выбираете «Яндекс.Директ» - ставите галочку «Использование API Яндекс.Директа».
В Callback Url нажимаете ссылку - «Подставить URL для разработки»
Нажимаете «Сохранить»
Переходите по ссылке и нажимаете «Новая заявка» - «Тестовый доступ». Отвечаете на вопросы, который задаёт «Яндекс», нажимаете «Отправить» и ждите когда статус будет «Одобрена».
Дальше необходимо получить токен. Идём по ссылке - https://oauth.yandex.ru/authorize?response_type=token&client_id=<идентификатор приложения>
Идентификатор приложения - id вашего приложения, узнать его можно по ссылке.
Для получения токена разрешите доступ. Далее откроется страница с токеном. Скопируйте его и сохраните.
Далее начнётся сама разработка. Хочу отметить сразу. В тестовом режиме вы можете работать только с тестовой средой Я.Директа. То есть в реальных объявлениях добавленных Вами кампаний, групп и объявлений не увидите.
Я работы с API я создал класс ApiDirect унаследованный от класса yii\base\Component;
Работаю в yii2 поэтому создал его в папке common/components.
Создал публичные переменные token, login, url, region и company.
public $token = 'AQAAAAAVq6T0AXieFCV2LEZclMc_*******';
public $login = 'login_on_yandex';
public $url = 'https://api-sandbox.direct.yandex.com/json/v5';
public $company = 239001;
public $region = 225;
Url — хранит неизменямую часть url к api.
Region — регион показа объявлений, у меня указана Россия
Рассмотрим весь код на примере двух классов.
Этот метод общий. Его будем использовать во всех методах, передавая массив с параметрами и нужным url.
public function Request($params = [], $url)
{
// HTTP-заголовки
$headers = array(
"Authorization: Bearer $this->token", // OAuth-токен. Использование слова Bearer обязательно
"Client-Login: $this->login", // Логин клиента рекламного агентства
"Accept-Language: ru", // Язык ответных сообщений
"Content-Type: application/json; charset=utf-8" // Тип данных и кодировка запроса
);
$body = json_encode($params, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);// преобразуем массив параметров в формат json.
//отправляем данные с помощью curl.
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
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);
//записываем в переменную полученный ответ
$r = curl_exec($curl);
//получаем размер ответа hrader
$responseHeadersSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
//вырезаем всю информацию о HTTP-заголовках
$responseHeaders = substr($r, 0, $responseHeadersSize);
//получаем только нужный json.
$responseBody = substr($r, $responseHeadersSize);
//декодируем его и получаем ассоциативный массив.
$res = json_decode($responseBody, true);
return $res;
}
Рассмотрим метод получения списка Кампаний.
public function getCompanies()
{
$params = [
'method' => 'get', // Используемый метод сервиса Campaigns
'params' => array(
'SelectionCriteria' => (object)array(), // Критерий отбора кампаний. Для получения всех кампаний должен быть пустым
'FieldNames' => array('Id', 'Name', 'Type') // Названия параметров, которые требуется получить
)
];
//вызываем наш «общий» метод, передав необходимые товары. Полученный ответ пишем в переменную
$response = $this->Request($params, $this->url . '/campaigns');
// проверяем есть ли ошибки.
if ( empty($response['error']) ) {
//возвращаем массив с результатом
return ArrayHelper::getValue($response, 'result', false);
} else {
// Или выводим ошибку.
return $this->setError($response['error']);
}
}
Полный листинг кода смотрите по ссылке.
С методами API можете ознакомиться в документации
Данный пост подготовлен автором @zheev.
Заглавное фото с сайта soft.engineering