[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
3 870
Поблагодарить автора Отправить деньги
Реклама

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

Владимир
Владимир Старожил
06 мая 2016, 11:52
Спасибо! Теперь знаю и какие роботы постоянно тусуются и что их интересует, т.е. в ЯМетрике то этого нет, а иногда полезно знать. Например, как часто и когда Яндекс новости читают предназначенный для них feed, сколько висит постоянно «читателей» на общем RSS и многое другое.
    Николаевич
    Николаевич Старожил
    29 июля 2016, 20:34
    Было бы здорово группировать результаты по parents и иметь возможность фильтровать их с определенной даты. К примеру, вывести общее количество просмотров всех страниц, у которых parents=1 и дата отсчета статистики с 29.07.2016
      nweb
      nweb Старожил
      30 сентября 2016, 13:52
      Подскажите, как вывести статистику по определенному пользователю за определенный период? На фронте.
        Сергей Шлоков
        Сергей Шлоков Старожил
        01 октября 2016, 10:11
        Как-то так
        [[!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
          nweb Старожил
          01 октября 2016, 11:04
          Спасибо!
        nweb
        nweb Старожил
        01 октября 2016, 21:02
        Снимаю галочки с показа некоторых столбцов в бэкенде. Но при обновлении страницы они все же остаются. Можно ли как-нибудь «запоминать» это?
          Сергей Шлоков
          Сергей Шлоков Старожил
          02 октября 2016, 09:04
          Наверно можно.
            nweb
            nweb Старожил
            02 октября 2016, 09:41
            Этого не планируется в следующих версиях?
              Сергей Шлоков
              Сергей Шлоков Старожил
              02 октября 2016, 09:43
              Если разберусь, прикручу.
          nweb
          nweb Старожил
          01 октября 2016, 21:24
          Еще вопрос. Как открыть доступ для других пользователей к статистике в бэкенде?
            Сергей Шлоков
            Сергей Шлоков Старожил
            02 октября 2016, 09:07
            В следующей версии добавлю политики. А пока можно в процессорах закомментировать переменную $permission.
              nweb
              nweb Старожил
              02 октября 2016, 09:45
              Вообще, я хотел бы дать доступ только одному пользователю из группы Users и, естестественно, оставить для админа. Можно ли это сделать сейчас каким-нибудь костылем? А в новой версии уже настроить политику.
                Сергей Шлоков
                Сергей Шлоков Старожил
                02 октября 2016, 09:53
                Посмотреть в процессорах права и добавить их в систему в «Настройке доступа». А потом назначить эти права пользователю.
                  Андрей Шевяков
                  Андрей Шевяков Старожил
                  28 августа 2018, 10:55
                  Помогите настроить доступ Пользователю группы Manager. Где что прописать?
                    Сергей Шлоков
                    Сергей Шлоков Старожил
                    28 августа 2018, 20:35
                    Насколько Вы близко общаетесь с MODX? Знаете что такое политики доступа?
                      Андрей Шевяков
                      Андрей Шевяков Старожил
                      28 августа 2018, 23:26
                      Да, знаю. Какие параметры должны быть установлены?
          Lem
          Lem Старожил
          09 октября 2018, 18:41
          Не могу понять. Не работает «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
            «bot,spider,slurp»
              Lem
              Lem Старожил
              09 октября 2018, 19:51
              Почему тогда в «Онлайн» и в «Пользователи» постоянно тусуются боты? :)
                Сергей Шлоков
                Сергей Шлоков Старожил
                09 октября 2018, 20:03
                Боюсь, разочарую, но несмотря на годы практики мне так и не открылся дар телепатии.
                  Lem
                  Lem Старожил
                  09 октября 2018, 20:08
                  Ну это понятно.
                  Я к тому, что может ещё где какие доп. настройки надо делать?
                  Стоит MODX Revo 2.6.1. После установки плагина кеш чистил. На страницах выводит статистику, в админке показывает, но вот ботов игнорить отказывается.
                    Сергей Шлоков
                    Сергей Шлоков Старожил
                    09 октября 2018, 20:12
                    Что указано в настройке? Какие юзер-агенты у ботов?
                      Lem
                      Lem Старожил
                      09 октября 2018, 20:16
                      В настройке поставил, то что написано в инструкции: 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
                        Так в админке они берутся из таблиц статистики. Боты отсекаются в плагине.Попробуйте подебажить. У меня кроме RSS ридеров ни один бот не пролазит.
                          Lem
                          Lem Старожил
                          09 октября 2018, 20:29
                          Заглянул в лог. А там беда.
                          (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
                            Судя по всему в системной настройке ботов есть слеш.
            Виталий
            Виталий Старожил
            06 декабря 2018, 16:27
            Спасибо за компонент!
            Есть вопрос. Возможно ли отфильтровать данные по диапозонам ip адресов?
            Например есть массив с диапозоннами [«31.173.80.0/21»,«85.26.232.0/22»].
            Как получить статистику например увидеть на каких страницах были клиенты?
              Сергей Шлоков
              Сергей Шлоков Старожил
              06 декабря 2018, 22:22
              Есть вопрос. Возможно ли отфильтровать данные по диапозонам ip адресов?
              siteStatistics ведёт статистику. А вот анализом придётся заняться самому. Можно через pdoResources.

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

              Потому что свой ip я не нахожу хотя сижу онлайн на сайте. Возможно из-за того что сайт работает через cloudflare неправильно определяются ip.
                Сергей Шлоков
                Сергей Шлоков Старожил
                12 декабря 2018, 17:41
                  Виталий
                  Виталий Старожил
                  17 декабря 2018, 18:10
                  Если я перепешу фунцию в этом файле, то при обновлении она опять перепишется?
                  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
                    Офкоз.
                    Создайте плагин OnHandleRequest с вышеописанным кодом, а найденный ip засуньте в $_SERVER['REMOTE_ADDR']. Делов то.
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                34