- Получение кампаний
- Python client for API Yandex Direct
- Client methods
- .items()
- Reports
- .columns
- .to_lines()
- .to_values()
- .to_dict()
- .to_columns()
- Features
- Автор
- Подробности проекта
- Ссылки проекта
- Статистика
- Метаданные
- Сопровождающие
- История выпусков Уведомления о выпусках | Лента RSS
- Загрузка файлов
- Source Distribution
- Хеши для tapi-yandex-direct-2021.5.29.tar.gz
- Помощь
- О PyPI
- Внесение вклада в PyPI
- Использование PyPI
- Получение статистики по всем клиентам из API Яндекс Директ в разрезе дней с помощью Python
- В первом файле пишем функцию
- Пишем запрос к серверу API Яндекс Директ
- Конечный файл с запросом
- 2 Файл
- Выносим даты, логины и токены отдельно как переменные.
- Код для запроса статистики по проекту
- Второй файл выглядит следующим образом:
Получение кампаний
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 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
Алгоритм | Хеш-дайджест | |
---|---|---|
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.