Создание объявлений

PHP версии 5, формат JSON, функция file_get_contents

Пример демонстрирует выполнение запроса методом Ads.add, обработку и вывод результата. Для использования примера во входных данных укажите OAuth-токен и идентификатор группы, в которой будет создано новое объявление. При запросе от имени агентства необходимо также указать логин клиента.

<?php
//--- Входные данные ----------------------------------------------------//
// Адрес сервиса Ads для отправки JSON-запросов (регистрозависимый)
$url = 'https://api.direct.yandex.com/json/v5/ads';
// OAuth-токен пользователя, от имени которого будут выполняться запросы
$token = 'ТОКЕН';
// Логин клиента рекламного агентства
// Обязательный параметр, если запросы выполняются от имени рекламного агентства
$clientLogin = 'ЛОГИН_КЛИЕНТА';
// Идентификатор группы объявлений, в которую будет добавлено новое объявление
$adGroupId = ИДЕНТИФИКАТОР_ГРУППЫ;

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

// Параметры запроса к серверу API Директа
$params = array(
   'method' => 'add',                                 // Используемый метод
   'params' => array(
      'Ads' => array(
         array(
            'AdGroupId' => $adGroupId,
            'TextAd' => array(                        // Параметры объявления
               'Title' => 'Заголовок объявления',
               'Text' => 'Текст объявления',
               'Mobile' => 'NO',
               'Href' => 'http://www.yandex.ru'
            )
         )
      )
   )
);
// Преобразование входных параметров запроса в формат JSON
$body = json_encode($params, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

// Создание контекста потока: установка HTTP-заголовков и тела запроса
$streamOptions = stream_context_create(array(
   'http' => array(
      'method' => 'POST',
      'header' => $headers,
      'content' => $body
   ),
   /*
   // Для полноценного использования протокола HTTPS можно включить проверку SSL-сертификата сервера API Директа
   'ssl' => array(
      'verify_peer' => true,
      'cafile' => getcwd().DIRECTORY_SEPARATOR.'CA.pem' // Путь к локальной копии корневого SSL-сертификата
   )
   */ 
));

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

//--- Обработка результата выполнения запроса ---------------------------//
if ($result === false) { echo "Ошибка выполнения запроса!"; }
else {
   // Преобразование ответа из формата JSON
   $result = json_decode($result);
 
   if (isset($result->error)) {
      $apiErr = $result->error;
      echo "Ошибка API {$apiErr->error_code}: {$apiErr->error_string} - {$apiErr->error_detail} (RequestId: {$apiErr->request_id})";
   }
   else {
      // Извлечение HTTP-заголовков ответа: RequestId (Id запроса) и Units (информация о баллах)
      foreach ($http_response_header as $header) {
         if (preg_match('/(RequestId|Units):/', $header)) { echo "$header <br>"; }
      }
 
      // Вывод результата
      // Обработка всех элементов массива AddResults, где каждый элемент соответствует одному объявлению
      foreach ($result->result->AddResults as $item) {
         // Обработка вложенных элементов (может быть либо Errors, либо Id и, возможно, Warnings)
         foreach ($item as $key => $value) {
            // Если присутствует массив Errors, то объявление не создано из-за ошибки (ошибок может быть несколько)
            if ($key == 'Errors') {
               foreach ($value as $errItem) { echo "Ошибка: {$errItem->Code} - {$errItem->Message} ({$errItem->Details})<br>"; }
            }
            else {
               // Если присутствует массив Warnings, то объявление создано, но есть предупреждения (предупреждений может быть несколько)
               if ($key == 'Warnings') {
                  foreach ($value as $warItem) { echo "Предупреждение: {$warItem->Code} - {$warItem->Message} ({$warItem->Details})<br>"; }
               }
               echo "Создано объявление №{$value}<br>";
            }
         }
      } 
   }
}

//--- Отладочная информация ---------------------------------------------//
//echo "<hr>Заголовки запроса: <pre>".implode($headers, '<br>')."</pre>";
//echo "Запрос: <pre>".json_encode($params, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)."</pre>";
//echo "Заголовки ответа: <pre>".implode($http_response_header, '<br>')."</pre>";
//echo "Ответ: <pre>".json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)."</pre>";
?>