Sign in

Зарегистрируйтесь, чтобы стать полноправным участником сообщества Masterpro.ws.

Получаем и кэшируем данные API Yandex.Metrika в Ruby on Rails application

Не первый год имея дело с API Яндекс Метрика - не могу сказать, что работает этот API идеально.

 

Хотя, опять же, смотря с чем сравнивать... до сих пор не могу забыть, как тот или иной endpoint API HeadHunter (an endpoint is a URL pattern used to communicate with an API) регулярно вырубался аккурат на все выходные, приходя в себя где-то в понедельник к обеду - вероятно, когда технари проспятся: здесь, конечно, Яша однозначно круче. С другой стороны, API многих и многих популярных западных веб-сервисов (соц. сети, weather statiions, про Google вообще молчу) крайне редко позволяют себе отказы в обслуживании, пусть даже кратковременные; что, увы, совершенно не редкость на Яндексе.

 

Получаем и кэшируем данные API Яндекс Метрика

 

Рабочий пример описанного в статье кода, в числе других Rails Examples - всегда возможно найти в тестовом блоге автора на herokuapp.com, welcome.

 

Рассмотрим в этой краткой статье некоторые несложные приемы, посредством которых получим и кэшируем данные API Yandex.Metrika в нашем rails-app. Собсно, кэш в Ruby on Rails 5 включен по-дефолту для production environment, но только не в режиме development; дабы исправить это - вводим следующую команду, создающую пустой caching-dev.txt в tmp-директории:

 

$ rails dev:cache
Development mode is now being cached.

 

Если собираемся пушить приложение на Heroku, скажем, будет нелишним убедиться, что весь /tmp исключен (.gitignore) из индекса:

 

git check-ignore --verbose tmp/caching-dev.txt

 

, соответственно:

 

git add -f tmp/caching-dev.txt

 

Ок, получаем рефереров сайта посредством gem 'typhoeus' (HTTP client library based on Ethon which wraps libcurl, удобен, привык я к нему, рекомендую), с учетом новых особенностей API Yandex.Metrika, начиная с 13 февраля 2019 года запретившего передачу приложением токена доступа в параметрах. Будет как-то вот так, как показано далее, и полученные подобным образом данные имеют TTL (Time to Live, время жизни кэша) 1 час:

 

require 'typhoeus'

def referers
return Rails.cache.fetch('referers', :expires_in => 1.hours) {
authToken = ENV['AUTH_TOKEN_METRIKA']
response = Typhoeus::Request.get(
"https://api-metrika.yandex.ru/stat/v1/data",
params: {
'ids' => ENV['IDS_METRIKA'],
'metrics' => 'ym:s:visits',
'dimensions' => 'ym:s:externalRefererPathLevel1',
'date1' => '15daysAgo',
'date2' => 'yesterday'
},
headers: {
Accept: 'application/x-yametrika+json',
Authorization: 'OAuth' + authToken
}
)
JSON.parse(response.body)
}
end

 

 

С authToken и ids, думаю, понятно: токен доступа и идентификатор аккаунта, временной период - последние две недели, группировки и метрики возможно найти здесь; кстати, для получения цифр количества пользователей сайта по геотаргетингу (страны) - dimensions выглядит следующим образом:

 

'ym:s:regionCountry'

 

Пожалуй, вот и все. Добавлю, если поставлена задача исключить из кэширования ответ API Яндекс Метрика, не содержащий данных - см. начало статьи - разумно иcключение выкинуть в случае ошибки и обработать вовне; ну или же вместо fetch попробовать использовать read/write напрямую. For example.

Оставить комментарий

Добавьте ваш комментарий

В блоге