За последние 24 часа нас посетили 20082 программиста и 1724 робота. Сейчас ищут 1649 программистов ...

Как отсеять поисковых ботов?

Тема в разделе "Вопросы от блондинок", создана пользователем html-программист, 19 апр 2012.

  1. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Пытался отсеять так:
    Код (PHP):
    1.     $_SESSION['number']=$number;
    2.         if($_SESSION['number']){
    3.             //тут всякие действия, которые боты не должны видеть
    4.         } 
    не получается :(
     
  2. MaXyC_Web_Studio

    MaXyC_Web_Studio Активный пользователь

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    htaccess
    Deny from all?

    robots.txt
    User-agent: *
    Disallow: /
    ??
     
  3. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    И не получится. Боты не поддерживают куки и при каждом заходе создаётся новая сессия.
    Выход, разрешить ПХП пихать ИД сессии в URL. Но и это не поможет, т.к. время сессии ограничено, а боты тот же URL редко сканируют.
    Поэтому, единственный выход - $_SERVER['HTTP_USER_AGENT'].
     
  4. Veemankm

    Veemankm Активный пользователь

    С нами с:
    23 апр 2012
    Сообщения:
    1
    Симпатии:
    0
    Адрес:
    Россия
    Итересно, а зачем их отсеивать?
     
  5. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Мне надо в табличку сложить все реффереры, с которых были обращения к сайту. Проблема уже не актуальна - я ее решил немножко по другому.

    Короче дописал свой скриптец, вот только что.

    это инклудим к сайту
    Код (PHP):
    1. <?php
    2.     define("XCONT", "true"); //антивзлом
    3.     session_start(); //стартуем сессию
    4.     require_once "wp-config.php"; //вытягиваем из настроек вордпресса путь к файлам (путь к конфигу берем относительно файла к которому подключаем скрипт)
    5.     
    6.     //парсер
    7.     function searchstr($str,$separator){ // парсер поискового запроса (yandex.ua не парсит)
    8.         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));
    9.     }
    10.     $separator=" --- ";
    11.     //end парсер
    12.  
    13.  
    14.  
    15.     if(!$_SESSION['ref_test']){ //если пользователь зашел впервые
    16.         $_SESSION['ref_test']=true; //не пускаем его в следующие разы
    17.         if($_SERVER['HTTP_REFERER']){ //если нет рефферера - нет смысла грузить базу данных
    18.             require_once(ABSPATH."ref/config/db.php"); //подключаем базу данных
    19.             $sql="SELECT number FROM wp_numbers ORDER BY id DESC LIMIT 1"; //вытягиваем последний номер из базы данных
    20.             $result=$db->sql($sql);
    21.             $number_array=mysql_fetch_assoc($result);
    22.             $number=$number_array['number']+1;
    23.             
    24.             if($number>999){
    25.                 $number=0; // если переменная вылезла за границы - обнуляем
    26.             }
    27.             
    28.             
    29.             $string=$_SERVER['HTTP_REFERER']; //получаем рефферер
    30.             $string_p=searchstr($string,$separator); // парсим поисковый запрос
    31.             $array=explode($separator, $string_p); //отделяем домен от запроса
    32.             $domain=$array[0];
    33.             $text=$array[1];
    34.             if(!isset($text)){ //если запрос пустой - отделяем домен от хлама
    35.                 $array=explode("/url?",$domain);
    36.                 $domain=$array[0];
    37.             }
    38.             
    39.             
    40.             $_SESSION['number']=$number; //показываем номер пользователю
    41.             $request=$text; //поисковый запрос
    42.             $domain=$domain; //:)
    43.             $ip=$_SERVER['REMOTE_ADDR']; //ip юзера
    44.             $page=$_SERVER['REQUEST_URI']; //запрошенная страничка
    45.             $number=$number; //:)
    46.             $date2=Date("Y-m-d"); //дата запроса
    47.             
    48.             
    49.             $sql="INSERT INTO wp_numbers (number, date, ip, page, domain, request) VALUES ('{$number}', '{$date2}', '{$ip}', '{$page}', '{$domain}', '{$request}')";
    50.             $db->sql($sql); //отправляем всю эту байду в базу данных
    51.     
    52.     
    53.         }
    54.     }
    55. ?>
    А это админка:
    Код (PHP):
    1. <?php
    2. define("XCONT", "true"); //антивзлом
    3. header("Content-Type: text/html; charset=UTF-8");
    4. if($_GET['res']){
    5.     header("Location: ".$_SERVER["PHP_SELF"]."");
    6.     exit('hello world');
    7. }
    8. $admin_login="логин админа";
    9. $admin_password="пароль админа";
    10. $admin_hash=crypt($admin_login, $admin_password);
    11. $num=25; // количество записей, отображаемых на странице
    12.  
    13. require_once "../wp-config.php"; //вытягиваем из настроек вордпресса путь к файлам (путь к конфигу берем относительно файла к которому подключаем скрипт)
    14. require_once(ABSPATH."ref/config/db.php");//коннектим базу данных
    15.     
    16. function aut_menu($admin_login, $admin_password, $admin_hash){
    17.     if($_POST){
    18.         $_POST['username'] = htmlspecialchars($_POST['username'],ENT_QUOTES,"UTF-8",false);
    19.         $_POST['user_password'] = htmlspecialchars($_POST['user_password'],ENT_QUOTES,"UTF-8",false);
    20.         if($admin_login==$_POST['username'] && $admin_password==$_POST['user_password']){
    21.             setcookie("admin_hash", $admin_hash, time()+60*60*24*30);
    22.             $_SESSION['login']=true;
    23.             header("Location: ".$_SERVER["REQUEST_URI"]."");
    24.         }else{
    25.             echo "Вы неправильно ввели логин или пароль";
    26.         }
    27.     }
    28.     echo "<form action=\"".$_SERVER["PHP_SELF"]."\" method=\"post\">\n";
    29.     echo "Name: <input type=\"text\" name = \"username\" value=\"".$_POST['username']."\"/><br />\n";
    30.     echo "Password: <input type=\"text\" name = \"user_password\"  value=\"".$_POST['user_password']."\"/><br />\n";
    31.     echo "<input type=\"submit\" name=\"create\" value=\"send\">\n";
    32.     echo "</form>\n";
    33. }
    34.  
    35. function admin_links($db, $num){
    36.     include "header.html";
    37.     echo "<div id=\"links\">\n";
    38.     echo "<a href=\"".$_SERVER["PHP_SELF"]."?logout=ok\">Выход</a><hr>\n";
    39.     echo "Показаны последние {$num} записей (в обратном порядке).<hr>";
    40.     echo "</div>\n";
    41.     
    42.     echo "<div id=\"search\">\n";
    43.     echo "<form action=\"admin.php\" method=\"get\">\n";
    44.     echo "Искать по номеру: \n";
    45.     echo "<input type=\"text\" name=\"number\"><br>\n";
    46.     echo "<div id=\"date\">\n";
    47.     echo "Искать по дате: \n";
    48.     
    49.     
    50.     
    51.     //
    52.     echo "<div id=\"calendar\">\n";
    53.     $sql="SELECT date FROM wp_numbers";
    54.     $result=$db->sql($sql);
    55.     $i=0;
    56.     while($row=mysql_fetch_assoc($result)){
    57.             $date_array[$i]=$row['date'];
    58.             $i++;
    59.     }
    60.     if($_GET['y']){
    61.         $year=$_GET['y'];
    62.     }else{
    63.         $year=date('Y');
    64.     }
    65.     if($_GET['m']){
    66.         $month=$_GET['m'];
    67.     }else{
    68.         $month=date('m');
    69.     }
    70.     if($_GET['d']){
    71.         $today=$_GET['d'];
    72.     }else{
    73.         $today=date('d');
    74.     }
    75.     $month2=0;
    76.     for($i=1;$i<32;$i++){
    77.         $month2++;
    78.         if($i<10){
    79.             $day="0{$i}";
    80.         }else{
    81.             $day=$i;
    82.         }
    83.         $date1="{$year}-{$month}-{$day}";
    84.         
    85.  
    86.  
    87.         
    88.         if(in_array($date1,$date_array)){
    89.             if($day==$today){
    90.                 echo "<div id=\"today\">";
    91.             }
    92.             echo "<a href=\"".$_SERVER["PHP_SELF"]."?d={$day}\">{$day}</a> ";
    93.             if($day==$today){
    94.                 echo "</div> ";
    95.             }
    96.         }else{
    97.             echo "{$day} ";
    98.         }
    99.         
    100.         if($month2>6){
    101.             echo "<br>\n";
    102.             $month2=0;
    103.         }
    104.     }
    105.     echo "</div>\n";
    106.     //
    107.  
    108.     
    109.     echo "<select name=\"d\">\n";
    110.     echo "<option value=\"\"></option>\n";
    111.     for($i=1;$i<32;$i++){
    112.         if($i<10){
    113.             $day="0{$i}";
    114.         }else{
    115.             $day=$i;
    116.         }
    117.         echo "<option "; 
    118.         if($_GET['d']==$i)
    119.             echo "selected";
    120.         echo " value=\"{$day}\">{$day}</option>\n";
    121.     }
    122.     echo "</select>\n";
    123.     
    124.     
    125.     echo "<select name=\"m\">\n";
    126.     echo "<option value=\"\"></option>\n";
    127.     for($i=1;$i<13;$i++){
    128.         if($i<10){
    129.             $month="0{$i}";
    130.         }else{
    131.             $month=$i;
    132.         }
    133.         echo "<option ";
    134.         if($_GET['m']==$i)
    135.             echo "selected";
    136.         echo " value=\"{$month}\">{$month}</option>\n";
    137.     }
    138.     echo "</select>\n";
    139.     
    140.     echo "<select name=\"y\">\n";
    141.     echo "<option value=\"\"></option>\n";
    142.     for($i=2012;$i<2023;$i++){
    143.         echo "<option ";
    144.         if($_GET['y']==$i)
    145.             echo "selected";
    146.         echo " value=\"{$i}\">{$i}</option>\n";
    147.     }
    148.     echo "</select><br>\n";
    149.     echo "</div>\n";
    150.     
    151.     
    152.     echo "Искать по IP: \n";
    153.     echo "<input type=\"text\" name=\"IP\"><br>\n";
    154.     echo "<input type=\"submit\" name=\"submit\" value=\"искать\">\n";
    155.     echo "<input type=\"submit\" name=\"res\" value=\"сбросить\">\n";
    156.     echo "<form>\n";
    157.     echo "</div>\n";
    158.     
    159. }
    160.  
    161. if($_GET['logout']){
    162.     setcookie("admin_hash", $admin_hash, time()-3600);
    163.     $_SESSION['login']=false;
    164. }
    165.  
    166. if(!$_SESSION['login']){
    167.     if($_COOKIE['admin_hash']!=$admin_hash){
    168.         aut_menu($admin_login, $admin_password, $admin_hash);
    169.     }else{
    170.         $_SESSION['login']=true;
    171.         header("Location: ".$_SERVER["REQUEST_URI"]."");
    172.     }
    173. }else{
    174.  
    175.  
    176.     admin_links($db, $num);
    177.     
    178.     $sql="SELECT * FROM wp_numbers ";
    179.     $sql2="SELECT COUNT(*) FROM wp_numbers ";
    180.     
    181.     if($_GET['number']){
    182.         $sql.="WHERE number='{$_GET['number']}' ";
    183.         $sql2.="WHERE number='{$_GET['number']}' ";
    184.     }
    185.     if($_GET['IP']){
    186.         if($_GET['number']){
    187.             $sql.="AND ip='{$_GET['IP']}' ";
    188.             $sql2.="AND ip='{$_GET['IP']}' ";
    189.         }else{
    190.             $sql.="WHERE ip='{$_GET['IP']}' ";
    191.             $sql2.="WHERE ip='{$_GET['IP']}' ";
    192.         }
    193.     }
    194.     
    195.     if($_GET['d'] || $_GET['m'] || $_GET['y']){
    196.         if(!$_GET['d']){
    197.             $d=date('d');
    198.         }else{
    199.             $d=$_GET['d'];
    200.         }
    201.         if(!$_GET['m']){
    202.             $m=date('m');
    203.         }else{
    204.             $m=$_GET['m'];
    205.         }
    206.         if(!$_GET['y']){
    207.             $y=date('Y');
    208.         }else{
    209.             $y=$_GET['y'];
    210.         }
    211.  
    212.         $dat="{$y}-{$m}-{$d}";
    213.         
    214.         if($_GET['number'] || $_GET['IP']){
    215.             $sql.="AND ";
    216.             $sql2.="AND ";
    217.         }else{
    218.             $sql.="WHERE ";
    219.             $sql2.="WHERE ";
    220.         }
    221.         $sql.=" date='{$dat}' ";
    222.         $sql2.=" date='{$dat}' ";
    223.         
    224.     }
    225.     $page=$_GET['page'];
    226.     $result=$db->sql($sql2);
    227.     $posts = mysql_result($result, 0); 
    228.     $total = intval(($posts - 1) / $num) + 1; 
    229.     $page = intval($page); 
    230.     if(empty($page) or $page < 0)
    231.         $page = 1; 
    232.     if($page > $total)
    233.         $page = $total; 
    234.     $start = $page * $num - $num;
    235.     
    236.     if($_GET['d']||$_GET['m']||$_GET['y']||$_GET['number']||$_GET['ip']){
    237.         $url_sep="?d={$_GET['d']}&m={$_GET['m']}&y={$_GET['y']}&number={$_GET['number']}&ip={$_GET['ip']}&";
    238.     }else{
    239.         $url_sep="?";
    240.     }
    241.     
    242.     
    243.     if ($page != 1) $pervpage = "[url=".$_SERVER["]<[/url] "; 
    244.  
    245.     if ($page != $total) $nextpage = " [url=".$_SERVER["]>[/url]"; 
    246.  
    247.  
    248.     if($page - 2 > 0) $page2left = " [url=".$_SERVER["]". ($page - 2) ."[/url] | "; 
    249.     if($page - 1 > 0) $page1left = "[url=".$_SERVER["]". ($page - 1) ."[/url] | "; 
    250.     if($page + 2 <= $total) $page2right = " | [url=".$_SERVER["]". ($page + 2) ."[/url]"; 
    251.     if($page + 1 <= $total) $page1right = " | [url=".$_SERVER["]". ($page + 1) ."[/url]";
    252.  
    253.     
    254.     
    255.     $sql.="ORDER BY id DESC LIMIT {$start}{$num}";
    256.     
    257.     
    258.     
    259.     
    260.     $result=$db->sql($sql);
    261.     $i=0;
    262.     while($row=mysql_fetch_assoc($result)){
    263.             $users[$i]=$row;
    264.             $i++;
    265.     }
    266.     
    267.     echo "<div id=\"navigation\">\n";
    268.     echo $pervpage.$page2left.$page1left."<b>".$page."</b>".$page1right.$page2right.$nextpage;
    269.     echo "</div>\n";
    270.     
    271.     if($_GET['number']) $td1="<td class=\"active\">"; else $td1="<td>";
    272.     if($_GET['ip']) $td2="<td class=\"active\">"; else $td2="<td>";
    273.     if($_GET['d'] || $_GET['m'] || $_GET['y']) $td3="<td class=\"active\">"; else $td3="<td>";
    274.     
    275.     echo "<table width=\"100%\">\n";
    276.     echo "<tr align=\"center\">{$td1}номер перехода</td>{$td3}Дата</td>{$td2}IP</td><td>Запрошенная страничка</td><td>поисковик / сайт</td><td>поисковый запрос</td></tr>\n";
    277.     $lenght=count($users);
    278.     for($i=0;$i<$lenght;$i++){
    279.         if(!$users[$i]['request']){ //если запрос пустой - отделяем домен от хлама
    280.             $array=explode("/url?",$users[$i]['domain']);
    281.             $users[$i]['domain']=$array[0];
    282.             $array=explode("/imgres?",$users[$i]['domain']);
    283.             $users[$i]['domain']=$array[0];
    284.             if($array[1]){
    285.                 $users[$i]['request']="Вероятно, это был запрос с гугл-картинок о_О";
    286.             }
    287.             $array=explode("/dk?",$users[$i]['domain']);
    288.             $users[$i]['domain']=$array[0];
    289.             if($array[1]){
    290.                 $users[$i]['request']="Одноклассники";
    291.             }
    292.             $array=explode("/web?",$users[$i]['domain']);
    293.             $users[$i]['domain']=$array[0];
    294.             if($array[1]){
    295.                 $users[$i]['request']="Экзотические поисковики парсить не получается :(";
    296.             }
    297.             
    298.         }
    299.         
    300.         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";
    301.     }
    302.     echo "</table>";
    303.     
    304.     echo "<div id=\"navigation\">\n";
    305.     echo $pervpage.$page2left.$page1left."<b>".$page."</b>".$page1right.$page2right.$nextpage;
    306.     echo "</div>\n";
    307.     
    308.     include "footer.html";
    309. }
    310. ?>
    говнокод дичайший, но результат мне нравится:
    [​IMG]

    Авторизация, разные параметры поиска, постраничная навигация, календарик :)
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    чтоб стастику по человекам не портили.
     
  7. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Чтобы базу данных не захламляли
     
  8. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Зачем мне в базе данных хлам, если мне он там совершенно не нужен?
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а это он написал чтобы ссылочку в подписи оставить на форуме. и хомпага тоже.
     
  10. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Кстати да, ссылки на хомепагу не закрыты нофоловом и ноиндексом.

    Добавлено спустя 9 минут 53 секунды:
    То-есть ссылка на мой http://xcont.com вполне индексируется поисковиками.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    они все равно не знают вобще о таких вещах. просто постят и постят.
     
  12. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Есть чудная модификация на phpBB-форумы - DetectorBots. 99% ботов срезает. Если бот постит где-то ссылку - в подписи, в сообщении, в личных сообщениях - аккаунт удаляется. Можно выставить ограничение - 5 сообщения. После 5 сообщения пользователь может нормально общаться на форуме.

    У меня на форуме по 300-400 сообщений в день отсеивает.
    [​IMG]
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    напиши в топик по модам на форум. в разделе про форум =)