[siteStatistics] ip, referer и user-agent

В новой версии сделаны небольшие, но приятные доработки. Начнём по порядку.





Поля ip, referer и user-agent

В таблице пользователей появились эти три поля. Лично мне особенно интересно поле referer. Видно откуда человек пришёл. Остальные два поля тоже пригодятся. По ним, например, можно вычислить дубли. Иногда, почему-то они появляются. У меня на сайте, если открыть главную страницу в хроме, то статистика почему-то задваивается. В других браузерах такой странности не наблюдается.
Реферер и юзер-агент на всегда полностью помещаются в поле. Чтобы не мучиться с размерами колонок посмотреть их можно по двойному клику.

Другие доработки

Ещё для фильтрации пользователей добавлено 2 системные настройки:
  • stat.not_allowed_ip — список ip адресов через запятую, для которых статистика учитываться не будет.
  • stat.not_allowed_user_agents — то же, что и предыдущая настройка, только для юзер-агентов. Например, для отсечения ботов можно указать «bot,spider,slurp». Поиск идет через preg_match().
Я первую настройку использую для отсечения запросов с h3.modhost.pro (мой провайдер), который каждые 10 минут стучится на главную страницу.

В списке пользователей теперь есть возможность их удаления. При удалении будет предложено 2 варианта:
  1. Удалить пользователя и статистику его просмотров.
  2. Удалить пользователя, а статистику оставить.

В сниппете siteOnlineUsers добавлено 2 свойства:
  • fullMode — режим вывода информации о текущих пользователях — короткий (false) или полный (true).
  • tplItem — шаблон для вывода списка текущих пользователей (для полного режима). По-умолчанию, [[+stat.fullname]]
Короткий режим —

В полном режиме выводится поименный список пользователей. Имена берутся из поля fullname профиля.

Сортировка статей по количеству просмотров

Ну и напоследок приведу пример сортировки статей по количеству просмотров с использованием сниппета pdoResource из библиотеки pdoTools.
[[!pdoResources?
    &parents=`0`
    &limit=`0`
	&loadModels=`sitestatistics`
	&tpl=`@INLINE [[+id]]. [[+pagetitle]] - [[+views]]`
	&leftJoin=`{
		"Statistics": {
		    "class": "PageStatistics",
			"on": "modResource.id = Statistics.rid"
		}
	}`
	&select=`{
	    "modResource": "*",
	    "Statistics": "IFNULL(SUM(views),0) as views"
	}`
	&groupby=`modResource.id`
	&sortby=`views`
]]

Тоже самое, только для фильтра mFilter2.
[[!mFilter2?
    &class=`msProduct`
    &element=`msProducts`
    &loadModels=`sitestatistics`
    &leftJoin=`{
        "Statistics":{"class":"PageStatistics","on":"msProduct.id=Statistics.rid"}
    }`
    &select=`{
        "msProduct":"*",
        "Statistics":"IFNULL(SUM(views),0) as views"
    }`
    &groupby=`msProduct.id`
    &sortby=`views`
]]

Полная документация.

П.С. Теперь в списке пользователей периодически наблюдаю попытки подбора адреса админки, так как при переадресации на страницу 404 в поле реферер пишется набранный адрес. Прикольно.
Сергей Шлоков
06 мая 2016, 04:31
modx.pro
2
1 996
+8
Поблагодарить автора Отправить деньги

Комментарии: 34

