Пытался отсеять так: Код (PHP): $_SESSION['number']=$number; if($_SESSION['number']){ //тут всякие действия, которые боты не должны видеть } не получается
И не получится. Боты не поддерживают куки и при каждом заходе создаётся новая сессия. Выход, разрешить ПХП пихать ИД сессии в URL. Но и это не поможет, т.к. время сессии ограничено, а боты тот же URL редко сканируют. Поэтому, единственный выход - $_SERVER['HTTP_USER_AGENT'].
Мне надо в табличку сложить все реффереры, с которых были обращения к сайту. Проблема уже не актуальна - я ее решил немножко по другому. Короче дописал свой скриптец, вот только что. это инклудим к сайту Код (PHP): <?php define("XCONT", "true"); //антивзлом session_start(); //стартуем сессию require_once "wp-config.php"; //вытягиваем из настроек вордпресса путь к файлам (путь к конфигу берем относительно файла к которому подключаем скрипт) //парсер function searchstr($str,$separator){ // парсер поискового запроса (yandex.ua не парсит) return rawurldecode(preg_replace('~^http://(www\.)?(search\.live\.com|google\.(com|ru|com\.ua){1}|rambler\.ru|yandex\.(com|ru|ua){1}|search\.yahoo\.com){1}/(.*)(&|\?)(q|words|text|p)=([^&]+)(.*)$~i','$2'.$separator.'$8',$str)); } $separator=" --- "; //end парсер if(!$_SESSION['ref_test']){ //если пользователь зашел впервые $_SESSION['ref_test']=true; //не пускаем его в следующие разы if($_SERVER['HTTP_REFERER']){ //если нет рефферера - нет смысла грузить базу данных require_once(ABSPATH."ref/config/db.php"); //подключаем базу данных $sql="SELECT number FROM wp_numbers ORDER BY id DESC LIMIT 1"; //вытягиваем последний номер из базы данных $result=$db->sql($sql); $number_array=mysql_fetch_assoc($result); $number=$number_array['number']+1; if($number>999){ $number=0; // если переменная вылезла за границы - обнуляем } $string=$_SERVER['HTTP_REFERER']; //получаем рефферер $string_p=searchstr($string,$separator); // парсим поисковый запрос $array=explode($separator, $string_p); //отделяем домен от запроса $domain=$array[0]; $text=$array[1]; if(!isset($text)){ //если запрос пустой - отделяем домен от хлама $array=explode("/url?",$domain); $domain=$array[0]; } $_SESSION['number']=$number; //показываем номер пользователю $request=$text; //поисковый запрос $domain=$domain; //:) $ip=$_SERVER['REMOTE_ADDR']; //ip юзера $page=$_SERVER['REQUEST_URI']; //запрошенная страничка $number=$number; //:) $date2=Date("Y-m-d"); //дата запроса $sql="INSERT INTO wp_numbers (number, date, ip, page, domain, request) VALUES ('{$number}', '{$date2}', '{$ip}', '{$page}', '{$domain}', '{$request}')"; $db->sql($sql); //отправляем всю эту байду в базу данных } } ?> А это админка: Код (PHP): <?php define("XCONT", "true"); //антивзлом session_start(); header("Content-Type: text/html; charset=UTF-8"); if($_GET['res']){ header("Location: ".$_SERVER["PHP_SELF"].""); exit('hello world'); } $admin_login="логин админа"; $admin_password="пароль админа"; $admin_hash=crypt($admin_login, $admin_password); $num=25; // количество записей, отображаемых на странице require_once "../wp-config.php"; //вытягиваем из настроек вордпресса путь к файлам (путь к конфигу берем относительно файла к которому подключаем скрипт) require_once(ABSPATH."ref/config/db.php");//коннектим базу данных function aut_menu($admin_login, $admin_password, $admin_hash){ if($_POST){ $_POST['username'] = htmlspecialchars($_POST['username'],ENT_QUOTES,"UTF-8",false); $_POST['user_password'] = htmlspecialchars($_POST['user_password'],ENT_QUOTES,"UTF-8",false); if($admin_login==$_POST['username'] && $admin_password==$_POST['user_password']){ setcookie("admin_hash", $admin_hash, time()+60*60*24*30); $_SESSION['login']=true; header("Location: ".$_SERVER["REQUEST_URI"].""); }else{ echo "Вы неправильно ввели логин или пароль"; } } echo "<form action=\"".$_SERVER["PHP_SELF"]."\" method=\"post\">\n"; echo "Name: <input type=\"text\" name = \"username\" value=\"".$_POST['username']."\"/><br />\n"; echo "Password: <input type=\"text\" name = \"user_password\" value=\"".$_POST['user_password']."\"/><br />\n"; echo "<input type=\"submit\" name=\"create\" value=\"send\">\n"; echo "</form>\n"; } function admin_links($db, $num){ include "header.html"; echo "<div id=\"links\">\n"; echo "<a href=\"".$_SERVER["PHP_SELF"]."?logout=ok\">Выход</a><hr>\n"; echo "Показаны последние {$num} записей (в обратном порядке).<hr>"; echo "</div>\n"; echo "<div id=\"search\">\n"; echo "<form action=\"admin.php\" method=\"get\">\n"; echo "Искать по номеру: \n"; echo "<input type=\"text\" name=\"number\"><br>\n"; echo "<div id=\"date\">\n"; echo "Искать по дате: \n"; // echo "<div id=\"calendar\">\n"; $sql="SELECT date FROM wp_numbers"; $result=$db->sql($sql); $i=0; while($row=mysql_fetch_assoc($result)){ $date_array[$i]=$row['date']; $i++; } if($_GET['y']){ $year=$_GET['y']; }else{ $year=date('Y'); } if($_GET['m']){ $month=$_GET['m']; }else{ $month=date('m'); } if($_GET['d']){ $today=$_GET['d']; }else{ $today=date('d'); } $month2=0; for($i=1;$i<32;$i++){ $month2++; if($i<10){ $day="0{$i}"; }else{ $day=$i; } $date1="{$year}-{$month}-{$day}"; if(in_array($date1,$date_array)){ if($day==$today){ echo "<div id=\"today\">"; } echo "<a href=\"".$_SERVER["PHP_SELF"]."?d={$day}\">{$day}</a> "; if($day==$today){ echo "</div> "; } }else{ echo "{$day} "; } if($month2>6){ echo "<br>\n"; $month2=0; } } echo "</div>\n"; // echo "<select name=\"d\">\n"; echo "<option value=\"\"></option>\n"; for($i=1;$i<32;$i++){ if($i<10){ $day="0{$i}"; }else{ $day=$i; } echo "<option "; if($_GET['d']==$i) echo "selected"; echo " value=\"{$day}\">{$day}</option>\n"; } echo "</select>\n"; echo "<select name=\"m\">\n"; echo "<option value=\"\"></option>\n"; for($i=1;$i<13;$i++){ if($i<10){ $month="0{$i}"; }else{ $month=$i; } echo "<option "; if($_GET['m']==$i) echo "selected"; echo " value=\"{$month}\">{$month}</option>\n"; } echo "</select>\n"; echo "<select name=\"y\">\n"; echo "<option value=\"\"></option>\n"; for($i=2012;$i<2023;$i++){ echo "<option "; if($_GET['y']==$i) echo "selected"; echo " value=\"{$i}\">{$i}</option>\n"; } echo "</select><br>\n"; echo "</div>\n"; echo "Искать по IP: \n"; echo "<input type=\"text\" name=\"IP\"><br>\n"; echo "<input type=\"submit\" name=\"submit\" value=\"искать\">\n"; echo "<input type=\"submit\" name=\"res\" value=\"сбросить\">\n"; echo "<form>\n"; echo "</div>\n"; } if($_GET['logout']){ setcookie("admin_hash", $admin_hash, time()-3600); $_SESSION['login']=false; } if(!$_SESSION['login']){ if($_COOKIE['admin_hash']!=$admin_hash){ aut_menu($admin_login, $admin_password, $admin_hash); }else{ $_SESSION['login']=true; header("Location: ".$_SERVER["REQUEST_URI"].""); } }else{ admin_links($db, $num); $sql="SELECT * FROM wp_numbers "; $sql2="SELECT COUNT(*) FROM wp_numbers "; if($_GET['number']){ $sql.="WHERE number='{$_GET['number']}' "; $sql2.="WHERE number='{$_GET['number']}' "; } if($_GET['IP']){ if($_GET['number']){ $sql.="AND ip='{$_GET['IP']}' "; $sql2.="AND ip='{$_GET['IP']}' "; }else{ $sql.="WHERE ip='{$_GET['IP']}' "; $sql2.="WHERE ip='{$_GET['IP']}' "; } } if($_GET['d'] || $_GET['m'] || $_GET['y']){ if(!$_GET['d']){ $d=date('d'); }else{ $d=$_GET['d']; } if(!$_GET['m']){ $m=date('m'); }else{ $m=$_GET['m']; } if(!$_GET['y']){ $y=date('Y'); }else{ $y=$_GET['y']; } $dat="{$y}-{$m}-{$d}"; if($_GET['number'] || $_GET['IP']){ $sql.="AND "; $sql2.="AND "; }else{ $sql.="WHERE "; $sql2.="WHERE "; } $sql.=" date='{$dat}' "; $sql2.=" date='{$dat}' "; } $page=$_GET['page']; $result=$db->sql($sql2); $posts = mysql_result($result, 0); $total = intval(($posts - 1) / $num) + 1; $page = intval($page); if(empty($page) or $page < 0) $page = 1; if($page > $total) $page = $total; $start = $page * $num - $num; if($_GET['d']||$_GET['m']||$_GET['y']||$_GET['number']||$_GET['ip']){ $url_sep="?d={$_GET['d']}&m={$_GET['m']}&y={$_GET['y']}&number={$_GET['number']}&ip={$_GET['ip']}&"; }else{ $url_sep="?"; } if ($page != 1) $pervpage = "[url=".$_SERVER["]<[/url] "; if ($page != $total) $nextpage = " [url=".$_SERVER["]>[/url]"; if($page - 2 > 0) $page2left = " [url=".$_SERVER["]". ($page - 2) ."[/url] | "; if($page - 1 > 0) $page1left = "[url=".$_SERVER["]". ($page - 1) ."[/url] | "; if($page + 2 <= $total) $page2right = " | [url=".$_SERVER["]". ($page + 2) ."[/url]"; if($page + 1 <= $total) $page1right = " | [url=".$_SERVER["]". ($page + 1) ."[/url]"; $sql.="ORDER BY id DESC LIMIT {$start}, {$num}"; $result=$db->sql($sql); $i=0; while($row=mysql_fetch_assoc($result)){ $users[$i]=$row; $i++; } echo "<div id=\"navigation\">\n"; echo $pervpage.$page2left.$page1left."<b>".$page."</b>".$page1right.$page2right.$nextpage; echo "</div>\n"; if($_GET['number']) $td1="<td class=\"active\">"; else $td1="<td>"; if($_GET['ip']) $td2="<td class=\"active\">"; else $td2="<td>"; if($_GET['d'] || $_GET['m'] || $_GET['y']) $td3="<td class=\"active\">"; else $td3="<td>"; echo "<table width=\"100%\">\n"; echo "<tr align=\"center\">{$td1}номер перехода</td>{$td3}Дата</td>{$td2}IP</td><td>Запрошенная страничка</td><td>поисковик / сайт</td><td>поисковый запрос</td></tr>\n"; $lenght=count($users); for($i=0;$i<$lenght;$i++){ if(!$users[$i]['request']){ //если запрос пустой - отделяем домен от хлама $array=explode("/url?",$users[$i]['domain']); $users[$i]['domain']=$array[0]; $array=explode("/imgres?",$users[$i]['domain']); $users[$i]['domain']=$array[0]; if($array[1]){ $users[$i]['request']="Вероятно, это был запрос с гугл-картинок о_О"; } $array=explode("/dk?",$users[$i]['domain']); $users[$i]['domain']=$array[0]; if($array[1]){ $users[$i]['request']="Одноклассники"; } $array=explode("/web?",$users[$i]['domain']); $users[$i]['domain']=$array[0]; if($array[1]){ $users[$i]['request']="Экзотические поисковики парсить не получается :("; } } echo "<tr>{$td1}{$users[$i]['number']} </td>{$td3}{$users[$i]['date']} </td>{$td2}{$users[$i]['ip']} </td><td>{$users[$i]['page']} </td><td>{$users[$i]['domain']} </td><td>{$users[$i]['request']} </td></tr>\n"; } echo "</table>"; echo "<div id=\"navigation\">\n"; echo $pervpage.$page2left.$page1left."<b>".$page."</b>".$page1right.$page2right.$nextpage; echo "</div>\n"; include "footer.html"; } ?> говнокод дичайший, но результат мне нравится: Авторизация, разные параметры поиска, постраничная навигация, календарик
Кстати да, ссылки на хомепагу не закрыты нофоловом и ноиндексом. Добавлено спустя 9 минут 53 секунды: То-есть ссылка на мой http://xcont.com вполне индексируется поисковиками.
Есть чудная модификация на phpBB-форумы - DetectorBots. 99% ботов срезает. Если бот постит где-то ссылку - в подписи, в сообщении, в личных сообщениях - аккаунт удаляется. Можно выставить ограничение - 5 сообщения. После 5 сообщения пользователь может нормально общаться на форуме. У меня на форуме по 300-400 сообщений в день отсеивает.