• Главная

Получение кампаний. Python api яндекс директ


API Директа — Получение кампаний — Технологии Яндекса

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

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

# -*- coding: utf-8 -*- import requests, json from requests.exceptions import ConnectionError from time import sleep # Метод для корректной обработки строк в кодировке 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 # --- Входные данные --- # Адрес сервиса Campaigns для отправки JSON-запросов (регистрозависимый) CampaignsURL = 'https://api.direct.yandex.com/json/v5/campaigns' # OAuth-токен пользователя, от имени которого будут выполняться запросы token = 'ТОКЕН' # Логин клиента рекламного агентства # Обязательный параметр, если запросы выполняются от имени рекламного агентства clientLogin = 'ЛОГИН_КЛИЕНТА' # --- Подготовка, выполнение и обработка запроса --- # Создание HTTP-заголовков запроса headers = {"Authorization": "Bearer " + token, # OAuth-токен. Использование слова Bearer обязательно "Client-Login": clientLogin, # Логин клиента рекламного агентства "Accept-Language": "ru", # Язык ответных сообщений } # Создание тела запроса body = {"method": "get", # Используемый метод. "params": {"SelectionCriteria": {}, # Критерий отбора кампаний. Для получения всех кампаний должен быть пустым "FieldNames": ["Id", "Name"] # Имена параметров, которые требуется получить. }} # Кодирование тела запроса в 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))) # Вывод списка кампаний for campaign in result.json()["result"]["Campaigns"]: print("Рекламная кампания: {} №{}".format(u(campaign['Name']), campaign['Id'])) if result.json()['result'].get('LimitedBy', False): # Если ответ содержит параметр LimitedBy, значит, были получены не все доступные объекты. # В этом случае следует выполнить дополнительные запросы для получения всех объектов. # Подробное описание постраничной выборки - https://tech.yandex.ru/direct/doc/dg/best-practice/get-docpage/#page print("Получены не все доступные объекты.") # Обработка ошибки, если не удалось соединиться с сервером API Директа except ConnectionError: # В данном случае мы рекомендуем повторить запрос позднее print("Произошла ошибка соединения с сервером API.") # Если возникла какая-либо другая ошибка except: # В данном случае мы рекомендуем проанализировать действия приложения print("Произошла непредвиденная ошибка.")

tech.yandex.ru

API Директа — JSON — Технологии Яндекса

Примеры взаимодействия с API в формате JSON на Python.

Получение сведений о клиенте

Пример демонстрирует вызов метода GetClientInfo.

import json, urllib2 #адрес для отправки json-запросов url = 'https://api.direct.yandex.ru/v4/json/' #данные для OAuth-авторизации token = 'e4d3b4d2a7444fa384a18cda5cd1c8d9' #логин в Директе login = 'agrom' #структура входных данных (словарь) data = { 'method': 'GetClientInfo', 'token': token, 'locale': 'ru', 'param': [login] } #конвертировать словарь в JSON-формат и перекодировать в UTF-8 jdata = json.dumps(data, ensure_ascii=False).encode('utf8') #выполнить запрос response = urllib2.urlopen(url,jdata) #вывести результат print response.read().decode('utf8')

Вызов финансовых методов

При вызове финансовых методов необходимо дополнительно указывать финансовый токен и номер финансовой операции (см. Доступ к финансовым методам).

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

import hashlib masterToken = 'AEgchkX2M3FBL8lU' operationNum = 119 usedMethod = 'CreateInvoice' login = 'agrom' financeToken = hashlib.sha256(masterToken + str(operationNum) + usedMethod + login).hexdigest() print financeToken

Создается финансовый токен для однократного вызова метода CreateInvoice от имени пользователя agrom. Ниже показан пример токена.

7215f95e84a766971d8ec4eb5a39ae96505b3a5529a91e5a03e5943565a6e6c7

Финансовый токен и номер финансовой операции включают в структуру входных данных, как показано ниже.

#структура входных данных (словарь) data = { 'method': 'GetCreditLimits', 'token': token, 'finance_token': financeToken, 'operation_num': operationNum, 'param': ['agrom'], 'locale': 'ru' }

tech.yandex.ru

API Директа — Получение токена — Технологии Яндекса

Пример демонстрирует получение OAuth-токенa веб-сервисом. Рекомендации для других типов приложений (настольное, мобильное) приведены в документации Яндекс.OAuth.

Установка дополнительных библиотек

Для установки библиотек (flask, requests, suds, pyxb и др.) можно использовать утилиту pip:pip install %package_name%

Утилита pip включена в Python 2 начиная с версии 2.7.9 и в Python 3 начиная с версии 3.4. Если вы используете более раннюю версию Python, установите pip, например, с помощью скрипта https://bootstrap.pypa.io/get-pip.py.

