Sign in

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

Работаем с API Yandex.Metrica в консоли Ruby

На субъективный взгляд автора, одно из основных неудобств Яндекс.Метрика заключено в крайне медленном веб-интерфейсе. Создатели сервиса прекрасно это понимают, оттого при формировании отчета на страничке перманентно мерцает предложение "сформировать отчет в фоновом режиме".

Данный материал ставит своей целью предложить многочисленным пользователям (SEO-специалистам, владельцам и менеджерам интернет-магазинов, блогерам) веб-аналитики от компании Яндекс - простой и удобный способ доступа к практически любым отчетам Метрики посредством гибкого API Yandex.Metrica, работа которого, в общем, (если закрыть глаза на некоторые траблы в ночное по Москве время) не вызывает нареканий. Рабочий пример приложения, написанного на Ruby, всегда доступен для загрузки в гитхабе автора, репозиторий получил название Ruby-CLI-App-for-Yandex-Metrica-API:

Не будем здесь останавливаться на технических подробностях установки и использования Ruby в различных средах, будь то Windows, macOS или Linux; в Сети опубликовано поистине огромное число статей, подробно освещающих - например - эту процедуру, так что не думаю, что данный момент способен вызвать проблемы. Поэтому далее попробую короткой строкой прокомментировать только код и логику приложения, написанного таким образом, чтобы представлять из себя способный ко многим изменениям и довольно гибкий конструктор.

Как получить аналитику API Yandex.Metrica в командной строке

Начнем с файла start.rb, который, собственно, и печатает в консоли данные Яндекс.Метрика, вызывая методы Ruby-CLI-App-for-Yandex-Metrica-API и получая через их посредство данные Yandex.Metrica; если припомнить терминологию MVC, это - наша вьюха. В качестве примера я наполнил этот файл пятью или шестью вызовами, сконструированными по такому вот несложному принципу:

 

Analytics.query('ym:s:externalRefererPathLevel1')['data'].first(10).each do |i|
  puts i['dimensions'][0]['name']
  puts i['metrics'][0].to_i
end

 

Варианты: коли уж упомянул о гибкости и масштабируемости скрипта, попробуем получить геотаргетинг посетителей сайта, исключив из него те или иные страны; например, исключаем русскоговорящую аудиторию, дабы исследовать интерес к блогу представителей иных (выведем ТОП-10) стран. Опять же, ничего сложного:

 

Analytics.query('ym:s:regionCountry')['data'].first(13).each do |i|
  next unless i['dimensions'][0]['name'] != 'Russia' &&
              i['dimensions'][0]['name'] != 'Ukraine' &&
              i['dimensions'][0]['name'] != 'Belarus'
  puts i['dimensions'][0]['name']
  puts i['metrics'][0].to_i
end

 

Или, наоборот, получим число посетителей только из одной страны:

 

Analytics.query('ym:s:regionCountry')['data'].each do |i|
  if i['dimensions'][0]['name'] == 'United States'
  puts i['dimensions'][0]['name']
  puts i['metrics'][0].to_i
end
end

 

Что здесь происходит? - ничего сложного: вызывается метод query класса Analytics, передавая в качестве аргумента строку 'ym:s:externalRefererPathLevel1', являющуюся т.н. группировкой API Метрика (полный список группировок и метрик API Yandex.Metrica см. здесь). Класс описан в файле analytics.rb:

 

class Analytics
  def self.query(v)
    YandexMetrika.dimension_or_preset?(ENV['AUTH_TOKEN_METRIKA'], ENV['IDS_METRIKA'], v)
  end
end

 

 Основное предназначение данного метода - подставлять в запрос токен доступа и идентификатор вашего счетчика Яндекс.Метрика, которые перечислены в файле .env; здесь работает ruby gem 'dotenv' , который, наряду с двумя другими джемами -

 

require 'dotenv/load'
require 'typhoeus'
require 'json'

 

- является необходимым для работы нашего консольного клиента API Yandex.Metrica. Установка такого рода зависимостей обычно крайне несложна; в Linux, например, вот так:

 

gem install dotenv

 

, в Windows... не намного сложнее. Погуглите, все на самом деле элементарно, было бы желание разобраться.

