Pull to refresh
0

Делаем простенький web-сервис с помощью API Яндекс.Метрики

Reading time 9 min
Views 40K
Всем привет!

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

Кроме того, я покажу, как с помощью этого API сделать web-сервис, в котором можно сравнить текущие показатели сайта с прошлым и посмотреть, как со временем менялась популярность страниц:



Кратко об API Метрики


Главное отличие API Метрики от API Google Analytics заключается в том, что оно фокусируется на отчетах, а не показателях. Программист, пользующийся GA, должен сказать сервису «я хочу видеть визиты с рекламных источников разбитые по цели 1, количеству визитов, показателю отказов», пользователь Метрики скажет «я хочу видеть отчет по содержанию».

Выбор ориентации на отчеты, а не показатели, соответствует концепции Метрики как инструмента для обычных пользователей, а не профессионалов. Пользоваться API Метрики действительно в разы проще.

Тем не менее, у текущего подхода есть и недостатки. Во-первых, можно запрашивать у сервиса только заранее определенные программистами Яндекса отчеты. Во-вторых, поскольку структуру отчетов менять нельзя, каждый раз вы будете получать избыточный объём информации, что может отразиться на времени отклика сервиса.

Метрика развивается очень быстро (за время написания статьи даже успел немножко поменяться API), поэтому я уверен, что уже скоро можно будет так же, как и в GA, формировать отчеты только для нужных показателей, и описанные выше проблемы пропадут.

Зачем оно нужно?


Итак, зачем же нужно API метрики? С его помощью можно натворить много интересных вещей, например:
  1. Показывать на сайте статистику в реальном времени
  2. Интегрировать статистику сайта в свою CRM
  3. Автоматизировать и упростить работу сотрудников

Пункт один представляет собой забавную свистелко-перделку, которая, тем не менее, может быть интересна рекламодателям сайта. Можно прямо на странице «реклама на сайте» автоматически отображать наиболее популярные запросы, по которым приходят на сайт, график посещаемости, географические регионы, с которых приходят пользователи и многое другое.