Более подробную информацию вы можете найти на странице https://packaging.python.org/tutorials/installing-packages/.

Callback URL

При регистрации или редактировании параметров приложения на сервисе Яндекс.OAuth необходимо в поле Callback URL указать URL скрипта, выполняющего получение токена. Например:

https://site.ru/get_token

Последовательность действий

При запросе токена требуется указывать идентификатор и пароль приложения, сгенерированные при регистрации на сервисе Яндекс.OAuth.

  1. Приложение направляет пользователя на страницу запроса доступа по ссылке видаhttps://oauth.yandex.ru/authorize?response_type=code&client_id=ИДЕНТИФИКАТОР_ПРИЛОЖЕНИЯ

    На открывшейся странице пользователь нажимает кнопку Разрешить.

  2. Яндекс.OAuth осуществляет редирект на адрес из Callback URL. При этом к адресу добавляется параметр code. Например: http://site.ru/get_token?code=КОД_ПОДТВЕРЖДЕНИЯ
  3. Скрипт выполняет POST-запрос на https://oauth.yandex.ru/token, передавая следующие параметры:
    • grant_type = authorization_code

    • code = КОД_ПОДТВЕРЖДЕНИЯ

    • client_id = ИДЕНТИФИКАТОР_ПРИЛОЖЕНИЯ

    • client_secret = ПАРОЛЬ ПРИЛОЖЕНИЯ

  4. Яндекс.OAuth передает ответ в формате JSON. Ключ access_token содержит OAuth-токен. Например:{"access_token": "0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f"}

    Полученный токен необходимо сохранить и использовать в запросах к API Директа.

Запуск скрипта

