Pull to refresh

Статистика для пользователей с использованием Piwik

Reading time4 min
Views11K
После того как мы вынесли наших пользователей на поддомены, нам захотелось иметь подробную статистику по каждому поддомену в отдельности, а также иметь возможность предоставлять эту статистику пользователю. Конечно, можно вручную подключать все поддомены к Google Analytics/Я.Метрика, но когда поддоменов становится достаточно много эта задача начинает выглядеть излишне сложной.

Захотелось какого-то автоматизированного решения, и оно было найдено в виде системы статистики с открытым исходным кодом Piwik. Эту систему можно установить на свой сервер, добавить в нее ваш сайт и пользоваться. Она предоставляет функционал, в основном аналогичный GA и Я.Метрика, + имеется возможность написания собственных плагинов (например для себя я разработал виджет «вчера-сегодня-прогноз», аналогичный по функционалу такому же блоку из яндекс.метрики).

Сначала для тестов система вела статистику по 1 домену и 1 поддомену, и справлялась с этим вполне успешно, полностью заменив для меня Я.метрику и GA. Соответсвенно было принято решение использовать Piwik API для реализации автоматического подключения статистики к пользовательским поддоменам. Требовалось выполнить следующее:
  1. Создать пользователя в системе Piwik
  2. Создать сайт в пивике
  3. Выдать пользователю права для просмотра статистики по сайту
  4. Получить id сайта для установки счетчика


Немного расскажу про Piwik API. Работает оно таким образом: весь Piwik состоит из модулей, и некоторые модули предоставляют API функции. Любой разработчик может написать модуль и реализовать в нем какую-либо API функцию, которую затем можно будет вызвать.
Вызов функций API проще всего реализовать запросом к определенному адресу, например так:
example.com/piwik/index.php?module=API&method=UsersManager.getUsersLogin&format=PHP&prettyDisplay=true&token_auth=14e1b600b1fd579f47433b88e8d85291
В данной строке example.com/piwik/index.php это путь к нашему установленному пивику, method=UsersManager.getUsersLogin это модуль и функция, которую мы вызываем, format=PHP означает что нам необходимо получить данные в виде сериализованного массива для использования в PHP, prettyDisplay=true это параметр, который принимает API функция и token_auth это наш токен, получить который мы можем в нашем пивике на странице управления пользователями или на странице со списком API функций.

Соответственно самый простой способ обратиться к Piwik API из PHP выглядит примерно так:
        $url = 'http://example.com/piwik/index.php?module=API&method=UsersManager.getUsersLogin&format=PHP&prettyDisplay=true&token_auth=14e1b600b1fd579f47433b88e8d85291'
        $tmp = file_get_contents($url);
        $response = unserialize($tmp); 

В итоге получим массив $response со всеми данными, которые нам вернул Piwik.

Вернемся теперь к нашей задаче с пользовательской статистикой. Для всех наших задач в Piwik API имеются соответствующие функции:
UsersManager.addUser для создания нового пользователя, принимает в качестве параметров логин, пароль и e-mail пользователя
SitesManager.addSite для создания сайта, принимает в виде параметров название и url сайта, возвращает id сайта в системе
UsersManager.setUserAccess для выдачи прав, принимает в виде параметров логин пользователя, id сайта и права доступа (no-access/view/admin)

Выполнять вручную file_get_contents и unserialize для каждого запроса не хотелось, поэтому написал небольшой класс-обертку для Piwik API, в которой реализовал методы создания пользователя/сайта и выдачи прав.
<?php
Class Piwik_api {
    private $sAuthToken;
    private $sPiwikUrl;
    
    function __construct($sAuthToken, $sPiwikUrl) {
        $this->sPiwikUrl = $sPiwikUrl;
        $this->sAuthToken = $sAuthToken;
    }
    
    /**
    * Запрос к Piwik API
    * 
    */
    function execute($sMethodName, $arData, $sFormat = "PHP") {
        $url = $this->sPiwikUrl;
        $url .= "?module=API&method=" . $sMethodName;
        $url .= '&'.http_build_query($arData);
        $url .= "&format=$sFormat";
        $url .= "&token_auth=" . $this->sAuthToken;
        $tmp = file_get_contents($url);
        $response = unserialize($tmp);        
        
        return $response;
    }
    
    /**
    * Добавление пользователя
    * 
    */
    function addUser($sUserName, $sUserPassword, $sUserEmail) {
        
        return $this->execute('UsersManager.addUser', array("userLogin"    => $sUserName,
                                                            "password"     => $sUserPassword,
                                                            "email"        => $sUserEmail
                                                                 ));
    }
    
    /**
    * Добавление сайта
    * 
    */   
    function addSite($sSiteName, $sUrl) {
        
        return $this->execute('SitesManager.addSite', array("siteName"    => $sSiteName,
                                                            "urls"        => $sUrl
                                                            ));
    }

    /**
    * Установка прав пользователя
    * 
    */
    function setUserAccess($sUserLogin, $sAccess, $iSiteId) {
        
        return $this->execute('UsersManager.setUserAccess', array("userLogin"    => $sUserLogin,
                                                            "access"       => $sAccess,
                                                            "idSites"      => $iSiteId
                                                            ));
    }
}

Метод addSite возвращает число — это id сайта в системе пивик.

Соответственно, с использованием данного класса исходная задача решается тривиально: просто одновременно с генерацией пользовательского поддомена создаем пользователя в системе Piwik, создаем сайт и выдаем права, а затем пользователю уже выдаем ссылку на Piwik и его логин и пароль чтобы просматривать статистику. Примерно так:
                    $oPiwikApi = new Piwik_api(PIWIK_AUTH_TOKEN, PIWIK_URL);
                    $oPiwikApi->addUser($sLogin, $sPassword, $sEmail);                    
                    $iPiwikSiteId = $oPiwikApi->addSite($sSiteName, $sUrl);
                    $oPiwikApi->setUserAccess($sLogin, "view", $iPiwikSiteId);


Тут может встать вопрос доверия к статистике — для совсем недоверчивых пользователей мы оставили возможность вручную подключать GA и Я.метрику, а Piwik сделали системой для всех по-умолчанию.

После всех этих манипуляций пользователи получили статистику для своих поддоменов, полностью аналогичную по функционалу системам GA/Я.метрика, включая всю историю переходов, посетителей и т.д, и каждый пользователь видит статистику только по своему домену.

UPD:
Обзорная статья про сам пивик уже есть на хабре, данная статья скорее призвана показать насколько просто и удобно с ним работать. Кстати, сейчас обнаружил что моя проблема обсуждалась в комментариях к той статье.

Метод execute переписан с использованием http_build_query.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 34: ↑29 and ↓5+24
Comments11

Articles