Получение данных из Я. Метрики по API

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

Получение данных из Я. Метрики через API

Статья поделена на 4 неравномерных блока:

  1. Алгоритм получения токена
  2. Получение базовых показателей по API
  3. Получение данных контентной аналитики
  4. Отправка данных на почту

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

Процесс получения токена для работы с АПИ Яндекс Метрики, в сравнении, например, с процессом получения токена Google Ads, достаточно простой и не должен вызывать больших сложностей:

Перейдите на https://oauth.yandex.ru/client/new и заполните следующие поля:

  • Название приложения (может быть любым);
  • Отметить галкой «Веб-сервисы», если не планируется иное;
  • Подставить в «Callback URL» URL для разработки (делается также галкой)
  • Сохранить

Пример настроек вы можете увидеть на скрине:

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

Далее нужно вставить в браузер (будучи залогиненным с той почты яндекса, с которой создали приложение) ссылку вида: https://oauth.yandex.ru/authorize?response_type=token&client_id=xxxxxx. ClientID нужно, само собой, подставить от своего приложения. Найти его можно на этом экране:

ClientID в АПИ Яндекс Метрики

Приложение предложит авторизоваться и если всё ок, то вы должны увидеть экран с вашим токеном для вызова Метрики по API:

API токен Я. Метрика

Буквально, белый экран с номером вашего токена. Сохраните его в надежном месте. Это обязательный атрибут для вызова любого API-метода Метрики.

Получение базовых показателей по API

Итак, все доступы получены, можно приступить к отправке запроса и получению данных. Отдельно это не было оговорено, но приведенный пример написан на php. Первой строкой в вашем скрипте должно быть объявление переменной, содержащей токен:

$token = 'xxxx' //Тут следует подставить свой токен;

Далее мы указываем параметры запроса:

$params = array(
'ids' => 'xxx' //Номер счетчика,
'metrics' => 'ym:s:visits,ym:s:users,ym:s:percentNewVisitors,ym:s:pageviews,ym:s:bounceRate,ym:s:pageDepth,ym:s:avgVisitDurationSeconds' //Запрашиваемые показатели,
'date1' => '7daysAgo', //yesterday - вчера, 7daysAgo - неделя, 30daysAgo - месяц, 365daysAgo - год
'date2' => 'yesterday',
'accuracy' => 'full' //Семплинг,
);

В «metrics» идет перечисление всех необходимых метрик, которые вы хотите получить. Подробное описание полей можно найти в API документации Яндекс Метрики.

Отправляем запрос и выводим на экран результат:

$ch = curl_init('https://api-metrika.yandex.net/stat/v1/data/bytime?' . urldecode(http_build_query($params)));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_decode($res, true);


echo '<h2>Общие показатели:</h2><br>';

echo 'Визиты: '.$res['totals'][0][0].'<br>';

echo 'Посетители: '.$res['totals'][1][0].'<br>';

echo 'Доля новых посетителей: '.round($res['totals'][2][0],2).'%<br>';


echo 'Просмотры страниц: '.$res['totals'][3][0].'<br>';


echo 'Показатель отказов: '.round($res['totals'][4][0],2).'%<br>';


echo 'Глубина просмотра: '.round($res['totals'][5][0],2).' страниц<br>';


echo 'Время на сайте: '.round($res['totals'][6][0],2).' сек<br><br><br>';

Результат можно будет увидеть на экране по отработке скрипта.

Получение данных контентной аналитики

Продолжая наш пример, рассмотрим получение такого специфического отчета, как данные эффективности контентной аналитики по материалам. Предполагается, что токен уже объявлен в начале php-скрипта.

Указываем параметры запроса:

$params_content = array (
'ids' => 'xxx',
'dimensions' => 'ym:s:publisherArticle',
'metrics' => 'ym:s:publisherviews,ym:s:publisherusers,ym:s:avgPublisherArticleInvolvedTimeSeconds,ym:s:publisherArticleRecirculation,ym:s:publisherArticleFullReadShare',
'date1' => '7daysAgo', //yesterday - вчера, 7daysAgo - неделя, 30daysAgo - месяц, 365daysAgo - год
'date2' => 'yesterday',
'sort' => '-ym:s:publisherviews',
'accuracy' => 'full',
'limit' => 10,
);

Обратите внимание, что, в сравнении с предыдущим примером, добавилось несколько дополнительных полей.

  • limit — это ограничение на кол-во возвращаемых значений. В примере возвращается Топ-10 записей;
  • dimensions — группировка результатов. В данном случае — по заголовку публикации;
  • Sort — сортировка результатов;

Отправка запроса и вывод на экран:

$ch_content = curl_init('https://api-metrika.yandex.net/stat/v1/data?' . urldecode(http_build_query($params_content)));
curl_setopt($ch_content, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch_content, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch_content, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch_content, CURLOPT_HEADER, false);
$res_content = curl_exec($ch_content);
curl_close($ch_content);
$res_content = json_decode($res_content, true);


echo '<h2>Контентная аналитика:</h2><br>';

echo '<table>';
echo '<thead style="font-weight: bold">';
echo '<tr>';
echo '<td><b>Публикация</b></td>';
echo '<td><b>Кол-во просмотров</b></td>';
echo '<td><b>Кол-во посетителей</b></td>';
echo '<td><b>Время на материал</b></td>';
echo '<td><b>Рециркуляция, %</b></td>';
echo '<td><b>Доля просмотров материалов с дочтением, %</b></td>';
echo '</tr>';
echo '</thead>';
echo '<tbody>';
foreach ($res_content['data'] as $res_value) {
echo '<tr>';
echo '<td>'.$res_value['dimensions'][0]['title'].'</td>';
echo '<td align="center">'.$res_value['metrics'][0].'</td>';
echo '<td align="center">'.$res_value['metrics'][1].'</td>';
echo '<td align="center">'.round($res_value['metrics'][2],2).'</td>';
echo '<td align="center">'.round($res_value['metrics'][3],2).'</td>';
echo '<td align="center">'.round($res_value['metrics'][4],2).'</td>';
echo '</tr>';
}