Как видим, в данном случае идет обращение уже к методу класса YandexMetrika, причем метод носит длинное название dimension_or_preset?, вполне точно передающее его смысл и предназначение. Суть в том, что перечень параметров, используемых при запросе к API Яндекс.Метрика, способен меняться в зависимости от тех данных, которые мы хотим получить; желая получить список рефереров (с которого мы начали, помните? - группировка 'ym:s:externalRefererPathLevel1', первый уровень URL внешнего реферера) или, например, перечень стран, откуда на наш сайт пришли визитеры ('ym:s:regionCountry') - параметры запроса способны выглядеть, например, следующим образом:

 

{
'ids' => ids,
'metrics' => 'ym:s:visits',
'dimensions' => dimension,
'lang' => 'en',
'date1' => '1daysAgo',
'date2' => 'yesterday',
'accuracy' => 'full'
}

 

, если же нам хотелось бы получить список ключевых фраз ('sources_search_phrases'), то:

 

{
'ids' => ids,
'preset' => preset,
'date1' => '1daysAgo',
'date2' => 'yesterday',
'accuracy' => 'full'
}

 

Как видите, 'dimensions' заменен на 'preset', 'metrics' же и 'lang' нам здесь вообще (впрочем, дело вкуса) без надобности. Таким образом, метод dimension_or_preset? призван определить, чем именно является переданный аргумент v; как видите, я попросту ищу в строке вхождение 'sources', используя условие: если вхождение имеет место быть, то это preset, если нет - dimension, и уже в зависимости от этого вызываем следующий, финальный метод того же класса. Излишне говорить, что описанное - далеко не единственное из возможных решений подобного рода:

 

class YandexMetrika
  def self.dimension_or_preset?(token, ids, v)
    params = if v.include? 'sources'
               {
                 'ids' => ids,
                 'preset' => v,
                 'date1' => '1daysAgo',
                 'date2' => 'yesterday',
                 'accuracy' => 'full'
               }
             else
               {
                 'ids' => ids,
                 'metrics' => 'ym:s:visits',
                 'dimensions' => v,
                 'lang' => 'en',
                 'date1' => '1daysAgo',
                 'date2' => 'yesterday',
                 'accuracy' => 'full'
               }
              end
    inquiry(token, params)
    end

  def self.inquiry(token, params)
    response = Typhoeus::Request.get(
      'https://api-metrika.yandex.ru/stat/v1/data',
      params: params,
      headers: {
        Accept: 'application/x-yametrika+json',
        Authorization: 'OAuth' + token
      }
    )
    JSON.parse(response.body)
  end
end

 

Собственно, в повседневной работе ничто не мешает SEO-специалисту набросать в скрипте столько методов, сколько ему нужно, не прибегая к проверкам; я лишь пытался следовать принципу DRY (Don't Repeat Yourself), публикуя код в своем GitHub:

 

Увидеть на гитхабе.

 

Ну вот как-то так. В ближайшее время постараюсь подключить в приложении аналогичным способом иные методы API Яндекс.Метрика, в том числе adfox... заходите на огонек этого блога. Да, если кто-то еще не в курсе, как получить токен доступа - в левом сайдбаре страницы доступна, в числе прочих, ссылка на материал Получаем отладочный токен на OAuth-сервере Яндекса.

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

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

В блоге

Комментарии в блоге

  • Aleksej Думаю, воскреснет... аккурат первого числа следующего месяца... это, знаете ли, как в одной очень старой книжке, "не ищите живого среди…

    Четверг, 27 августа 2020

    Опубликовано в: API HeadHunter: скрипт для обновления резюме
  • Alexis умер проект или заставили? Давайте подымем там, где не тронут?

    Вторник, 25 августа 2020

    Опубликовано в: API HeadHunter: скрипт для обновления резюме
  • Сережа Хорошая статья, что редкость в наше время. Спасибо!

    Понедельник, 08 июня 2020

    Опубликовано в: Между VirtualBox и KVM
  • Aleksej Характер коллектива, специфика рабочих профилей специалистов в значительной степени определяются личностью руководителя компании. Взаимосвязь здесь огромная, почти мистическая; не раз…

    Воскресенье, 31 мая 2020

    Опубликовано в: IWU (iwu.team) и Geecko (geecko.ru). Отзывы
  • ПроходилНоОставил Прислали вакансию какого-то "супер-пупер" стартапа. Но обязательна регистрация на их сайте, чтобы откликнуться на вакансию. Компания неизвестная, инфу про нее…

    Вторник, 26 мая 2020

    Опубликовано в: IWU (iwu.team) и Geecko (geecko.ru). Отзывы