Новые виньетки и аргумент FetchBy
Достаточно важное обновление ryandexdirect
:
- В
ryandexdirect
добавлены 2 виньетки:
- Загрузка статистики из сервиса API Reports.
vignette("yandex-direct-get-statistic", package = "ryandexdirect")
- Авторизация в API Яндекс Директ.
vignette("yandex-direct-auth", package = "ryandexdirect")
- В функцию
yadirGetReport
добавлен аргументFetchBy
. За эту доработку спасибо Эдуарду Горху.
Аргумент FetchBy
знаком пользователям пакета RGA
написанным Артёмом Клевцовым.
Зачем это надо?
В сервисе API Reports существует недокументированное ограничение на 1 000 000 строк который вы можете загрузить в рамках одного отчёта. В случае если у вас большой аккаунт, и вы запрашиваете данные за длительный период в глубокой детализации возможна ситуация, что вы получите не полный ответ. При этом API не даст никакого оповещения о проблеме.
Теперь функция yadirGetReport
при возникновении подобной ситуации выведет вам сообщение 'You have reached the limits of Yandex.Direct API. Try to use "FetchBy" parameter with DateRangeType = "CUSTOM_DATE", "DateFrom" and "DateTo". If you are already using it, try to choose a smaller value.'
. Это говорит о том, что вы превысили лимит, и скорее всего в ответе получили неполный объём данных.
Теперь вы можете использовать аргумент FetchBy
и разбить ваш запрос на части, по временному диапазону.
Возможные значения: "DAY", "WEEK", "MONTH", "QUARTER", "YEAR"
Я решил этот функционал сделать ещё полезнее и дописал следующее. В случае достижения лимита, помимо предупреждения в возвращаемый дата фрейм будет добавлен атрибут limit_reached, в котором будет храниться вектор с логинами, тех аккаунтов по которым был достигнут лимит. С помощью команды attr
вы можете получить этот вектор, и использовать его для фильтрации полученного результата и повторного сбора данных из с разбивкой запроса на части.
Наиболее правильный вариант использования атрибута limit_reached и аргумента FetchBy - использовать цикл while
. Который на каждой итерации будет проверять наличии аккаунтов достигших лимита, и запускать по ним повторный сбор данных с разбивкой запроса на временные интервалы.
Пример использования описанного выше функционала:
library(ryandexdirect)
# создаём результирующий фрейм
res <- data.frame()
# список логинов
log_list <- c("login1", "login2","login3", "login4")
# создаём последовательность уровней временной разбивки запросов
fetching_seq <- c("OFF", "MONTH", "WEEK", "DAY")
# счётчик последовательностей разбивки
fetch_id <- 1
# запускаем цикл загрузки данных с проверкой лимитов
while ( ! is.null( log_list ) ) {
# определяем уровень разбивки запроса
if ( fetching_seq[fetch_id] == "OFF" ) fetching <- NULL else fetching <- fetching_seq[fetch_id]
# запускаем сбор данных
data <- yadirGetReport(DateRangeType = "CUSTOM_DATE",
DateFrom = "2018-06-01",
DateTo = "2019-05-31",
FieldNames = c("Date","CampaignName","Impressions","Clicks"),
Login = log_list,
FetchBy = fetching)
# если загрузка была по одному аккаунту добавляем его логин
if ( length(log_list) == 1 ) {
data$Login <- log_list
}
# проверяем список аккаунтов достигших лимита
log_list <- attr(data, "limit_reached")
# выводим список аккаунтов достигших лимита
print(log_list)
# если есть аккаунты достигшие лимита
if ( length(log_list) > 0 ) {
# очищаем от них общую таблицу
data <- data[ ! data$Login %in% log_list, ]
# переключаем уровень разбивки на более мелкий
fetch_id <- fetch_id + 1
}
# дописываем в результирующий фрейм данные
# по тем аккаунтам которые не упёрлись в лимит
if ( nrow(data) > 0 ) {
res <- dplyr::bind_rows(res, data)
}
# проверяем модно ли разбить запрос на более мелкие части
if ( fetch_id > length(fetching_seq) && length(log_list) > 0 ) {
message("Запрос невозможно разбить на меньшие части")
message("Аккаунты которые достигли лимита при загрузке данных по дням: ", paste(log_list, collapse = ", "))
limits_login <- log_list
break
}
}
- Исправлена проблема, которая возникала при запросе статистики сразу из нескольких клиентских аккаунтов, которые являются автономными по отношению друг к другу, т.е. не привязаны к одному агентскому аккаунту.
Версия 3.6.0 в течении ближайших нескольких недель будет находиться в тесовом режиме, в связи с чем пока установить актуальную версию можно только с GtHub с помощью команды devtools::install_github("selesnow/ryandexdirect").