Например, вот как это сделано на Хабре (http://habrahabr.ru/info/stats/):



Пункт 2 (интеграция статистики в CRM), понятен без всяких объяснений. Добавить к внутренней информации о заказе его источник, регион покупателя и иногда даже конкретный рекламный креатив — это голубая мечта любого рекламщика/аналитика. После того, как это будет сделано, сразу станет видно, какая реклама эффективна, а какая нет и заодно избавить колл-центр хотя бы от нескольких лишних вопросов к пользователю.

Автоматизация работы сотрудников (пункт 3) важен для тех, кто размещает много рекламы, тратит много денег на SEO и постоянно отслеживает эффективность всего этого дела. Допустим, что каждую неделю ваши сотрудники обрабатывают 40 отчетов из Яндекс.Метрики. На каждый отчет они тратят по 10 минут. Это 6 часов 40 минут. А если выдавать им уже обработанные документы, то эти 7 часов можно будет потратить на что-то реально полезное.

Главное преимущество для программиста


После работы с API GA и его громоздким XML-форматом, мне хотелось бы отдельно подчеркнуть ещё один важный момент: Метрика позволяет получать данные в JSON! На мой взгляд, это одно из важнейших конкурентных преимуществ перед GA. Все современные языки умеют работать с JSON из коробки, и таким образом отпадает нужда в каких-либо дополнительных библиотеках. В отличие от Google с Метрикой можно сразу сесть и ехать.

В этом очень легко убедиться, откройте новую вкладку браузера и перейдите по следующему URL (вы должны быть залогинены в Яндексе): http://api-metrika.yandex.ru/counters.json?pretty=1.

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



Делаем собственный сервис на основе API Метрики



Итак, чтобы поглубже разобраться в API, попробуем сделать интернет-сервис, расширяющий стандартные возможности Метрики. По умолчанию в ней отсутствует одна очень важная штука — сравнение с прошлым периодом. Это очень удобная возможность, благодаря которой аналитика сайта становится существенно проще. В GA сравнение по периоду выглядит так:



Попробуем сделать что-то подобное для Метрики.

Перед тем, как приступать к созданию непосредственно отчетов, надо дать пользователю возможность выбрать счетчик, статистику которого он хочет увидеть. Для этого мы должны воспользоваться той ссылкой, которую уже видели выше (http://api-metrika.yandex.ru/counters.json). Из информации, которую присылает сервер, нам надо вытащить два параметра: id и site. ID — это номер счетчика, без которого невозможно получить никакой статистики, а site — это название сайта, указанное при регистрации.

Следует отметить, что при создании API требуется авторизоваться. Это можно сделать несколькими разными способами, которые я не буду описывать в этой статье. Для своего сервиса я выбрал oAuth, т. к. уже использовал его при работе с сервисами Google. Как оказалось, реализацию oAuth от Яндекса использовать существенно проще, чем версию его заокеанского соперника.

Итак, создадим для пользователя интерфейс выбора счетчика и периода, с которым мы будем сравнивать наши данные. На питоне код для запроса счётчиков будет выглядеть так:

class FetchCounters(webapp.RequestHandler):
    def post(self):
        token = cgi.escape(self.request.get('token'))
        counters = memcache.get(token)
        if counters is None:
            fetch_url = 'api-metrika.yandex.ru/counters.json?oauth_token=' + token
            result = urlfetch.fetch(url=fetch_url, deadline=3600)
            if result.status_code == 200:
                counters = json.loads(result.content)["counters"]
                memcache.add(token, counters, 3600# TTL 3600 __seconds__
            else:
                counters = 'Oops, looks like you don\'t have permission to access counters'
        self.response.out.write(json.dumps(counters))


Поскольку данный сервис не предназначен для продакшна, сохраним для пользовательского токена список счетчиков в memcache, чтобы не дергать сервер лишний раз. В реальности этого делать на платформе Google AppEngine, вероятно, не стоит — размер memcache относительно небольшой.

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



Далее, нам нужно выбрать подходящий отчёт из доступного списка. В API Метрики есть следующие группы отчетов:
  • Трафик
  • Источники
  • Содержание
  • География
  • Демография
  • Компьютеры

Для построения графика нужно знать число посещений в каждый из дней рассматриваемого периода, поэтому нам нужна группа отчетов “трафик”, а в ней отчет “посещаемость”. Чтобы получить необходимые данные сформируем запрос следующего вида:
http://api-metrika.yandex.ru/stat/traffic/summary.json?id=XXXXXX&date1=YYYYMMDD&date2=YYYYMMDD&oauth_token=XXXXXX

В качестве id выступает ID выбранного пользователем счетчика, date1 и date2 — даты в указанном формате. Любой запрос к API метрики можно проверить прямо в браузере, поэтому вы можете просто взять id своего счетчика и подставить его в эту ссылку. Если вы залогинены в сервисах Яндекса, oAuth токен можно опустить.

В ответ метрика вернет отчет, в котором содержится много разной лишней информации, нам требуется только дата («date») и число посещений («visits»):

data1 = map(lambda x: { "date"self.format_date(x["date"]), "visits": x["visits"] }, json.loads(res1.content)["data"])


Далее, сравним выбранный пользователем период с аналогичным по числу дней предыдущим периодом (например, 1.06-7.06 будет сравниваться с 24.05-31.05). Для этого сначала вычислим длину рассматриваемого периода во времени:

period = [datetime.strptime(cgi.escape(self.request.get('date_1')), "%Y-%m-%d"), datetime.strptime(cgi.escape(self.request.get('date_2')), "%Y-%m-%d")]
rng = period[1- period[0+ timedelta(1)


А затем вычтем длину из конечных точек нашего периода:

res2 = self.fetch_data(map(lambda x: x - rng, period))
if not res2:
    return
data2 = map(lambda x: { "visits": x["visits"] }, json.loads(res2.content)["data"])


В результате для каждой даты из пользовательского периода у нас будет число визитов в этот день и N дней назад и на основе этих данных уже можно строить график. Я для построения графиков использовал Google Charts, потому что с ними просто работать, а результат выглядит довольно красиво. График сравнения выглядит так:



Теперь, когда у нас есть данные по дням и визитам, почему бы нам не рассчитать отклонение от среднего в каждый из дней. Если представить эту информацию в виде гистограммы, её будет проще воспринимать, чем, если вглядываться в построенный график.

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



Итак, теперь у нас есть диаграммы для сравнения трафика с прошлым, но чтобы сделать наш сервис по-настоящему полезным, надо туда добавить что-то ещё.

Очень часто при оценке сайта приходится сравнивать, как изменилась популярность страниц. Например, то, что в этом месяце хорошо идут телескопы на подставке Добсона не значит, что они также хорошо продавались в прошлом. Попробуем добавить отчёт, в котором можно будет просто и быстро увидеть изменения в посещаемости страниц.

Для этого мы воспользуемся типом отчетов «содержание», а в нём отчетом «Популярное». В этом отчете содержится информация о числе входов, выходов и просмотров. Получить данные отчета можно перейдя по ссылке http://api-metrika.yandex.ru/stat/content/popular.json?id=XXXXXX&date1=YYYYMMDD&date2=YYYYMMDD&oauth_token=XXXXXX&per_page=20.

Обратите внимание, что на этот раз в ссылке появился новый параметр «per_page». Это необязательный параметр, который указывает API Метрики, сколько записей должно быть в ответе сервера. По умолчанию сервер всегда отдаёт 100 записей, но в данном случае для нас это избыточное значение.

В остальном механизмы получения данных предельно похожи

res1 = self.fetch_data(period, 20)
if not res1:
    return 
data1 = json.loads(res1.content)["data"]
        
res2 = self.fetch_data(map(lambda x: x - rng, period))
if not res2:
    return
data2 = make_url_tuple(json.loads(res2.content)["data"])


В итоге наш сервис будет выглядеть следующим образом:



Благодаря тому, что в правом столбце показывается, как изменилась позиция в сравнении с прошлым периодом, очень легко понять динамику популярности страниц.

Appendix


Поиграться со сделанным сервисом можно по адресу http://metrika-api.appspot.com
Исходный код доступен тут: https://github.com/sakudayo/Hello-Metrics
Документация по API метрики вывешена Яндексом по URL: http://api.yandex.ru/metrika/doc/ref/concepts/About.xml
Документация по Google Charts: http://code.google.com/intl/ru-RU/apis/chart/
Tags:
Hubs:
+50
Comments 11
Comments Comments 11

Articles

Information

Website
www.icontext.ru
Registered
Founded
Employees
51–100 employees
Location
Россия