Для извлечения статистических данных из Яндекс.Метрики необходимо воспользоваться специальным разделом 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 и понимает шорткоды.
Источники:
- https://denisyuk.by/found/api+%D1%8F%D0%BD%D0%B4%D0%B5%D0%BA%D1%81/
- https://cms3.ru/oauth-token-v-http-zagolovke/
- https://sebweo.com/ru/uroki-php-kak-poluchit-url-tekuschej-stranitsy/