Как выгрузить данные по звонкам из Calltouch используя API и язык R?

Для кого это?

Статья будет интересна всем кто на ежедневной основе собирает данные из нескольких кабинетов (аккаунтов) Calltouch, с целью анализа данных по звонкам клиентов. Так же материал будет полезен тем, кто планирует выгружать данные колтача и дальше грузить их к себе в системы bi аналитики аккумулируя предварительно в каких-то базах данных.

Исходные данные

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

Для подключения его нужно скачать и установить. Также для комфортной работы с R рекомендую использовать бесплатную среду разработки RStudio.

Для решения вышеописанной задачи нам потребуется установить пакеты для:

  • загрузки данных из кабинетов Яндекс Метрики — "httr"
  • работы со временем и временными периодами — «lubridate»
  • работы с таблицами и агрегации данных — «dplyr»
  • агрегации строк и работы с ними — "stringr"

Чтобы установить пакеты из основного репозитория CRAN примените базовую функцию install.packages:

install.packages("stringr", dependencies = TRUE) install.packages("lubridate", dependencies = TRUE) install.packages("httr ", dependencies = TRUE) install.packages("dplyr", dependencies = TRUE)

Пакет достаточно установить однажды, но подключать нужно каждый раз при запуске нового сеанса работы с R. Для подключения используйте функцию library.

library(stringr) library(lubridate) library(httr) library(dplyr)

Теперь приступаем к работе самими API Calltouch. В разделе интеграции есть необходимый нам блок

Кабинет Calltouch
Кабинет Calltouch

Переходя в него мы должны активировать API подключение и нам откроются три основных параметра для работы с API

Кабинет Calltouch
Кабинет Calltouch

Копируем ID, Сервер и Токен из кабинета в любой текстовый редактор, проверяем чтобы статус был «Активен» и можете закрывать кабинет Calltouc… на всегда =)

Возвращаемся в Rstudio и записываем наши доступы в переменные:

id <- "3****" server <- "https://api-**********.ru/" token <- "e*****************************aej"

Задаем переменные дат, для определения периода сбора информации за который мы будем собирать информацию из кабинета колтача:

first_date <- today()-1 end_date <- today()-1 ## Функция today() использует пакета lubridate, её задача определить сегодняшнюю дату

Пишем функцию

Теперь когда все исходные данные есть, мы пишем свою функцию для сбора статистики из кабинета Calltouch. Функция скорее всего будет сложна для понимания людям которые впервые столкнулись с языком R т.к. включает в себя различные приемы использования синтаксиса R, поэтому для общего понимания добавлены пояснения:

CalltouchCalls <- function (dateFrom, dateTo, id, server, token) { proc_start <- Sys.time() ## Проверка на наличие необходимых параметров if (is.null(id) | is.null(token)) { stop( "Token or ID is not defined" ) } ## Настройка опций среды обработки чтобы строки имели класс фактора if (getOption("stringsAsFactors") == TRUE) { string_as_factor <- "change" options(stringsAsFactors = F) } else { string_as_factor <- "no change" } ## Задаем единый формат дат для стартовой и конечной даты dateFrom <- format.Date(dateFrom, "%d/%m/%Y") dateTo <- format.Date(dateTo, "%d/%m/%Y") ## Создает первичный GET запрос к API Колтача для того чтобы понять количество страниц с данными url <- paste0(server,"calls-service/RestAPI/",id,"/calls-diary/calls?clientApiId=", token,"&dateFrom=",dateFrom,"&dateTo=",dateTo,"&page=1&limit=10") answer <- GET(url) dataRaw <- content(answer) ## Парсим полученный ответ total <- dataRaw$recordsTotal limit <- 12 page <- total %/% limit offset <- total %% limit if (offset == 0) page <- page - 1 result <- data.frame(stringsAsFactors = F) ## Создает основной GET запрос к API Колтача для сбора данных for (i in 0:page) { url <- paste0(server,"calls-service/RestAPI/",id,"/calls-diary/calls?clientApiId=", token,"&dateFrom=",dateFrom,"&dateTo=",dateTo,"&page=",i+1,"&limit=",limit) answer <- GET(url) dataRaw <- content(answer) dataRaw <- dataRaw$records if (length(dataRaw) > 0) { column_names <- unlist(lapply(c(names(dataRaw[[1]])), function(x) return(x))) rows <- lapply(dataRaw, function(x) return(x)) rows <- setNames(object = data.frame(do.call(rbind, lapply(rows, as.character, unlist))), nm = names(rows[[1]])) rows <- replace(rows, rows=="NULL", NA) result <- rbind(result,rows) } packageStartupMessage(".", appendLF = F) } return(result) }

Далее запускаем нашу самописную функцию используя переменные полученные в самом начале:

stat_calltouch <- CalltouchCalls(first_date, end_date, id, server, token)

Итог

Выполнив функцию, в среде разработки, мы получим таблицу со всеми полями, которые включаются в отчет по звонкам передаваемые API Calltouch. Далее мы можем либо сохранить данные себе на компьютер в виде csv файла

write.csv(stat_calltouch ,'Звонки_Calltouch.csv')

либо отправить в какую-нибудь базу данных так же используя R, либо использовать по какому-то своему усмотрению. Но это уже совсем другая история =)

На этом всё. Если статья была интересна, позднее планирую написать о том как передавать данные в БД или как собрать данные из множества кабинетов одновременно и подготовить данные для анализа.

Весь код в читаемом виде доступен на github

Полезно ли делать подобный материал?
Да
Нет
88
13 комментариев

Я человек простой - вижу автоматизацию, ставлю плюс)

2
Ответить

=)

1
Ответить

А просто в CSV выгрузить нельзя средствами колтач? Зачем такие сложности?

Ответить

Если необходимо собирать данные каждый день и писать их к себе в БД, то ежедневный ручной труд по выгрузке в БД с использованием csv (что видится мне тоже крайне не простой задачей) приведет к мозолям через несколько месяцев=)..

2
Ответить

Привет, год наверное не заходил в RStudio :) Не планируется ли из этого создать готовый пакет?

Ответить

Есть такая идея =) Если реализуется, обязательно здесь отпишу

2
Ответить