Исключить ботов и пауков из счетчика View в PHP

Я создал довольно простой менеджер рекламы для веб-сайта в PHP.

Я говорю о базовом, потому что это не сложно, как реклама Google или Facebook или даже большинство высокопроизводительных рекламных серверов. Не обрабатывает платежи или что-то еще, или даже нацеливает пользователей.

Он служит цели для моего сайта с низким трафиком, хотя просто показывать случайное рекламное объявление, просматривать количество просмотров и клики.

Особенности:

  • Рекламный слот / позиция на странице
  • Изображение баннера
  • имя
  • Счетчик просмотров / показа
  • Счетчик посещений
  • Дата начала и окончания или никогда не заканчивается
  • Отключить / включить объявление

Тем не менее, я хочу постепенно добавлять больше функциональности в систему.

Одна вещь, которую я заметил, – это то, что счетчик впечатлений / просмотров часто кажется завышенным.

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

Например, если кто-то вводит URL-адрес со страницы на моем сайте в Facebook, Google+, Twitter, LinkedIn, Pinterest и другие сети, эти сайты часто будут размещать мой сайт для сбора веб-страниц. Название, изображения и описание.

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

Я понимаю, что это будет очень сложно обнаружить все это, но если есть способ получить большинство из них, по крайней мере, это сделает мою статистику более точным.

Поэтому я обращаюсь за помощью или идеями о том, как достичь своей цели? Пожалуйста, не говорите, чтобы использовать другую рекламную систему, которой нет в карточках, спасибо

введите описание изображения здесь

Solutions Collecting From Web of "Исключить ботов и пауков из счетчика View в PHP"

Вы должны обслуживать AD с помощью JavaScript. Это единственный способ избежать большинства сканеров. Только браузеры загружают зависимости, такие как Images, JS и CSS. 99% роботов избегают их.

Вы также можете сделать это:

// basic crawler detection and block script (no legit browser should match this) if(!empty($_SERVER['HTTP_USER_AGENT']) and preg_match('~(bot|crawl)~i', $_SERVER['HTTP_USER_AGENT'])){ // this is a crawler and you should not show ads here } 

Таким образом, у вас будет намного больше статистики. Используйте JS для рекламы.

PS : Вы также можете попробовать установить cookie в JS и позже проверить его. Сканеры могут получать файлы cookie, отправленные на PHP по HTTP, но те, которые установлены в JS, 99,9%, скорее всего, они пропустят. Потому что им нужно загрузить JS-файл и интерпретировать его. Это делается только браузерами.

Вы можете сделать что-то вроде этого: в текстовом формате есть хороший список сканеров: http://www.robotstxt.org/db/all.txt

предположим, что вы собрали все пользовательские агенты в этом файле в массиве с именем $botList

 $ua = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : NULL; if($ua && in_array($ua, $botList)) { // this is probably a bot } 

Конечно, пользовательский агент легко может быть изменен или иногда может отсутствовать, но поисковые системы, такие как Google и Yahoo, честны в себе.

Сканер загрузит файл robots.txt, даже если он не уважает его и делает это из любопытства. Это хороший признак того, что вы можете иметь дело с одним, хотя это не определенно.

Вы можете обнаружить сканера, если он посещает огромное количество ссылок за очень короткое время. Это может быть довольно сложно сделать в коде.

Но это возможно только в том случае, если вы не хотите или не можете запускать Javascript. В противном случае обратитесь к ответу CodeAngry.


Изменить: В ответ на ответ @ keune вы можете сохранить все IP-адреса посетителя и запустить их через список в задании cron, а затем опубликовать обновленный счетчик посетителей.

Попробуй это:

 if (preg_match("/^(Mozilla|Opera|PSP|Bunjalloo|wii)/i", $_SERVER['HTTP_USER_AGENT']) && !preg_match("/bot|crawl|crawler|slurp|spider|link|checker|script|robot|discovery|preview/i", $_SERVER['HTTP_USER_AGENT'])) { It's not a bot } else { It's a bot }