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)
}
такой хорошей статьи я не ожидал, конечно)
Полезная статья! Но для тех, кому сложно или лень разбираться, рекомендуем попробовать готовый биддер. Можно наш. ☺