Skip to content

Новые виньетки и аргумент FetchBy

Compare
Choose a tag to compare
@selesnow selesnow released this 31 May 09:12
· 97 commits to master since this release
8a86796

Достаточно важное обновление ryandexdirect:

  1. В ryandexdirect добавлены 2 виньетки:
  • Загрузка статистики из сервиса API Reports. vignette("yandex-direct-get-statistic", package = "ryandexdirect")
  • Авторизация в API Яндекс Директ. vignette("yandex-direct-auth", package = "ryandexdirect")
  1. В функцию 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
  }
}
  1. Исправлена проблема, которая возникала при запросе статистики сразу из нескольких клиентских аккаунтов, которые являются автономными по отношению друг к другу, т.е. не привязаны к одному агентскому аккаунту.

Версия 3.6.0 в течении ближайших нескольких недель будет находиться в тесовом режиме, в связи с чем пока установить актуальную версию можно только с GtHub с помощью команды devtools::install_github("selesnow/ryandexdirect").