Flask позволяет указать только IP-адрес и порт, на котором запускается скрипт. Существует несколько вариантов запуска скрипта:

  • Запустите приложение на публичном (то есть видимом из интернета) IP-адресе. Для вашего домена в DNS должен быть указан именно этот IP-адрес, а приложение должно быть запущено на корректном порту (443 для HTTPS).

  • Используйте веб-сервер для проксирования запросов. Например, Nginx в следующей конфигурации:

    server { listen 443; # Укажите домен из поля Callback URL server_name site.ru; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location /get_token { proxy_pass http://127.0.0.1:8000/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

    В приведенном ниже коде скрипта указаны параметры запуска, соответствующие этой конфигурации.

Более подробную информацию вы можете найти на странице http://flask.pocoo.org/docs/0.12/deploying/.

Код скрипта

Для использования примера укажите идентификатор и пароль приложения.

# -*- coding: utf-8 -*- from flask import Flask, request, jsonify, redirect from requests import post # Метод для кодирования URL как в Python 3, так и в Python 2 import sys if sys.version_info < (3, 0): # Pytohn2.x from urllib import urlencode else: # Python3.x from urllib.parse import urlencode # Идентификатор приложения client_id = 'ИДЕНТИФИКАТОР_ПРИЛОЖЕНИЯ' # Пароль приложения client_secret = 'ПАРОЛЬ_ПРИЛОЖЕНИЯ' # Адрес сервера Яндекс.OAuth baseurl = 'https://oauth.yandex.ru/' app = Flask(__name__) @app.route('/') def index(): if request.args.get('code', False): # Если скрипт был вызван с указанием параметра "code" в URL, # то выполняется запрос на получение токена print(request.args) print(request.data) data = { 'grant_type': 'authorization_code', 'code': request.args.get('code'), 'client_id': client_id, 'client_secret': client_secret } data = urlencode(data) # Токен необходимо сохранить для использования в запросах к API Директа return jsonify(post(baseurl + "token", data).json()) else: # Если скрипт был вызван без указания параметра "code", # то пользователь перенаправляется на страницу запроса доступа return redirect(baseurl + "authorize?response_type=code&client_id={}".format(client_id)) if __name__ == '__main__': # Отладочная информация # app.debug = True # Запуск веб-сервера с доступом по порту 8000 app.run(host='127.0.0.1', port=8000)

tech.yandex.ru

API Директа — Получение статистики за произвольные даты — Технологии Яндекса

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

Пример демонстрирует выполнение запроса к сервису Reports, обработку и вывод результата. Режим формирования отчета выбирается автоматически. Если отчет поставлен в очередь на формирование в режиме офлайн, выполняются повторные запросы.

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

Для использования примера во входных данных укажите OAuth-токен. При запросе от имени агентства необходимо также указать логин клиента. В теле запроса укажите начальную и конечную даты отчетного периода, а также название отчета, уникальное для рекламодателя.

# -*- coding: utf-8 -*- import requests from requests.exceptions import ConnectionError from time import sleep import 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 # --- Входные данные --- # Адрес сервиса Reports для отправки JSON-запросов (регистрозависимый) ReportsURL = 'https://api.direct.yandex.com/json/v5/reports' # OAuth-токен пользователя, от имени которого будут выполняться запросы token = 'ТОКЕН' # Логин клиента рекламного агентства # Обязательный параметр, если запросы выполняются от имени рекламного агентства clientLogin = 'ЛОГИН_КЛИЕНТА' # --- Подготовка запроса --- # Создание HTTP-заголовков запроса headers = { # OAuth-токен. Использование слова Bearer обязательно "Authorization": "Bearer " + token, # Логин клиента рекламного агентства "Client-Login": clientLogin, # Язык ответных сообщений "Accept-Language": "ru", # Режим формирования отчета "processingMode": "auto" # Формат денежных значений в отчете # "returnMoneyInMicros": "false", # Не выводить в отчете строку с названием отчета и диапазоном дат # "skipReportHeader": "true", # Не выводить в отчете строку с названиями полей # "skipColumnHeader": "true", # Не выводить в отчете строку с количеством строк статистики # "skipReportSummary": "true" } # Создание тела запроса body = { "params": { "SelectionCriteria": { "DateFrom": "НАЧАЛЬНАЯ_ДАТА", "DateTo": "КОНЕЧНАЯ_ДАТА" }, "FieldNames": [ "Date", "CampaignName", "LocationOfPresenceName", "Impressions", "Clicks", "Cost" ], "ReportName": u("НАЗВАНИЕ_ОТЧЕТА"), "ReportType": "CAMPAIGN_PERFORMANCE_REPORT", "DateRangeType": "CUSTOM_DATE", "Format": "TSV", "IncludeVAT": "NO", "IncludeDiscount": "NO" } } # Кодирование тела запроса в JSON body = json.dumps(body, indent=4) # --- Запуск цикла для выполнения запросов --- # Если получен HTTP-код 200, то выводится содержание отчета # Если получен HTTP-код 201 или 202, выполняются повторные запросы while True: try: req = requests.post(ReportsURL, body, headers=headers) req.encoding = 'utf-8' # Принудительная обработка ответа в кодировке UTF-8 if req.status_code == 400: print("Параметры запроса указаны неверно или достигнут лимит отчетов в очереди") print("RequestId: {}".format(req.headers.get("RequestId", False))) print("JSON-код запроса: {}".format(u(body))) print("JSON-код ответа сервера: \n{}".format(u(req.json()))) break elif req.status_code == 200: print("Отчет создан успешно") print("RequestId: {}".format(req.headers.get("RequestId", False))) print("Содержание отчета: \n{}".format(u(req.text))) break elif req.status_code == 201: print("Отчет успешно поставлен в очередь в режиме офлайн") retryIn = int(req.headers.get("retryIn", 60)) print("Повторная отправка запроса через {} секунд".format(retryIn)) print("RequestId: {}".format(req.headers.get("RequestId", False))) sleep(retryIn) elif req.status_code == 202: print("Отчет формируется в режиме офлайн") retryIn = int(req.headers.get("retryIn", 60)) print("Повторная отправка запроса через {} секунд".format(retryIn)) print("RequestId: {}".format(req.headers.get("RequestId", False))) sleep(retryIn) elif req.status_code == 500: print("При формировании отчета произошла ошибка. Пожалуйста, попробуйте повторить запрос позднее") print("RequestId: {}".format(req.headers.get("RequestId", False))) print("JSON-код ответа сервера: \n{}".format(u(req.json()))) break elif req.status_code == 502: print("Время формирования отчета превысило серверное ограничение.") print("Пожалуйста, попробуйте изменить параметры запроса - уменьшить период и количество запрашиваемых данных.") print("JSON-код запроса: {}".format(body)) print("RequestId: {}".format(req.headers.get("RequestId", False))) print("JSON-код ответа сервера: \n{}".format(u(req.json()))) break else: print("Произошла непредвиденная ошибка") print("RequestId: {}".format(req.headers.get("RequestId", False))) print("JSON-код запроса: {}".format(body)) print("JSON-код ответа сервера: \n{}".format(u(req.json()))) break # Обработка ошибки, если не удалось соединиться с сервером API Директа except ConnectionError: # В данном случае мы рекомендуем повторить запрос позднее print("Произошла ошибка соединения с сервером API") # Принудительный выход из цикла break # Если возникла какая-либо другая ошибка except: # В данном случае мы рекомендуем проанализировать действия приложения print("Произошла непредвиденная ошибка") # Принудительный выход из цикла break

tech.yandex.ru


Смотрите также