Рисуем графики данных из API Метрики

Для извлечения статистических данных из Яндекс.Метрики необходимо воспользоваться специальным разделом API очётов. Сейчас актуальна версия v1. В качестве примеров, для получения статистики посещений всего сайта и конкретной страницы, мы выгрузим табличные данные в формате JSON, а затем преобразуем их и построим два линейных графика.

С 13 февраля 2019 года передача OAuth токена в HTTP параметрах URL не будет работать для Yandex Метрики. OAuth токен нужно передавать в HTTP заголовке. Опять давай гуглить. Нашел решение. Перепелил под себя.

Вот оно, может кому-нибудь пригодится:

<?php

function curl_file_get_contents($url){
    $authToken = 'XXXXXXXXXXXXXXXXXX';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-yametrika+json', 'Authorization: OAuth' . $authToken]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $obj = curl_exec($ch);
    curl_close($ch);
    return $obj;
}


$url = 'https://api-metrika.yandex.ru/stat/v1/data';

$params = [
    'ids'         => '00000000',
    'metrics'     => 'ym:s:visits,ym:s:pageviews,ym:s:users',
    'dimensions'  => 'ym:s:date',
    'date1'       => '30daysAgo',
    'date2'       => 'yesterday',
    'sort'        => 'ym:s:date',
];

$json = curl_file_get_contents($url . '?' . http_build_query($params));

$data = json_decode($json, true)['data'];

?>

XXXXXXXXXXXXXXXXXX — OAuth токен.
00000000 — Счетчик в метрике.
Ну и дальше можно работать с $data как душе угодно.

 

Яндекс.Метрика оперирует двумя базовыми сущностями: метрики (metrics) и группировки (dimensions). Метрики определяют числовые величины, которые могут быть рассчитаны на основе сессии или хита пользователя [количество посетителей, процент отказов, глубина просмотра, …]. Группировки предназначены для выборки данных по определённым признакам [страница входа, источник трафика, дата анализа, …].

Яндекс.Метрика работает отдельно с визитами (ym:s), где s — session, и хитами (ym:pv), где pv — pageview. В запросах к API эти характеристики нельзя использовать вместе в метриках и группировках. Список всех метрик и группировок можно посмотреть в документации.

Для детальных запросов существуют фильтры сегментации (filters). Они рассчитывают результат по отдельному сегменту данных. Например, когда нужно получить какие-либо данные только из поисковых систем или вытянуть статистику посещений по конкретной странице. С помощью параметров date1 и date2 можно задать отчётный период, а sort необходим для сортировки данных по признаку из dimensions. Небольшая шпаргалка ниже:

Параметр    Описание
——————————————————————————————————————————————————
ids         Номер счётчика.
oauth_token Токен авторизации.
metrics     Список метрик через запятую.
dimensions  Список группировок через запятую.
filters     Фильтры сегментации с условием.
date1       Дата начала периода выборки.
date2       Дата окончания периода выборки.
sort        Сортировка по метрикам и группировкам.

Для начала нужно зарегистрировать своё приложение на oauth.yandex.ru и получить oauth_token. В качестве ids выступает номер вашего счётчика (его можно узнать на главной странице Яндекс.Метрики). Параметры ids, oauth_token и metrics являются обязательными в простых запросах, но если применяется filters, то metrics и dimensions можно не указывать.

Как видите, в metrics и dimensions мы указали значения для визитов (ym:s). Это значит, что данные будут сформированы в рамках сессии по каждому пользователю. Если посетитель перезагрузит одну и туже страницу сто раз, то ym:s:pageviews не будет меняться. В случае работы с хитами (ym:pv), значение ym:pv:pageviews увеличилось бы на сто. Хиты собирают статистику в рамках каждого просмотра страницы.

Дату для отчётного периода можно указать в формате YYYY-MM-DD или её относительное значение: today, yesterday, 7daysAgo (номер дня можно заменить на свой). В результате Яндекс.Метрика вернула следующие данные в формате JSON:

