Яндекс Метрика API: Счётчик Просмотров

В данном руководстве рассмотрим работу с API Метрики от Яндекса. Создадим счётчик просмотров страниц (статей).

Первое и самое важное, без чего невозможно продолжать - у вас должен быть подключен счётчик Яндекс.Метрики.

Далее порядок действий следующий:

  1. получить OAuth-токен;
  2. сформировать запрос для получения данных;
    организовать сохранение полученных данных на вашем сервере;
  3. настроить CRON (планировщик) для выполнения php-файла, который сохраняет (обновляет) данные метрики;
  4. вывести количество просмотров на страницу.

1. Получаем OAuth-токен

Чтобы получить OAuth-токен перейдите на страницу создания приложения

Регистрация приложения API Метрики

Обязательным для заполнения является поле Название приложения* - можете использовать любое.

Далее в секции Платформы выбираете чекбокс Веб-сервисы и нажмите на ссылку Подставить URL для разработки

Веб-сервисы API метрики

Затем в секции Доступы* нажимаем на Яндекс.Метрика и выбираем чекбокс Получение статистики, чтение параметров своих и доверенных счётчиков

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

Нажимаем Создать приложение

Создение приложения API Метрики

На странице увидите следующие данные:

  1. ID: - 1e9c7ch29d533fa5abc9f04b6f6g71b3
  2. Пароль: - 3927fad02b854da9ka40f2d535f94e0u
  3. Callback URL - https://oauth.yandex.ru/verification_code

Теперь необходимо в адресной строке ввести следующий URL и вставить ваш ID

https://oauth.yandex.ru/authorize?response_type=token&client_id=ваш_ID

После отправки данного запроса, нужно разрешить доступ приложению к вашим данным

Разрешение на получение статистики Яндекс Метрики

На странице появится ваш OAuth-токен

2. Формирование запроса и сохранение полученных данных

Нам необходимо сформировать запрос для получения данных от Яндекс.Метрики и сохранить пришедшие данные (JSON) на сервере.

Создадим файл metric-api.php

<?php

$options = array(
    'http' => array(
        'method' => 'GET',
        'header' => array(
            'Content-Type: application/x-yametrika+json',
            "Authorization: OAuth ваш_токен"
        )
    )
);

$context = stream_context_create($options);

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

$parameters = [
    "ids"               => "",                            // номер счётчика метрики

    'metrics'           => 'ym:pv:pageviews,ym:pv:users', // данные по: страницам и количеству просмотров

    'dimensions'        => 'ym:pv:URLHash',               // группировка по URLHash

    "date1"             => "2018-09-01",                  // с какой даты получить отчёт

    'accuracy'          => 'full',                        // точная статистика (без округления)

    'limit'             => '100000',                      // максимальный лимит данных

    'proposed_accuracy' => 'false'                        // без округления данных

];

array_walk( $parameters, create_function('&$key, $value', '$key="$value=$key";') );
$parameters = implode($parameters, '&');

$url = $url . '?&' . $parameters;

$metrikaRequest = file_get_contents($url, false, $context);

if ( !empty($metrikaRequest) ) {
    file_put_contents($_SERVER['DOCUMENT_ROOT']."/metrics.json", $metrikaRequest);
};

Обратите внимание на слова, выделенные красным:

Authorization - после слова 'OAuth' введите токен, полученный в предыдущем пункте;
ids - номер счетчика (можно посмотреть здесь);
date1 - с какой даты получать отчёт;
file_put_contents - куда сохранять полученный JSON-файл

Отлично! Мы создали php-файл, который будет получать и сохранять данные API Метрики на нашем сервере.

3. Настройка планировщика

Теперь нам необходимо настроить CRON (планировщик), чтобы наш файл metric-api.php отрабатывал (выполнялся) спустя определённое время, например, каждый час. Т.е. каждый час будет выполняться запрос на получение данных Яндекс.Метрики и обновлять файл, вносить свежие данные в metrics.json

В панели управления хостингом необходимо перейти во вкладку Планировщик

Планировщик на хостинге

Ввести первую или вторую команду и выбрать периодичность исполнения файла

php полный_путь_до_файла/metric-api.php

Или

wget -O- ваш_домен/metric-api.php

4. Создание счётчика просмотров страницы

Создадим счётчик просмотров страницы с помощью JavaScript. Как вы помните, мы получаем данные по:

  1. страницам (url) - ym:pv:pageviews и
  2. просмотрам - ym:pv:users

Используя регулярные выражения, будем соотносить адрес текущей страницы и данные Яндекс метрики. При совпадении url текущей страницы и url метрики будем выводить количество просмотров этой страницы.

// Yandex metrika API

(function() {

setTimeout(function() {

    // определяем текущий URL без домена и http

    const locationUrl = window.location.pathname;

    // формируем XMLHttpRequest

    const xmlhttpMetrika = new XMLHttpRequest();

    xmlhttpMetrika.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {

            // переводим данные из JSON в вид ассоциативного массива

            let metrikaData = JSON.parse(this.responseText)['data'],
                summCountPeople = 0;

            // с помощью регулярного сравниваем данные Метрики и текущего URL

            if (locationUrl.slice(-1) == '/') {
                const regExpForMetrika = new RegExp('(\\/\\/домен\\.ru\\'+locationUrl.substring(0,locationUrl.length-1)+'\\/)($|\\?.*)');
            } else {
                const regExpForMetrika = new RegExp('(\\/\\/домен\\.ru\\'+locationUrl+')($|\\?.*)');
            }
            metrikaData.forEach(function(elem) {
                if ( regExpForMetrika.test(elem['dimensions'][0]['name']) ) {
                    summCountPeople += elem['metrics'][0];
                }
            })
            const countElem         = document.createElement('span'); // создаём новый элемент

                countElem.className = 'countPeople'; // присваиваем элементу класс

                countElem.innerHTML = '<i class="fa fa-eye"></i>'+summCountPeople;

            const view_counter      = document.getElementById('view_counter');

            if ( view_counter) { // если страница поста

                if (summCountPeople > 0) { // показываем счётчик, если количество просмотров > 0

                    view_counter.appendChild(countElem); // вставляем на страницу

                }
            }
        }
    };
    xmlhttpMetrika.open('GET', '/metrics.json', true);
    xmlhttpMetrika.send();

}, 1000);

})();

домен - замените на свой

Данный код выполняется с задержкой setTimeout в одну секунду, чтобы не замедлять скорость загрузки страницы. Можете изменить данное значение.

Николай
08/10/2019 10:37