Как работает библиотека tapi_yandex_direct?
Понадобилось мне выгрузить картинки из рекламных кампаний Яндекс. Директ. В библиотеке, дается довольно поверхностная инструкция рассчитанная на уровень программирования выше-среднего, где ссылка на ноутбук с примерами не очень рабочая (открывать надо в PyCharm), а документация АПИ Яндекс.Директ очень большая по объему, где заблудиться и потеряться очень легко. Моя статья призвана немного заполнить этот пробел.
Что такое Tapi?
Tapi (также известный как «Transport Agnostic API») — это библиотека в Python, предназначенная для упрощения взаимодействия с REST API. Она обеспечивает унифицированный подход к различным API, предоставляя обобщенный интерфейс для выполнения запросов и обработки ответов.
Библиотека `tapi_yandex_direct` является специализированной реализацией для API Яндекс. Директ, использующей функциональность Tapi. О чем как бы намекает префикс в названии библиотеки.
Структура использования библиотеки:
1. Инициализация клиента: Сначала создается объект, который настраивается для доступа к API с использованием вашего токена доступа и других параметров аутентификации. В интернете миллион документов на эту тему, я тут еще раз описывать процедуру получения токена не буду.
2. Доступ к функциональности API через клиент: Клиент , соответствующие различным разделам API. Например, для работы с кампаниями используется метод `client. campaigns() `, который возвращает объект для выполнения запросов.
3. Выполнение запросов: С помощью возвращенного объекта можно выполнять запросы:
или все одной строкой (как написано в документации):
Чтобы вывести результат:
и вы получите список кампаний, т.к. это сервис Campaigns для управления кампаниями.
Проверим тип объекта:
Если вы хотите получить отчет аналогичный "Мастеру отчетов" из раздела "Статистика" в веб-интерфейсе Яндекс.Директ, то вам нужен другой метод ресурса - cервис Reports для получения статистики из раздела "Статистика" документации АПИ:
Проверим тип объекта:
Код одинаковый, но т.к. сервисы АПИ разные, а именно Кампании (Campaigns) и Отчеты (Reports), и наверное писали их скорее всего разные люди, то и результаты выполнения отличаются.
Получить все эти методы (различные сервисы АПИ) можно:
или в исходном коде resource mapping. По каждому ресурсу можно воспользоваться встроеным хелпом:
4. Обработка ответов: После выполнения запроса объект ответа можно использовать для доступа к данным или статусу ответа. Объект ответа для извлечения и трансформации данных, такие как .data, .extract(), .to_values() и другие.
Полный список этих объектов и методов можно получить:
Насколько я понимаю, это не типично для объектов в Python и может вводить в заблуждение, а в документации об этом ничего не сказано. Возможно, это стандартное поведение для библиотеки Transport Agnostic API, что требует более глубокого погружения в документацию, а мы еще даже 2 сервиса до конца не рассмотрели, так что продолжим.
Ответ сервера можно вывести разными методами:
- .data - выводит в типичном для запрошенного сервиса формате (словарь или строка)
- .extract() - конвертирует в формат списка словарей. В Reports работать не будет. Сервис Отчеты по умолчанию выводит формат TSV.
- .to_values() - конвертирует в формат списка списков строк. Работает только в Сервисе Отчетов (Reports).
Описание всех этих методов есть в документации (ниже ссылки с примерами)
Чего еще в супе не хватает? Параметров data= для функции .post(). Примеры всех этих параметров есть в документации.
Как работает АПИ Директа? При запросе отчета, вам надо указать "ReportName". А если вы запросили какой-то очень большой отчет. Насколько я знаю, Яндекс прямо не ограничивает размер данных, которые вы можете запросить, и в этом случае, формирование отчета требует времени. Это ведет к том, что скрипт будет запрашивать отчет по имени до тех пор, пока сервер не отдаст ответ "200" и не передаст данные отчета или не выдаст ошибку таймаут, что значит, вы запросили слишком большой отчет. Так же, вы можете запросить до 5 отчетов параллельно.
"method": "get" # не забывайте указывать метод. Сервис отчетов прекрасно работает и без указания метода, но остальные Сервисы без указания метод работать не будут. Ошибку, что метод не указан библиотека не выдает.
Доработаем наш код:
В 'report name' укажите свой логин, название отчета, все на что фантазии хватит, datetime.now() сделает название отчета уникальным. Имя отчета можно запросить из report_name если это потребуется. Мне лично ни разу не потребовалось.
Пример полного запроса
Допустим, мы хотим получить стандартный отчет "Даты" - "Показы" - "Клики" - "Конверсии". Для этого надо указать правильный тип отчета:
Описание всех возможных полей и типов отчетов - а кто говорил, что будет легко? Таким образом финальный код приобретает вид:
Весь код я протестировал на работоспособность, все должно работать.
Теперь надо создать датафрейм для Пандас или обработать данные иным способом:
... тут я планирую немного дописать код для обработки ответа.
Вот мы и разобрались с двумя сервисами АПИ Яндекс.Директа.
Для того, чтобы получить ссылки на картинки из объявлений, нужно воспользоваться тремя сервисами:
- Сначала запросить id кампаний: .campaigns() или .reports()
- Потом запросить статусы хеши изображений: .ads()
- По списку хешей уже можно запросить url картинок: .adimages()
Но это уже совсем другая статья.