{
  "query" : {
    "ids" : [ 14446750 ],
    "dimensions" : [ "ym:s:date" ],
    "metrics" : [ "ym:s:visits", "ym:s:pageviews", "ym:s:users" ],
    "sort" : [ "ym:s:date" ],
    "date1" : "2017-02-14",
    "date2" : "2017-02-20",
    "limit" : 100,
    "offset" : 1,
    "group" : "Week",
    "auto_group_size" : "1",
    "quantile" : "50",
    "attribution" : "Last",
    "currency" : "RUB"
  },
  "data" : [ {
    "dimensions" : [ {
      "name" : "2017-02-14"
    } ],
    "metrics" : [ 437.0, 800.0, 376.0 ]
  }, {
    "dimensions" : [ {
      "name" : "2017-02-15"
    } ],
    "metrics" : [ 390.0, 559.0, 322.0 ]
  }, {
    "dimensions" : [ {
      "name" : "2017-02-16"
    } ],
    "metrics" : [ 243.0, 370.0, 196.0 ]
  }, {
    "dimensions" : [ {
      "name" : "2017-02-17"
    } ],
    "metrics" : [ 168.0, 274.0, 131.0 ]
  }, {
    "dimensions" : [ {
      "name" : "2017-02-18"
    } ],
    "metrics" : [ 111.0, 145.0, 75.0 ]
  }, {
    "dimensions" : [ {
      "name" : "2017-02-19"
    } ],
    "metrics" : [ 121.0, 150.0, 87.0 ]
  }, {
    "dimensions" : [ {
      "name" : "2017-02-20"
    } ],
    "metrics" : [ 132.0, 251.0, 103.0 ]
  } ],
  "total_rows" : 7,
  "total_rows_rounded" : false,
  "sampled" : false,
  "sample_share" : 1.0,
  "sample_size" : 1602,
  "sample_space" : 1602,
  "data_lag" : 74,
  "totals" : [ 1602.0, 2549.0, 988.0 ],
  "min" : [ 111.0, 145.0, 75.0 ],
  "max" : [ 437.0, 800.0, 376.0 ]
}

Секция query содержит параметры запроса, но нас больше интересует data, в которой содержатся наши статистические данные. Секция data представляет собой массив, где итеративно заполнены поля dimensions и metrics теми данными, которые были указаны в запросе. В нашем случае, поле dimensions содержит name — это название группировки ym:s:date. Поле metrics — массив с числовыми данными: ym:s:visits, ym:s:pageviews и ym:s:users.

Для обработки общих статистических данных можно использовать такие секции как: totals, min и max (в некоторых отчётах удобно анализировать сразу обобщённую информацию). Чтобы вывести данные из секции data на экран, скормим их Highcharts и построим линейный график.

<?php
/////////////////////////////////////////////////////////
///// ТЕКУЩИЙ АДРЕС СТРАНИЦЫ, URL /////
/////////////////////////////////////////////////////////
$protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']), 'https') === FALSE ? 'http' : 'https';
$hostame     = $_SERVER['HTTP_HOST'];
$params   = $_SERVER['QUERY_STRING'];
$currentUrl = $protocol . '://' . $hostame . '/' . '?' . $params;
/////////////////////////////////////////////////////////
///// ПАРАМЕТРЫ GET-ЗАПРОСА ДЛЯ КОНКРЕТНОЙ СТРАНИЦЫ /////
/////////////////////////////////////////////////////////


 
function curl_file_get_contents($url){
    $authToken = 'AgAAAAAA5YrLAAZG4XoSOmgObUAil515Nn6_0X0';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-yametrika+json', 'Authorization: OAuth' . $authToken]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $obj = curl_exec($ch);
    curl_close($ch);
    return $obj;
}
 
 
$url = 'https://api-metrika.yandex.ru/stat/v1/data';
 