Владимир
06 мая 2016, 11:52
+1
Спасибо! Теперь знаю и какие роботы постоянно тусуются и что их интересует, т.е. в ЯМетрике то этого нет, а иногда полезно знать. Например, как часто и когда Яндекс новости читают предназначенный для них feed, сколько висит постоянно «читателей» на общем RSS и многое другое.
    Николаевич
    29 июля 2016, 20:34
    0
    Было бы здорово группировать результаты по parents и иметь возможность фильтровать их с определенной даты. К примеру, вывести общее количество просмотров всех страниц, у которых parents=1 и дата отсчета статистики с 29.07.2016
      nweb
      30 сентября 2016, 13:52
      0
      Подскажите, как вывести статистику по определенному пользователю за определенный период? На фронте.
        Сергей Шлоков
        01 октября 2016, 10:11
        1
        +2
        Как-то так
        [[!pdoUsers?
            &tpl=`@INLINE <p>[[+username]] - [[+views]].</p>`
            &loadModels=`sitestatistics`
            &innerJoin=`{
                "UserStat":{"class":"UserStatistics","on":"modUser.id=UserStat.uid"},
                "PageStat":{"class":"PageStatistics","on":"UserStat.user_key=PageStat.user_key"}
            }`
             &select=`{
                "PageStat": "IFNULL(SUM(PageStat.views),0) as views"
            }`
            &groupby=`UserStat.uid`
            &where=`["UserStat.uid = 1 AND PageStat.date BETWEEN '2016-01-01' and '2016-06-31' "]`
        ]]
        В параметре where указывается id пользователя и период.
          nweb
          01 октября 2016, 11:04
          0
          Спасибо!
        nweb
        01 октября 2016, 21:02
        0
        Снимаю галочки с показа некоторых столбцов в бэкенде. Но при обновлении страницы они все же остаются. Можно ли как-нибудь «запоминать» это?
          Сергей Шлоков
          02 октября 2016, 09:04
          0
          Наверно можно.
            nweb
            02 октября 2016, 09:41
            0
            Этого не планируется в следующих версиях?
        nweb
        01 октября 2016, 21:24
        0
        Еще вопрос. Как открыть доступ для других пользователей к статистике в бэкенде?
          Сергей Шлоков
          02 октября 2016, 09:07
          0
          В следующей версии добавлю политики. А пока можно в процессорах закомментировать переменную $permission.
            nweb
            02 октября 2016, 09:45
            0
            Вообще, я хотел бы дать доступ только одному пользователю из группы Users и, естестественно, оставить для админа. Можно ли это сделать сейчас каким-нибудь костылем? А в новой версии уже настроить политику.
              Сергей Шлоков
              02 октября 2016, 09:53
              0
              Посмотреть в процессорах права и добавить их в систему в «Настройке доступа». А потом назначить эти права пользователю.
                Андрей Шевяков
                28 августа 2018, 10:55
                0
                Помогите настроить доступ Пользователю группы Manager. Где что прописать?
        Lem
        Lem
        09 октября 2018, 18:41
        0
        Не могу понять. Не работает «stat.not_allowed_user_agents». Нужно писать туда «bot,spider,slurp» или полную запись для каждого бота вида «Mozilla/5.0 (compatible; SemrushBot/2~bl; +http://www.semrush.com/bot.html)»?
          Сергей Шлоков
          09 октября 2018, 19:49
          0
          «bot,spider,slurp»
            Lem
            Lem
            09 октября 2018, 19:51
            0
            Почему тогда в «Онлайн» и в «Пользователи» постоянно тусуются боты? :)
              Сергей Шлоков
              09 октября 2018, 20:03
              0
              Боюсь, разочарую, но несмотря на годы практики мне так и не открылся дар телепатии.
                Lem
                Lem
                09 октября 2018, 20:08
                0
                Ну это понятно.
                Я к тому, что может ещё где какие доп. настройки надо делать?
                Стоит MODX Revo 2.6.1. После установки плагина кеш чистил. На страницах выводит статистику, в админке показывает, но вот ботов игнорить отказывается.
                  Сергей Шлоков
                  09 октября 2018, 20:12
                  0
                  Что указано в настройке? Какие юзер-агенты у ботов?
                    Lem
                    Lem
                    09 октября 2018, 20:16
                    0
                    В настройке поставил, то что написано в инструкции: bot,spider,slurp
                    В админке в «Онлайн» вижу:
                    — Mozilla/5.0 (compatible; YandexAccessibilityBot/3.0; +http://yandex.com/bots)
                    — Mozilla/5.0 (compatible; SemrushBot/2~bl; +http://www.semrush.com/bot.html)
                    — Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
                    — Mozilla/5.0 (compatible; DotBot/1.1; www.opensiteexplorer.org/dotbot, help@moz.com)
                    и т.д.

                    Ещё вопрос. Эта настройка не учитывает статистику только для показа в админке или на сайте количество посещений будет тоже без ботов учитываться?
                      Сергей Шлоков
                      09 октября 2018, 20:25
                      0
                      Так в админке они берутся из таблиц статистики. Боты отсекаются в плагине.Попробуйте подебажить. У меня кроме RSS ридеров ни один бот не пролазит.
                        Lem
                        Lem
                        09 октября 2018, 20:29
                        0
                        Заглянул в лог. А там беда.
                        (ERROR @ /.../core/cache/includes/elements/modplugin/18.include.cache.php: 9) PHP warning: preg_match(): Unknown modifier '2'
                        [2018-10-05 21:37:02]
                        Вот такие записи каждые 1-4 минуты, начиная с даты установки плагина.
                          Сергей Шлоков
                          09 октября 2018, 20:35
                          0
                          Судя по всему в системной настройке ботов есть слеш.
          Виталий
          06 декабря 2018, 16:27
          0
          Спасибо за компонент!
          Есть вопрос. Возможно ли отфильтровать данные по диапозонам ip адресов?
          Например есть массив с диапозоннами [«31.173.80.0/21»,«85.26.232.0/22»].
          Как получить статистику например увидеть на каких страницах были клиенты?
            Сергей Шлоков
            06 декабря 2018, 22:22
            0
            Есть вопрос. Возможно ли отфильтровать данные по диапозонам ip адресов?
            siteStatistics ведёт статистику. А вот анализом придётся заняться самому. Можно через pdoResources.

            Как получить статистику например увидеть на каких страницах были клиенты?
            Открываете список пользователей и кликаете на кнопку «Статистика по ресурсам».
            Виталий
            12 декабря 2018, 14:54
            0
            Подскажите где находится функция которая определяет ip адрес клиента?

            Потому что свой ip я не нахожу хотя сижу онлайн на сайте. Возможно из-за того что сайт работает через cloudflare неправильно определяются ip.
              Сергей Шлоков
              12 декабря 2018, 17:41
              0
                Виталий
                17 декабря 2018, 18:10
                0
                Если я перепешу фунцию в этом файле, то при обновлении она опять перепишется?
                function getUsetIP(){
                    $ip = $_SERVER['REMOTE_ADDR'];
                    if ( !empty( $_SERVER["HTTP_CF_CONNECTING_IP"])){
                        $ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
                    }elseif( !empty($_SERVER['HTTP_X_REAL_IP'])){
                        $ip = $_SERVER['HTTP_X_REAL_IP'];
                    }elseif( !empty($_SERVER['HTTP_CLIENT_IP'])){
                        $ip = $_SERVER['HTTP_CLIENT_IP'];
                    }elseif( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'])){
                        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
                        $commapos = strrpos( $ip , ',' );
                        $ip = trim( substr( $ip , $commapos ? $commapos  +  1 : 0 ));
                    }
                    return $ip;
                }
                  Сергей Шлоков
                  17 декабря 2018, 19:07
                  0
                  Офкоз.
                  Создайте плагин OnHandleRequest с вышеописанным кодом, а найденный ip засуньте в $_SERVER['REMOTE_ADDR']. Делов то.
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              34