Довольно высоконагруженный сайт сильно донимали боты, которые воровали контент. Проблема не столько в контенте, сколько в том что они создавали больше половины нагрузки. Необходимо было пресечь это дело, но так чтобы ботам поисковиков Yandex, Google, etc дать полную свободу.
Это было реализовано следующим путем.
get('ips');
if (!isset($ips['create'])){
$ips['create'] = time();
}
else{
$t = time();
$limit = 15*60;
/* если массив последних заходивших айпи больше 15 мин - очищаем */
if ($t>=($ips['create'] + $limit)){
$ips = array();
$ips['create'] = $t;
}
}
$ips[$REMOTE_ADDR]++;
$memcache->set('ips', $ips, false, 900);
}
/* если с этого ip было больше 1000 обращений за 15 мин - это бот */
if ($ips[$REMOTE_ADDR]>=1000){
/*
массив ключевых слов, наличие которых в ответе на системную функцию host
говорит нам, что этот бот - хороший
*/
$good_bots = array ('Yand', 'yand', 'YAND', 'goog', 'Goog', '
GOOG', 'Ramb', 'ramb', 'RAMB', 'msn', 'live',
'yahoo', 'aport', 'rol.ru', 'Aport');
$res = array();
$str = 'host '.$REMOTE_ADDR;
exec($str, $res);
/* делаем запрос к whois */
foreach ($good_bots as $k=>$v){
foreach ($res as $k1=>$v1){
if (strstr($v1, $v)){
/* если попалось ключевое слово - это хороший бот */
$good_bot = 1;
break;
}
}
}
/* заносим данные о боте в БД */
if ($good_bot==0){
mysql_query('insert into bad_bots (ip, data, agent)
values (\''.$REMOTE_ADDR.'\', NOW(), \''.$HTTP_USER_AGENT.'\')');
}else{
mysql_query('insert into good_bots (ip, agent)
values (\''.$REMOTE_ADDR.'\', \''.$HTTP_USER_AGENT.'\')');
}
}
}
mysql_close($link)
?>