$params = [
    'ids'         => '49387165',
    'metrics'     => 'ym:s:visits,ym:s:pageviews,ym:s:users',
    'dimensions'  => 'ym:s:date',
    'filters'     => rawurldecode("ym:pv:URL=='$currentUrl'"),
    'date1'       => '30daysAgo',
    'date2'       => 'yesterday',
    'sort'        => 'ym:s:date',
];
 
$json = curl_file_get_contents($url . '?' . http_build_query($params));
 

/////////////////////////////////////////////////////////
///// ПОЛУЧИМ ДАННЫЕ В JSON И ПЕРЕВЕДЁМ ИХ В МАССИВ /////
/////////////////////////////////////////////////////////
$data = json_decode($json, true)['data'];

/////////////////////////////////////////////////////////////
///// ПРЕОБРАЗУЕМ ДАННЫЕ ДЛЯ ЛИНЕЙНОГО ГРАФИКА AMCHARTS /////
/////////////////////////////////////////////////////////////
$tmpdata = [];

foreach ($data as $item) {
    $tmpdata[] = [
        'category' => $item['dimensions'][0]['name'],
        'column-1' => $item['metrics'][0],
    ];
}

////////////////////////////////////
///// ВЕРНЁМ JSON ДЛЯ AMCHARTS /////
////////////////////////////////////
$dataProvider = json_encode($tmpdata);


///////////////////////////////////////////////////////
///// ВЫВЕДЕМ HTML-КОД И ПОСТРОИМ ГРАФИК AMCHARTS /////
///////////////////////////////////////////////////////
echo <<<HTML
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <script src="https://www.amcharts.com/lib/3/amcharts.js"></script>
  <script src="https://www.amcharts.com/lib/3/serial.js"></script>
  <script src="https://www.amcharts.com/lib/3/themes/patterns.js"></script>
  <script>
    AmCharts.makeChart("amcharts-container", {
      "type": "serial",
      "categoryField": "category",
      "startDuration": 1,
      "theme": "patterns",
      "categoryAxis": {
        "gridPosition": "start"
      },
      "graphs": [{
        "balloonText": "[[title]] за [[category]] — [[value]]",
        "bullet": "round",
        "title": "Просмотры",
        "id": "AmGraph-1",
        "type": "smoothedLine",
        "valueField": "column-1"
      }],
      "valueAxes": [{
        "title": "Количество"
      }],
      "titles": [{
        "text": "Просмотры этой страницы"
      }],
      "dataProvider": $dataProvider
    });
  </script>
</head>
<body>

  <div id="amcharts-container" style="max-width: 730px; height: 400px;"></div>
</body>
</html>
HTML;
//end

 

Для получения статистики конкретной страницы в Яндекс.Метрике нужно использовать filter. Вот так будет выглядеть запрос и построение графика на amCharts для просмотра главной страницы моего блога по хитам (ym:pv):

Обратите внимание, что значение filters мы обернули в функцию rawurldecode(). Это нужно делать, когда вы работаете со сложными фильтрами сегментации и кириллицей в запросах. Другие возможности фильтра доступны в документации: можно делать множественную выборку, использовать регулярные выражения, задействовать дополнительные операторы и др. В итоге мы получили график amCharts для статистики просмотров главной страницы по хитам:

Мы рассмотрели базовые возможности API Яндекс.Метрики, которые могут пригодится для построения отчётов посещаемости своего сайта. Здесь важно понять, что все запросы формируются на основе metrics и dimensions, а через filters вычленяются конкретные данные по сайту.

Для вставки PHP кода в виджет WordPress подходит плагин Enhanced Text Widge, который также позволяет обрабатывать HTML, JavaScript, CSS, Flash и  понимает шорткоды.

Источники:

  1. https://denisyuk.by/found/api+%D1%8F%D0%BD%D0%B4%D0%B5%D0%BA%D1%81/
  2. https://cms3.ru/oauth-token-v-http-zagolovke/
  3. https://sebweo.com/ru/uroki-php-kak-poluchit-url-tekuschej-stranitsy/

 

 

Довольны?
[Оценок: 0 средняя: 0]

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *