Перед созданием новой темы, пожалуйста, ознакомьтесь с FAQ по LinkorCMS

Пользователи. Онлайн. Роботы.

Супер пользователь
Сообщений: 50
Добрый день!
Подскажите как исключить роботов из числа онлайн пользователей?
(Включая форум и при увеличении счётчика скачиваний)
Разработчик
Сообщений: 605
Напишите сперва функцию, которая будет по UserAgent определять является ли пользователь ботом. В интернете их много можно найти. Где-то даже у меня была выдранная.

Прежде всего, я бы начал с класса пользователей (/base/inc/user.class,php). Там есть два метода: OnlineProcess - обновляет содержание таблицы online с пользователями, находящимися на сайте, и Online - возвращает информацию об пользователях на сайте онлайн (из таблицы онлайна). Можете глобально фильтровать ботов, чтобы не были они внесены в таблицу online. А можете только сделать фильтр в методе Online. Тогда боты будут отсутствовать в возвращенных данных от этого метода (а его то и вызывают почти всегда для получения списка онлайна), но при желании можно будет залезть в таблицу online и получить реальные данные (в том же блоке онлайна сделать вывод ботов, при условии получения UA).

А чтобы счетчик скачиваний не увеличивался, сделайте в модуле файлов проверку является ли пользователь ботом (функция IndexDownloadsFile).

Ну а форум использует собственную реализацию регистрации пользователей, находящихся на форуме. Класс лежит в файле /modules/forum/lib/forum_online.class.php. По аналогии мучайте методы Process и LoadOnline. Там везде есть описания у методов.
Супер пользователь
Сообщений: 50
Возможна ли интеграция фильтра ботов в основную сборку ?
Разработчик
Сообщений: 605
Вам вообще в раздел просьб и предложений, если вы хотите такой функционал в будущих версиях увидеть. Но мне лично идея фильтрации кажется частным случаем.
Супер пользователь
Сообщений: 50
Мартин:
Вам вообще в раздел просьб и предложений, если вы хотите такой функционал в будущих версиях увидеть. Но мне лично идея фильтрации кажется частным случаем.

Я вначале хотел там создать тему, но решил что бессмысленно создавать подобную. А исключить ботов - не считаю частным случаем, т.к. они значительно накручивают счётчики просмотров и скачивания. Можно добавить настройку на подобии "Учитывать роботов в онлайне?".
Супер пользователь
Сообщений: 50
Вдруг кому понадобится. В итоге использовал следующую функцию:
public function GetBotName(){
if (stristr($_SERVER['HTTP_USER_AGENT'], 'YandexBot')){ RETURN 'YandexBot';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'YandexDirect')){ RETURN 'Yandex Direct';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'Yandex')){ RETURN 'Yandex';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'Googlebot')){RETURN 'Googlebot';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'Mediapartners-Google')){RETURN 'Mediapartners-Google (Adsense)';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'Google')){RETURN 'Google';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'Slurp')){RETURN 'Hot Bot search';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'WebCrawler')){RETURN 'WebCrawler search';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'ZyBorg')){RETURN 'Wisenut search';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'scooter')){RETURN 'AltaVista';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'StackRambler')){RETURN 'Rambler';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'Aport')){RETURN 'Aport';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'lycos')){RETURN 'Lycos';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'Yahoo')){RETURN 'Yahoo';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'WebAlta')){RETURN 'WebAlta';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'yahoo')){RETURN 'Yahoo';}
else if (stristr($_SERVER['HTTP_USER_AGENT'], 'msnbot')){RETURN 'msnbot/1.0';}
RETURN '';
}
Разработчик
Сообщений: 605
Покритикую немного. Уж перебор с условиями: их много и они однотипные. Более красивее сделать это через ассоциативный массив и перебирать через foreach. И будет удобнее изменять список ботов. Еще мне не понятно для чего оператор return набран в верхнем регистре. Самостоятельно писали функцию?
Супер пользователь
Сообщений: 50
Мартин:

Покритикую немного. Уж перебор с условиями: их много и они однотипные. Более красивее сделать это через ассоциативный массив и перебирать через foreach. И будет удобнее изменять список ботов. Еще мне не понятно для чего оператор return набран в верхнем регистре. Самостоятельно писали функцию?

Действительно так лучше будет. Даже можно сделать таблицу и интерфейс доступа к ней.
Функцию нашёл в интернете и немного доработал.
Единственное какой-то бот не идентифицируется с IP: 5.10.83.*
Уважаемый пользователь
Сообщений: 8
Супер пользователь
Сообщений: 50
Alex:

gadget:Единственное какой-то бот не идентифицируется с IP: 5.10.83.*

Посмотри, может это то, что надо: blocklistpro.com/content-scrapers/5.10.83.-ahrefsbot-seo-spybot-update-softlayer

Спасибо, действительно это то что надо!
Идентифицируется как stristr($_SERVER['HTTP_USER_AGENT'], 'AhrefsBot')
Гости не могут отвечать на темы. Войдите или Зарегистрируйтесь.
Здесь присутствуют
(пользователей: 0, гостей: 1)
Быстрый переход: