Автоматизация Яндекс.Директ. Язык R для программирования
Совместно с коллегами из ADF Media — Артемом Дурневым и Султаном Назаралиевым, мы решили выпустить цикл из 6 статей, посвященных автоматизации процессов в Яндекс.Директе. Мы уже ознакомились с теорией автоматизации процессов в первой статье. Во второй обсудили, как отправлять запросы без знаний программирования. Сегодня же мы поговорим про то, как использовать язык R для автоматизации, даже если вы совсем его не знаете.
Язык R
R — язык программирования изначально “заточенный” для работы со статистикой и таблицами. Для PPC специалистов R привлекателен своей философией работы со статистикой и таблицами, в нём даже есть отдельный тип данных — таблица, который понятен всем, кто работает с массивами данных в Excel или Google Таблицах.
Языком R пользуются и интернет-маркетологи, потому что под этот язык создано много дополнений для работы с рекламными системами и системами веб аналитики.
Установка R и среды RStudio
Чтобы извлечь данные из Директа, нам нужно нужно установить R и RStudio и создать скрипт. Шаги установки различны для операционных систем. Оставим инструкции для Windows , MacOS и Linux.
Так как у нас MacOS, разберем установку на его примере:
Заходим на R-project и устанавливаем последнюю версию.
Устанавливаем RStudio. RStudio — это оболочка, и графический интерфейс, который упростит работу.
Запускаем RStudio.
Не пугаемся и читаем дальше. Самое главное, что первый шаг сделан, дальше будет проще. Мы поможем.
Как собрать данные из Директа в R
После установки, открываем RStudio и обучаем R тому, что мы от него хотим. Как обучают детей? Им читают и объясняют, как поступать правильно. В этом случае все то же самое. Мы должны установить библиотеки. Нам нужно, чтобы R умел следующее:
Отправлять GET/POST запросы,
Работать с JSON форматом,
Создавать Excel файлы.
Чтобы установить библиотеки, необходимо, в первую очередь, проверить, подключены ли они по умолчанию или нет. Этот код проверит есть ли библиотека в системе: если есть — подключит библиотеку, если нет — установит и подключит.
Примечание: Для работы library(xlsx) библиотеки на компьютере должна стоять Java. Её очень легко и просто установить с официального сайта. У многих она может быть уже установлена т.к. Java требуется для многих приложений.
Наш код написан таким образом, что если Java стоит на ноутбуке, то данные из Директа выгрузятся в Excel. Если не установлена, то в .csv
Нажимаем enter.
После этого, RStudio начинает скачивать библиотеки, добавляются новые функции в те, которые идут по умолчанию. После этого приступаем к работе с Яндекс.Директом.
Эта функция создает заголовки запроса, она является служебной и используется внутри другой функции.
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 и записать полученный результат в файл.
Как выглядит получение отчёта из Яндекс Директа по API:
Мы отправляем запрос к Яндексу. В этом запросе мы “говорим”, что мы хотим от Яндекса.
На этот запрос Яндекс отвечает как настоящий бюрократ — “ок, я понял что вам нужно. Я принял ваш запрос и начал его обрабатывать. Спросите у меня через N секунд готов ли ваш отчёт”.
В нашей функции мы опрашиваем Яндекс каждую секунду — готов ли наш отчёт или нет. Когда Яндекс нам отвечает, что отчет готов, мы получаем отчёт и прекращаем его спрашивать.
Описание аргументов функции YDGetReport, которые можно менять:
ClientLogin — логин клиента в Яндекс.Директ. Если используется для агентского аккаунта, укажите логин клиента. Если ваш аккаунт представительский, логин представительского аккаунта.
Fields — поля отчета. Формат данных — массив.
StartDate — дата начала отчёта в формате ГГГГ-ММ-ДД.
EndDate — дата окончания отчёта в формате ГГГГ-ММ-ДД.
Token — токен Яндекса.
Goals — id целей Яндекс Метрики, по которым требуется получить статистику. Необязательное поле. Формат данных — массив.
Если Java установлена, то данные выгрузятся в Excel. Если нет — то в csv.
А вот этот же скрипт, который можно целиком вставить и получить данные. Для удобства указали его целиком. Главное не забудьте указать аргументы функции YDGetReport, чтобы данные выгрузились корректно.
Вот так легко и просто можно выгрузить данные из Я.Директа, если знать токен. В следующей статье поговорим про то, как массово выгружать данные из множества аккаунтов Я.Директа. Например, если вы работаете маркетологом и ведете несколько десятков проектов.
Автоматизация Яндекс.Директ. Язык R для программирования
Совместно с коллегами из ADF Media — Артемом Дурневым и Султаном Назаралиевым, мы решили выпустить цикл из 6 статей, посвященных автоматизации процессов в Яндекс.Директе. Мы уже ознакомились с теорией автоматизации процессов в первой статье. Во второй обсудили, как отправлять запросы без знаний программирования. Сегодня же мы поговорим про то, как использовать язык R для автоматизации, даже если вы совсем его не знаете.
Язык R
R — язык программирования изначально “заточенный” для работы со статистикой и таблицами. Для PPC специалистов R привлекателен своей философией работы со статистикой и таблицами, в нём даже есть отдельный тип данных — таблица, который понятен всем, кто работает с массивами данных в Excel или Google Таблицах.
Языком R пользуются и интернет-маркетологи, потому что под этот язык создано много дополнений для работы с рекламными системами и системами веб аналитики.
Установка R и среды RStudio
Чтобы извлечь данные из Директа, нам нужно нужно установить R и RStudio и создать скрипт. Шаги установки различны для операционных систем. Оставим инструкции для Windows , MacOS и Linux.
Так как у нас MacOS, разберем установку на его примере:
Заходим на R-project и устанавливаем последнюю версию.
Устанавливаем RStudio. RStudio — это оболочка, и графический интерфейс, который упростит работу.
Запускаем RStudio.
Не пугаемся и читаем дальше. Самое главное, что первый шаг сделан, дальше будет проще. Мы поможем.
Как собрать данные из Директа в R
После установки, открываем RStudio и обучаем R тому, что мы от него хотим. Как обучают детей? Им читают и объясняют, как поступать правильно. В этом случае все то же самое. Мы должны установить библиотеки. Нам нужно, чтобы R умел следующее:
Отправлять GET/POST запросы,
Работать с JSON форматом,
Создавать Excel файлы.
Чтобы установить библиотеки, необходимо, в первую очередь, проверить, подключены ли они по умолчанию или нет. Этот код проверит есть ли библиотека в системе: если есть — подключит библиотеку, если нет — установит и подключит.
Примечание: Для работы library(xlsx) библиотеки на компьютере должна стоять Java. Её очень легко и просто установить с официального сайта. У многих она может быть уже установлена т.к. Java требуется для многих приложений.
Наш код написан таким образом, что если Java стоит на ноутбуке, то данные из Директа выгрузятся в Excel. Если не установлена, то в .csv
Нажимаем enter.
После этого, RStudio начинает скачивать библиотеки, добавляются новые функции в те, которые идут по умолчанию. После этого приступаем к работе с Яндекс.Директом.
Эта функция создает заголовки запроса, она является служебной и используется внутри другой функции.
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 и записать полученный результат в файл.
Как выглядит получение отчёта из Яндекс Директа по API:
Мы отправляем запрос к Яндексу. В этом запросе мы “говорим”, что мы хотим от Яндекса.
На этот запрос Яндекс отвечает как настоящий бюрократ — “ок, я понял что вам нужно. Я принял ваш запрос и начал его обрабатывать. Спросите у меня через N секунд готов ли ваш отчёт”.
В нашей функции мы опрашиваем Яндекс каждую секунду — готов ли наш отчёт или нет. Когда Яндекс нам отвечает, что отчет готов, мы получаем отчёт и прекращаем его спрашивать.
Описание аргументов функции YDGetReport, которые можно менять:
ClientLogin — логин клиента в Яндекс.Директ. Если используется для агентского аккаунта, укажите логин клиента. Если ваш аккаунт представительский, логин представительского аккаунта.
Fields — поля отчета. Формат данных — массив.
StartDate — дата начала отчёта в формате ГГГГ-ММ-ДД.
EndDate — дата окончания отчёта в формате ГГГГ-ММ-ДД.
Token — токен Яндекса.
Goals — id целей Яндекс Метрики, по которым требуется получить статистику. Необязательное поле. Формат данных — массив.
Если Java установлена, то данные выгрузятся в Excel. Если нет — то в csv.
А вот этот же скрипт, который можно целиком вставить и получить данные. Для удобства указали его целиком. Главное не забудьте указать аргументы функции YDGetReport, чтобы данные выгрузились корректно.
Вот так легко и просто можно выгрузить данные из Я.Директа, если знать токен. В следующей статье поговорим про то, как массово выгружать данные из множества аккаунтов Я.Директа. Например, если вы работаете маркетологом и ведете несколько десятков проектов.
content-type`))))\n cat('Send', iter, 'request. Status', Response$status_code, ' \\r')\n flush.console()\n i <- 1\n }\n # Если код ответа начинается с 3, 4 или 5 - возвращаем сообщение об ошибке с кодом ответа и завершаем выполнение\n if(grepl('^[3-5].*', Response$status_code)){\n cat('Error. Something went wrong in', iter, 'request. Status', Response$status_code, '\\n')\n i <- 1\n break()\n }\n cat('Send', iter, 'request. Status', Response$status_code, ' \\r')\n flush.console()\n iter <- iter + 1\n Sys.sleep(1)\n }\n return(Report)\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"
Это код функций, которые выполняют запрос к Яндексу. Теперь необходимо вызвать функцию YDGetReport и записать полученный результат в файл.
На этот запрос Яндекс отвечает как настоящий бюрократ — “ок, я понял что вам нужно. Я принял ваш запрос и начал его обрабатывать. Спросите у меня через N секунд готов ли ваш отчёт”.
В нашей функции мы опрашиваем Яндекс каждую секунду — готов ли наш отчёт или нет. Когда Яндекс нам отвечает, что отчет готов, мы получаем отчёт и прекращаем его спрашивать.
ClientLogin — логин клиента в Яндекс.Директ. Если используется для агентского аккаунта, укажите логин клиента. Если ваш аккаунт представительский, логин представительского аккаунта.
А вот этот же скрипт, который можно целиком вставить и получить данные. Для удобства указали его целиком. Главное не забудьте указать аргументы функции YDGetReport, чтобы данные выгрузились корректно.
Вот так легко и просто можно выгрузить данные из Я.Директа, если знать токен. В следующей статье поговорим про то, как массово выгружать данные из множества аккаунтов Я.Директа. Например, если вы работаете маркетологом и ведете несколько десятков проектов.
"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Сайт","Telegram-канал","Вконтакте"],"type":"UL"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":2,"favorites":18,"reposts":0,"views":21,"hits":1503,"reads":null,"online":0},"dateFavorite":0,"hitsCount":1503,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/marketing/142907-avtomatizaciya-yandeksdirekt-yazyk-r-dlya-programmirovaniya","author":{"id":482592,"name":"ZorbasMedia","nickname":null,"description":"Информационное медиа о партнерском маркетинге и арбитраже трафика.","uri":"","avatar":{"type":"image","data":{"uuid":"ca1aa446-cfe3-5d43-9dd7-2a8e664b517b","width":1400,"height":1400,"size":451955,"type":"jpg","color":"040a17","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"0e5f13e2-2451-552e-a062-d687265713ff","width":1920,"height":1080,"size":354952,"type":"png","color":"cf2213","hash":"","external_service":[]}},"cover_y":52},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4946102,"userId":482592,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4946102"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1322015,"userId":482592,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1322015"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":95307,"userId":482592,"count":0,"shareImage":"https://api.vc.ru/achievements/share/95307"}],"lastModificationDate":1765016012,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":199113,"name":"Маркетинг","description":"Рекламные кейсы из России и других стран, советы по продвижению, маркетинг и digital.","uri":"/marketing","avatar":{"type":"image","data":{"uuid":"d66009fe-9bf0-52da-bdbf-4c758eba39e7","width":2400,"height":2400,"size":841299,"type":"jpg","color":"f97373","hash":"0c1cf06cf0d010","external_service":[]}},"cover":{"type":"image","data":{"uuid":"5488a646-f32d-57a6-a31f-d290afc4388a","width":960,"height":280,"size":177,"type":"png","color":"fc7c7c","hash":"","external_service":[]}},"lastModificationDate":1661337194,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":false,"isDisabledAd":false,"nickname":"marketing","isUnsubscribable":true,"badge":null,"badgeId":null,"isDonationsEnabled":false,"isOnline":false,"isPlus":false,"isUnverifiedBlogForCompanyWithoutPro":false,"isVerified":false,"isRemovedByUserRequest":false,"isFrozen":false,"isPro":false,"type":2,"subtype":"community"},"reactions":{"counters":[{"id":1,"count":1}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null,"keywords":[],"media":{"type":"image","data":{"uuid":"b1352ab1-72ab-ae40-d00a-ae9fcd6fdc9c","width":1236,"height":884,"size":1325432,"type":"png","color":"d7d9db","hash":"","external_service":[]}},"customCover":null,"robotsTag":"noindex","categories":[],"isAnonymized":true}};