Yandex direct api python

Получение кампаний

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

# -*- coding: utf-8 -*-\nimport requests, json\nfrom requests.exceptions import ConnectionError\nfrom time import sleep\n\n# Метод для корректной обработки строк в кодировке UTF-8 как в Python 3, так и в Python 2\nimport sys\n\nif sys.version_info < (3,):\n def u(x):\n try:\n return x.encode("utf8")\n except UnicodeDecodeError:\n return x\nelse:\n def u(x):\n if type(x) == type(b''):\n return x.decode('utf8')\n else:\n return x\n\n# --- Входные данные ---\n# Адрес сервиса Campaigns для отправки JSON-запросов (регистрозависимый)\nCampaignsURL = 'https://api.direct.yandex.com/json/v5/campaigns'\n\n# OAuth-токен пользователя, от имени которого будут выполняться запросы\ntoken = 'ТОКЕН'\n\n# Логин клиента рекламного агентства\n# Обязательный параметр, если запросы выполняются от имени рекламного агентства\nclientLogin = 'ЛОГИН_КЛИЕНТА'\n\n# --- Подготовка, выполнение и обработка запроса ---\n# Создание HTTP-заголовков запроса\nheaders = \n\n# Создание тела запроса\nbody = , # Критерий отбора кампаний. Для получения всех кампаний должен быть пустым\n "FieldNames": ["Id", "Name"] # Имена параметров, которые требуется получить.\n >>\n\n# Кодирование тела запроса в JSON\njsonBody = json.dumps(body, ensure_ascii=False).encode('utf8')\n\n# Выполнение запроса\ntry:\n result = requests.post(CampaignsURL, jsonBody, headers=headers)\n\n # Отладочная информация\n # print("Заголовки запроса: <>".format(result.request.headers))\n # print("Запрос: <>".format(u(result.request.body)))\n # print("Заголовки ответа: <>".format(result.headers))\n # print("Ответ: <>".format(u(result.text)))\n # print("\\n")\n\n # Обработка запроса\n if result.status_code != 200 or result.json().get("error", False):\n print("Произошла ошибка при обращении к серверу API Директа.")\n print("Код ошибки: <>".format(result.json()["error"]["error_code"]))\n print("Описание ошибки: <>".format(u(result.json()["error"]["error_detail"])))\n print("RequestId: <>".format(result.headers.get("RequestId", False)))\n else:\n print("RequestId: <>".format(result.headers.get("RequestId", False)))\n print("Информация о баллах: <>".format(result.headers.get("Units", False)))\n # Вывод списка кампаний\n for campaign in result.json()["result"]["Campaigns"]:\n print("Рекламная кампания: <> №<>".format(u(campaign['Name']), campaign['Id']))\n\n if result.json()['result'].get('LimitedBy', False):\n # Если ответ содержит параметр LimitedBy, значит, были получены не все доступные объекты.\n # В этом случае следует выполнить дополнительные запросы для получения всех объектов.\n # Подробное описание постраничной выборки - https://tech.yandex.ru/direct/doc/dg/best-practice/get-docpage/#page\n print("Получены не все доступные объекты.")\n\n\n# Обработка ошибки, если не удалось соединиться с сервером API Директа\nexcept ConnectionError:\n # В данном случае мы рекомендуем повторить запрос позднее\n print("Произошла ошибка соединения с сервером API.")\n\n# Если возникла какая-либо другая ошибка\nexcept:\n # В данном случае мы рекомендуем проанализировать действия приложения\n print("Произошла непредвиденная ошибка.")

Источник

Читайте также:  Python driver find element by xpath

Python client for API Yandex Direct

API requests are made over HTTPS using the POST method. Input data structures are passed in the body of the request.

Client methods

.items()

Iterating to get all the data.
 , ] After each request, iterates over the items of the request data.

Reports

.columns

.to_lines()

.to_values()

.to_dict()

.to_columns()

Features

Information about the resource.

Open resource documentation
Send a request in the browser.

Автор

Связаться со мной можно в Телеграм и в Facebook

Удачи тебе, друг! Поставь звездочку 😉

Подробности проекта

Ссылки проекта

Статистика

Метаданные

Лицензия: MIT

Метки tapi, wrapper, yandex, metrika, api, direct, яндекс, директ, апи

Сопровождающие

История выпусков Уведомления о выпусках | Лента RSS

Загрузка файлов

Загрузите файл для вашей платформы. Если вы не уверены, какой выбрать, узнайте больше об установке пакетов.

Source Distribution

Uploaded 28 мая 2021 г. source

Хеши для tapi-yandex-direct-2021.5.29.tar.gz

