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

Python версии 2 или 3, формат JSON, используется библиотека requests

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

# -*- coding: utf-8 -*-
import requests, json

# Метод для корректной обработки строк в кодировке UTF-8 как в Python 3, так и в Python 2
import sys

if sys.version_info < (3,):
    def u(x):
        try:
            return x.encode("utf8")
        except UnicodeDecodeError:
            return x
else:
    def u(x):
        if type(x) == type(b''):
            return x.decode('utf8')
        else:
            return x

# --- Входные данные ---
# Адрес сервиса Ads для отправки JSON-запросов (регистрозависимый)
CampaignsURL = "https://api.direct.yandex.com/json/v5/ads"
OAuth-токен пользователя, от имени которого будут выполняться запросы
token = "ТОКЕН"

# Логин клиента рекламного агентства
# Обязательный параметр, если запросы выполняются от имени рекламного агентства
clientLogin = "ЛОГИН_КЛИЕНТА"

# Идентификатор группы объявлений, в которую будет добавлено новое объявление
adGroupId = ИДЕНТИФИКАТОР_ГРУППЫ

# --- Подготовка, выполнение и обработка запроса ---
# Создание HTTP-заголовков запроса
headers = {
    "Authorization": "Bearer " + token,  # OAuth-токен. Использование слова Bearer обязательно
    "Client-Login": clientLogin,  # Логин клиента рекламного агентства
    "Accept-Language": "ru",  # Язык ответных сообщений.
}

# Создание тела запроса
body = {
    "method": "add",                                    # Используемый метод
    "params": {
        "Ads": [{
            "AdGroupId": adGroupId,
            "TextAd": {                                 # Параметры объявления
                "Title": u"Заголовок объявления",
                "Text": u"Текст объявления",
                "Mobile": "NO",
                "Href": "http://www.yandex.ru"
            }
        }
        ]
    }
}

# Кодирование тела запроса в JSON
jsonBody = json.dumps(body, ensure_ascii=False).encode('utf8')

# Выполнение запроса
try:
    result = requests.post(CampaignsURL, jsonBody, headers=headers)

    # Отладочная информация
    # print("Заголовки запроса: {}".format(result.request.headers))
    # print("Запрос: {}".format(u(result.request.body)))
    # print("Заголовки ответа: {}".format(result.headers))
    # print("Ответ: {}".format(u(result.text)))
    # print("\n")

    # Обработка запроса
    if result.status_code != 200 or result.json().get("error", False):
        print("Произошла ошибка при обращении к серверу API Директа.")
        print("Код ошибки: {}".format(result.json()["error"]["error_code"]))
        print("Описание ошибки: {}".format(u(result.json()["error"]["error_detail"])))
        print("RequestId: {}".format(result.headers.get("RequestId", False)))
    else:
        # Вывод результата
        print("RequestId: {}".format(result.headers.get("RequestId", False)))
        print("Информация о баллах: {}".format(result.headers.get("Units", False)))
        # Обработка всех элементов массива AddResults, где каждый элемент соотвествует одному объявлению
        for add in result.json()["result"]["AddResults"]:
            # Обработка вложенных элементов (может быть либо Errors, либо Id и, возможно, Warnings)
            if add.get("Errors", False):
                # Если присутствует массив Errors, то объявление не создано из-за ошибки (ошибок может быть несколько)
                for error in add["Errors"]:
                    print("Ошибка: {} - {} ({})".format(error["Code"], u(error["Message"]),
                                                 u(error["Details"])))
            else:
                # Если присутствует параметр Id, то объявление создано
                print("Создано объявление №{}".format(add["Id"]))
                # Если присутствует массив Warnings, то объявление создано, но есть предупреждения (предупреждений может быть несколько)
                if add.get("Warnings", False):
                    for warning in add["Warnings"]:
                        print("Предупреждение: {} - {} ({})".format(warning["Code"], u(warning["Message"]),
                                                         u(warning["Details"])))

# Обработка ошибки, если не удалось соединиться с сервером API Директа
except ConnectionError:
    # В данном случае мы рекомендуем повторить запрос позднее
    print("Произошла ошибка соединения с сервером API.")

# Если возникла какая-либо другая ошибка
except:
    # В данном случае мы рекомендуем проанализировать действия приложения
    print("Произошла непредвиденная ошибка.")