Скрипт получения данных с Я.Метрики

2014-03-13
5.0 / 5 (4 голоса)

Вашему внимаю предоставляется скрипт для получения количества визитов по всем счетчикам, что у вас есть в яндекс метрике.

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

18.03.2015 - Апдейт скрипта. Добавлена документация, изменился вызов функции, а также теперь можно поставить данный скрипт на крон

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

Вначале скрипта обязательно укажите ваш токен, время кеширования, а также место хранения файла кеша.

Получение OAuth token:

$yandex_get_token_url = "https://oauth.yandex.ru/token";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $yandex_get_token_url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'grant_type=password&username=ЛОГИН_УЧЕТНОЙ_
ЗАПИСИ_ЯНДЕКСА&password=ПАРОЛЬ_ОТ_УЧЕТНОЙ_
ЗАПИСИ_ЯНДЕКСА&client_id=ID_ПРИЛОЖЕНИЯ&client_secret=ПАРОЛЬ_ПРИЛОЖЕНИЯ');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$token = curl_exec($ch);
curl_close($ch);
 
echo $token;

Либо вы можете прочитать в статье Отправка контента в Яндекс "Оригинальные тексты" из компонента K2 как я там получал токен (с принскринами)

Или воспользоваться моим скриптом

Пример вызова:

require_once $_SERVER['DOCUMENT_ROOT'].'/yandex.metrika.php';
$YandexMetrika = new YandexMetrika(TRUE); // TRUE - будет брать данные только из кеша, даже если они устарели
echo "Общее количество посещений за сутки: ".YandexMetrika->Result['TotalVisitsDay']." <br/>Общее количество посещений за текущий месяц: ".$YandexMetrika->Result['TotalVisitsMonth'];

Пример файла кеша представлен ниже, колонки по порядку слева на право: время последнего запроса (php функция time()),кол-во посещений за сутки, кол-во посещений за текущий месяц.

1394727601|25906|415263

Ну и сам скрипт (скачать можно внизу страницы):

<?php

/**
 * Class YandexMetrika
 * Данный класс необходим для получения статистики за сутки|месяц
 */
class YandexMetrika
{

	/**
	 * @var string
	 */
	private $_token = "c32ccdf8252c44e23452343275854ec";
	/**
	 * @var int
	 */
	private $_CacheTime = 3600; // 1 час
	/**
	 * Путь к файлу кеша
	 * @var string
	 */
	private $_CacheFile = '';
	/**
	 * @var array
	 */
	private $_CounterList = array();
	/**
	 * @var int
	 */
	private $_TotalVisitsDay = 0;
	/**
	 * @var int
	 */
	private $_TotalVisitsMonth = 0;

	/**
	 * @var array
	 */
	public $Result = array();


	/**
	 * Constructor
	 *
	 * @param bool $use_only_cache
	 */
	function __construct($use_only_cache = FALSE)
	{
		$this->_CacheFile = JPATH_BASE . DS .'cache'. DS .'yandex.metrika.cache';

		if (!$this->_GetCache($use_only_cache)) {
			if ($this->_GetCounterList()) {
				$this->_GetCount(); //получаем сумму посещений за сутки и за месяц по каждому счетчику
				$this->_SetCache(); //устанавливаем кеш
			}
		}
		$this->Result = array(
			"TotalVisitsDay" => number_format($this->_TotalVisitsDay, 0, '.', ' '),
			"TotalVisitsMonth" => number_format($this->_TotalVisitsMonth, 0, '.', ' ')
		);
	}

	/**
	 * Получение массива счетчиков, со статусом "ОК"
	 *
	 * @return bool
	 */
	private function _GetCounterList()
	{
		$url = "http://api-metrika.yandex.ru/counters?oauth_token=" . $this->_token;
		$results_page = file_get_contents($url, false);
		if ($results_page) {
			$CounterList = new SimpleXMLElement($results_page);
			foreach ($CounterList->children() as $CounterListChildren) {
				foreach ($CounterListChildren->counter as $AllCounter) {
					$site = (string)$AllCounter->site;
					$code_status = (string)$AllCounter->code_status;
					$id = (int)$AllCounter->id;
					if ($code_status == "CS_OK") {
						$this->_CounterList[$site] = array(
							"id" => $id,
							"site" => $site
						);
					}
				}
			}
		} else {
			return FALSE;
		}
		return TRUE;
	}

	/**
	 * Получение статистики посещений за сегодня
	 * Получение статистики посещений за текущий месяц по каждому сайту
	 */
	private function _GetCount()
	{
		$start_date = date("Ym01");
		$now_date = date("Ymd");
		foreach ($this->_CounterList as $CounterList) {
			$url = "http://api-metrika.yandex.ru/stat/traffic/summary?id=" . $CounterList['id'] . "&date1=" . $start_date . "&date2=" . $now_date . "&group=day&oauth_token=" . $this->_token;
			$results_page = file_get_contents($url, false);
			$GetSumm = new SimpleXMLElement($results_page);
			foreach ($GetSumm->data as $GetData) {
				foreach ($GetData as $GetRow) {
					$date = (int)$GetRow->date;
					if ($date == $now_date) {
						$TotalVisitsDay = (int)$GetRow->visits;
						$this->_TotalVisitsDay = $this->_TotalVisitsDay + $TotalVisitsDay;
					}
				}
			}
			$TotalVisitsMonth = (int)$GetSumm->totals->visits;
			$this->_TotalVisitsMonth = $this->_TotalVisitsMonth + $TotalVisitsMonth;
		}
	}

	/**
	 * Получение данных из файла
	 *
	 * @param $use_only_cache
	 * @return bool
	 */
	private function _GetCache($use_only_cache)
	{
		if (file_exists($this->_CacheFile)) {
			$Cache = file_get_contents($this->_CacheFile);
			if (!empty($Cache)) {
				$Cache = explode("|", $Cache);
				$CacheTimeExpired = $Cache[0] + $this->_CacheTime;
				if ($use_only_cache || $CacheTimeExpired > time() || ($use_only_cache && $CacheTimeExpired > time())) {
					$this->_TotalVisitsDay = $Cache[1];
					$this->_TotalVisitsMonth = $Cache[2];
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * Установка данных в файл
	 *
	 * @return bool
	 */
	private function _SetCache()
	{
		$Cache = time() . '|' . $this->_TotalVisitsDay . '|' . $this->_TotalVisitsMonth;
		if (!file_put_contents($this->_CacheFile, $Cache, LOCK_EX)) {
			echo "Не возможно записать кеш яндекс метрики";
			return false;
		}
		return true;
	}

}

Пример кода крона:

require_once 'yandex.metrika.php';
$YandexMetrika = new YandexMetrika();
print_r($YandexMetrika->Result);

 

 

Прочитано 3187 раз Последнее изменение 2015-10-17

1 Комментарий

  • Мурад Саркаров
    Мурад Саркаров 2015-11-22

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

Оставить комментарий

Все поля отмеченные (*) обязательны для заполнения