Хеши для tapi-yandex-direct-2021.5.29.tar.gz
Алгоритм Хеш-дайджест
SHA256 abb45b148afe1c0cf66c4b9516bb67765b7969f41a440d39d710f21266657d80 Копировать
MD5 11af4248c32a5d813dfa94e6ded4be62 Копировать
BLAKE2b-256 8181cea95b253b86c244c06f9ae91d522f2a65e20937a92ce3f527f77c888e3f Копировать

Помощь

О PyPI

Внесение вклада в PyPI

Использование PyPI

Разработано и поддерживается сообществом Python’а для сообщества Python’а.
Пожертвуйте сегодня!

PyPI», «Python Package Index» и логотипы блоков являются зарегистрированными товарными знаками Python Software Foundation.

Источник

Получение статистики по всем клиентам из API Яндекс Директ в разрезе дней с помощью Python

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

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

Нам следует прописать запрос к серверу как функцию.

Лично я сделал 2 файла: функция с запросом и файл с данными, которые будут передаваться в функцию.

В первом файле пишем функцию

Я запрашиваю по всем проектам одни и те же поля, поэтому мне нужно передавать в запрос только даты, логин и токен.

Передача данных в функцию у меня выглядит следующим образом:

def rep(token,login,date_from,date_to):

Пишем запрос к серверу API Яндекс Директ

Данный запрос запрашивает данные по следующим параметрам:

  • Date
  • Impressions
  • Clicks
  • Ctr
  • Cost
  • AvgCpc
  • AvgImpressionPosition
  • AvgClickPosition
  • AvgTrafficVolume
  • BounceRate
  • AvgPageviews

Конечный файл с запросом

import requests from requests.exceptions import ConnectionError from time import sleep import json # Метод для корректной обработки строк в кодировке UTF-8 как в Python 3, так и в Python 2 import sys def rep(token,login,date_from,date_to): 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 = token # Логин клиента рекламного агентства # Обязательный параметр, если запросы выполняются от имени рекламного агентства clientLogin = login # --- Подготовка запроса --- # Создание 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": date_from, "DateTo": date_to >, "FieldNames": [ "Date", "Impressions", "Clicks", "Ctr", "Cost", "AvgCpc", "AvgImpressionPosition", "AvgClickPosition", "AvgTrafficVolume", "BounceRate", "AvgPageviews", ], "ReportName": u("Report4"), "ReportType": "ACCOUNT_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: 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 json_string = json.dumps(body) return req.text 

2 Файл

Выносим даты, логины и токены отдельно как переменные.

#токены mytoken='blablablablaBLABLAsdfgsrgkdfgnf' #логины project = 'elama-99999999' #Даты DateFrom="2019-04-08" DateTo="2019-04-16" 

Это делается для того, чтобы легко менять информацию по всем клиентам, и даты отчетов.

Код для запроса статистики по проекту

print( ‘\n===Название проекта===') data=rep(mytoken,project,DateFrom,DateTo) file=open("cashe.csv","w") file.write(data) file.close() f=DataFrame.from_csv("cashe.csv",header=1,sep=' ',index_col=0,parse_dates=True) f['Cost']=f['Cost']*1.2 f[‘Cost']=f['Cost']/1000000 f['AvgCpc']=f['AvgCpc']*1.2 f['AvgCpc']=f['AvgCpc']/1000000 print(f) 

    Название проекта (» https://habrastorage.org/r/w1560/webt/13/sh/nl/13shnl9hhylqhldqo-2svhx09-q.png» data-src=»https://habrastorage.org/webt/13/sh/nl/13shnl9hhylqhldqo-2svhx09-q.png»/>

Второй файл выглядит следующим образом:

#импорты import pandas as pd import numpy as np from pandas import Series,DataFrame from НАЗВАНИЕ ФАЙЛА С ЗАПРОСОМ import rep #Функции вывода Датафрейма pd.set_option('display.max_columns',None) pd.set_option('display.expand_frame_repr',False) pd.set_option(‘max_colwidth',-1) #токены mytoken='blablablablaBLABLAsdfgsrgkdfgnf' #логины project = 'elama-99999999' #Даты DateFrom="2019-04-08" DateTo="2019-04-16" print( ‘\n===Название проекта===') data=rep(mytoken,project,DateFrom,DateTo) file=open("cashe.csv","w") file.write(data) file.close() f=DataFrame.from_csv("cashe.csv",header=1,sep=' ',index_col=0,parse_dates=True) f['Cost']=f['Cost']*1.2 f[‘Cost']=f['Cost']/1000000 f['AvgCpc']=f['AvgCpc']*1.2 f['AvgCpc']=f['AvgCpc']/1000000 print(f) 

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

После нам нужно будет лишь менять отрезок времени в полях DateFrom и DateTo.

Источник

Оцените статью