Автоматизация Яндекс.Директ. Язык R для программирования

Совместно с коллегами из ADF MediaАртемом Дурневым и Султаном Назаралиевым, мы решили выпустить цикл из 6 статей, посвященных автоматизации процессов в Яндекс.Директе. Мы уже ознакомились с теорией автоматизации процессов в первой статье. Во второй обсудили, как отправлять запросы без знаний программирования. Сегодня же мы поговорим про то, как использовать язык R для автоматизации, даже если вы совсем его не знаете.

Язык R

R — язык программирования изначально “заточенный” для работы со статистикой и таблицами. Для PPC специалистов R привлекателен своей философией работы со статистикой и таблицами, в нём даже есть отдельный тип данных — таблица, который понятен всем, кто работает с массивами данных в Excel или Google Таблицах.

Языком R пользуются и интернет-маркетологи, потому что под этот язык создано много дополнений для работы с рекламными системами и системами веб аналитики.

Установка R и среды RStudio

Чтобы извлечь данные из Директа, нам нужно нужно установить R и RStudio и создать скрипт. Шаги установки различны для операционных систем. Оставим инструкции для Windows , MacOS и Linux.

Так как у нас MacOS, разберем установку на его примере:

Автоматизация Яндекс.Директ. Язык R для программирования
  1. Заходим на R-project и устанавливаем последнюю версию.

  2. Устанавливаем RStudio. RStudio — это оболочка, и графический интерфейс, который упростит работу.

  3. Запускаем RStudio.
  4. Не пугаемся и читаем дальше. Самое главное, что первый шаг сделан, дальше будет проще. Мы поможем.

Как собрать данные из Директа в R

После установки, открываем RStudio и обучаем R тому, что мы от него хотим. Как обучают детей? Им читают и объясняют, как поступать правильно. В этом случае все то же самое. Мы должны установить библиотеки. Нам нужно, чтобы R умел следующее:

  • Отправлять GET/POST запросы,
  • Работать с JSON форматом,
  • Создавать Excel файлы.

Чтобы установить библиотеки, необходимо, в первую очередь, проверить, подключены ли они по умолчанию или нет. Этот код проверит есть ли библиотека в системе: если есть — подключит библиотеку, если нет — установит и подключит.

if(!'httr' %in% rownames(installed.packages())){ install.packages('httr') } if(!'jsonlite' %in% rownames(installed.packages())){ install.packages('jsonlite') } if(!'xlsx' %in% rownames(installed.packages())){ install.packages('xlsx') } library(httr) library(jsonlite) library(xlsx)
Автоматизация Яндекс.Директ. Язык R для программирования

Примечание: Для работы library(xlsx) библиотеки на компьютере должна стоять Java. Её очень легко и просто установить с официального сайта. У многих она может быть уже установлена т.к. Java требуется для многих приложений.

Наш код написан таким образом, что если Java стоит на ноутбуке, то данные из Директа выгрузятся в Excel. Если не установлена, то в .csv

Нажимаем enter.

Автоматизация Яндекс.Директ. Язык R для программирования

После этого, RStudio начинает скачивать библиотеки, добавляются новые функции в те, которые идут по умолчанию. После этого приступаем к работе с Яндекс.Директом.

1. Запишем данные авторизации: логин и токенy

andexToken <- 'ВАШ ЯНДЕКС ТОКЕН'​ clientLogin <- 'ЯНДЕКС ЛОГИН ВАШЕГО КЛИЕНТА'
Автоматизация Яндекс.Директ. Язык R для программирования

Про то, как получать токены, мы рассказывали в первой статье.

2. Сформируем заголовки запроса