Результат выполнения скрипта также можно увидеть по отработке скрипта.

Отправка данных на почту

Дело за малым: Осталось убрать вывод результатов на экран, собрать результаты, полученные из Метрики, в одну переменную и отправить на почту с помощью php-функции mail(). Кажется, что подробное рассмотрение того, как мы заменяем в нашем примере echo на запись в переменную не требуется, отметим лишь только то, что $message — это переменная тела сообщения, куда записывается весь результат вызова АПИ, $to — почта, на которую отправляется отчет, $headers — заголовки, необходимые для корректного отображения письма на стороне получателя.

Полный код нашего скрипта:

<?
$token = 'ххх';
$message = '';
$params = array(
'ids' => 'ххх' //Номер счетчика,
'metrics' => 'ym:s:visits,ym:s:users,ym:s:percentNewVisitors,ym:s:pageviews,ym:s:bounceRate,ym:s:pageDepth,ym:s:avgVisitDurationSeconds' //Запрашиваемые показатели,
'date1' => '7daysAgo', //yesterday - вчера, 7daysAgo - неделя, 30daysAgo - месяц, 365daysAgo - год
'date2' => 'yesterday',
'accuracy' => 'full' //Семплинг,
);

$ch = curl_init('https://api-metrika.yandex.net/stat/v1/data/bytime?' . urldecode(http_build_query($params)));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_decode($res, true);


$message .= '<h2>Общие показатели:</h2><br>';

$message .= 'Визиты: '.$res['totals'][0][0].'<br>';

$message .= 'Посетители: '.$res['totals'][1][0].'<br>';

$message .= 'Доля новых посетителей: '.round($res['totals'][2][0],2).'%<br>';


$message .= 'Просмотры страниц: '.$res['totals'][3][0].'<br>';


$message .= 'Показатель отказов: '.round($res['totals'][4][0],2).'%<br>';


$message .= 'Глубина просмотра: '.round($res['totals'][5][0],2).' страниц<br>';


$message .= 'Время на сайте: '.round($res['totals'][6][0],2).' сек<br><br><br>';


$params_content = array (
'ids' => 'ххх',
'dimensions' => 'ym:s:publisherArticle',
'metrics' => 'ym:s:publisherviews,ym:s:publisherusers,ym:s:avgPublisherArticleInvolvedTimeSeconds,ym:s:publisherArticleRecirculation,ym:s:publisherArticleFullReadShare',
'date1' => '7daysAgo', //yesterday - вчера, 7daysAgo - неделя, 30daysAgo - месяц, 365daysAgo - год
'date2' => 'yesterday',
'sort' => '-ym:s:publisherviews',
'accuracy' => 'full',
'limit' => 10,
);
$ch_content = curl_init('https://api-metrika.yandex.net/stat/v1/data?' . urldecode(http_build_query($params_content)));
curl_setopt($ch_content, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch_content, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch_content, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch_content, CURLOPT_HEADER, false);
$res_content = curl_exec($ch_content);
curl_close($ch_content);
$res_content = json_decode($res_content, true);


$message .= '<h2>Контентная аналитика:</h2><br>';

$message .= '<table>';
$message .= '<thead style="font-weight: bold">';
$message .= '<tr>';
$message .= '<td><b>Публикация</b></td>';
$message .= '<td><b>Кол-во просмотров</b></td>';
$message .= '<td><b>Кол-во посетителей</b></td>';
$message .= '<td><b>Время на материал</b></td>';
$message .= '<td><b>Рециркуляция, %</b></td>';
$message .= '<td><b>Доля просмотров материалов с дочтением, %</b></td>';
$message .= '</tr>';
$message .= '</thead>';
$message .= '<tbody>';
foreach ($res_content['data'] as $res_value) {
$message .= '<tr>';
$message .= '<td>'.$res_value['dimensions'][0]['title'].'</td>';
$message .= '<td align="center">'.$res_value['metrics'][0].'</td>';
$message .= '<td align="center">'.$res_value['metrics'][1].'</td>';
$message .= '<td align="center">'.round($res_value['metrics'][2],2).'</td>';
$message .= '<td align="center">'.round($res_value['metrics'][3],2).'</td>';
$message .= '<td align="center">'.round($res_value['metrics'][4],2).'</td>';
$message .= '</tr>';
}
$message .= '</tbody>';
$message .= '</table>';
$to = 'test@mail.ru';
$headers="From: Test.ru <admin@test.ru>\nReply-to:info@test.ru\nContent-Type: text/html; charset=\"utf-8\"\n";

mail($to, 'Отчет по сайту за прошлую неделю', $message, $headers);

На почту будет приходить примерно такое письмо:

Результат работы скрипта

Осталось только повесить скрипт на CRON, но тут алгоритм зависит от хостинга.

В заключение стоит сказать, что несмотря на то, что в рассмотренном примере осуществляется получение данных, связанных с контентной аналитикой, запрос легко можно адаптировать под ваши нужды, в том числе и для получения данных по показателям электронной коммерции, так как общий алгоритм отправки запроса и обработки ответа от API — един, меняются, в основном, метрики и группировки.