YDCreateHeaders <- function(Token, ClientLogin = FALSE){ # Создаем объект со стандартными заголовками headers <- c( 'Authorization' = paste('Bearer', Token), 'Accept-Language' = 'ru', 'Content-Type' = 'application/json', 'Host' = 'api.direct.yandex.com', 'processingMode' = 'offline', 'returnMoneyInMicros' = 'false', 'skipReportHeader' = 'true', 'skipReportSummary' = 'true' ) # Добавляем заголовок Client-Login если указан аргумент if(ClientLogin != FALSE){ headers <- c(headers, 'Client-Login' = ClientLogin) } return(headers) }

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

3. Сформировать тело запроса, сделать запрос, проверить готовность отчета и перевести в табличный формат

YDGetReport <- function(ClientLogin, Fields, StartDate, EndDate, Token, Goals = FALSE){ Report <- data.frame() # Создаем таблицу куда запишем результат URL <- 'https://api.direct.yandex.com/json/v5/reports' # URL куда отправляем запрос Яндексу ReportName <- paste(ClientLogin, Sys.time()) # Формируем название отчёта # Создаем тело запроса RequestBody <- list( params = list( SelectionCriteria = list( DateFrom = StartDate, DateTo = EndDate ), FieldNames = Fields, ReportName = ReportName, ReportType = 'CUSTOM_REPORT', DateRangeType = 'CUSTOM_DATE', Format = 'TSV', IncludeVAT = 'YES', IncludeDiscount = 'NO' ) ) # Если в аргументах указаны id целей Яндекс Метрики - добавляем их к запросу if(Goals[[1]] != FALSE){ RequestBody$params$Goals = Goals } # Преобразуем запрос в JSON формат RequestBody <- toJSON(RequestBody, auto_unbox = T, pretty = TRUE) # Отправляем запрос Response <- POST(url = URL, body = RequestBody, add_headers(YDCreateHeaders(Token, ClientLogin))) i <- 0 iter <- 1 # Каждую секунду отправляем тот же самый запрос для проверки готовности отчета while(i == 0){ Response <- POST(url = URL, body = RequestBody, add_headers(YDCreateHeaders(Token, ClientLogin))) # Если код ответа 200 - возвращаем результат и завершаем выполнение if(Response$status_code == 200){ Report <- suppressMessages((as.data.frame(content(Response, type = Response$headers$`content-type`)))) cat('Send', iter, 'request. Status', Response$status_code, ' \r') flush.console() i <- 1 } # Если код ответа начинается с 3, 4 или 5 - возвращаем сообщение об ошибке с кодом ответа и завершаем выполнение if(grepl('^[3-5].*', Response$status_code)){ cat('Error. Something went wrong in', iter, 'request. Status', Response$status_code, '\n') i <- 1 break() } cat('Send', iter, 'request. Status', Response$status_code, ' \r') flush.console() iter <- iter + 1 Sys.sleep(1) } return(Report) }

Это код функций, которые выполняют запрос к Яндексу. Теперь необходимо вызвать функцию YDGetReport и записать полученный результат в файл.

Пример выполнения функции:

yandexReport <- YDGetReport( clientLogin, list( 'CampaignName', 'CampaignId', 'Clicks', 'Cost', 'Conversions' ), '2020-01-01', '2020-02-02', yandexToken, list('33954660', '34523868') )

Как выглядит получение отчёта из Яндекс Директа по API:

Мы отправляем запрос к Яндексу. В этом запросе мы “говорим”, что мы хотим от Яндекса.

На этот запрос Яндекс отвечает как настоящий бюрократ — “ок, я понял что вам нужно. Я принял ваш запрос и начал его обрабатывать. Спросите у меня через N секунд готов ли ваш отчёт”.

В нашей функции мы опрашиваем Яндекс каждую секунду — готов ли наш отчёт или нет. Когда Яндекс нам отвечает, что отчет готов, мы получаем отчёт и прекращаем его спрашивать.

Более подробно об этом режиме написанно в блоге Яндекса.

Описание аргументов функции YDGetReport, которые можно менять:

ClientLogin — логин клиента в Яндекс.Директ. Если используется для агентского аккаунта, укажите логин клиента. Если ваш аккаунт представительский, логин представительского аккаунта.

Fields — поля отчета. Формат данных — массив.

StartDate — дата начала отчёта в формате ГГГГ-ММ-ДД.

EndDate — дата окончания отчёта в формате ГГГГ-ММ-ДД.

Token — токен Яндекса.

Goals — id целей Яндекс Метрики, по которым требуется получить статистику. Необязательное поле. Формат данных — массив.

4. Выгружаем данные

out <- tryCatch({ write.xlsx(yandexReport, 'yandexReport.xlsx') }, error=function(cond){ write.csv(yandexReport, 'yandexReport.csv') }, finally = { cat('Report file success write in', getwd(), 'directory') })

Если Java установлена, то данные выгрузятся в Excel. Если нет — то в csv.

А вот этот же скрипт, который можно целиком вставить и получить данные. Для удобства указали его целиком. Главное не забудьте указать аргументы функции YDGetReport, чтобы данные выгрузились корректно.

Вот так легко и просто можно выгрузить данные из Я.Директа, если знать токен. В следующей статье поговорим про то, как массово выгружать данные из множества аккаунтов Я.Директа. Например, если вы работаете маркетологом и ведете несколько десятков проектов.

Благодарим за прочтение!

Наши контакты:

11
2 комментария

такой хорошей статьи я не ожидал, конечно)

Ответить

Полезная статья! Но для тех, кому сложно или лень разбираться, рекомендуем попробовать готовый биддер. Можно наш. ☺

Ответить