Location: PHPKode > scripts > Bot recognizer and dispatcher > bot-recognizer-and-dispatcher/bot_recognizer.ru.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head><title>bot_recognizer: Äåòåêòîð âåá-áîòîâ
</title>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
<style type="text/css">
<!--
body     { font-family:verdana,arial,helvetica;font-size:12px; }
pre { font-family: verdana,arial; font-size:11px; color:#0000FF;
      background-color: #EFEFF0; border: 1px solid #D0D0F0; padding:6px;
}
td   { font-family:arial,helvetica;font-size:12px;}
tr.odd   { background-color: #F0F0F8; color:#000000; }
tr.even  { background-color: #E0E0F0; color:#000000; }
h4       { background-color: #E0E0F0; color:#000000;
           text-align: left; font-size:12px; }
h5       { background-color: #E0E0F0; color:#000000;
           text-align: left; font-size:11px; padding-left:8px;}
-->
</style>
</head>
<body>
<!-- DOC BEGIN -->

<h3>bot_recognizer: Äåòåêòîð âåá-áîòîâ</h3>

Íå ñåêðåò, ÷òî â èíåòå ñåé÷àñ òðóäÿòñÿ òûñÿ÷è áîòîâ, ïåðèîäè÷åñêè ÷èòàþùèõ ñîäåðæèìîå ñàéòîâ, èíäåêñèðóþùèõ,
ïûòàþùèõñÿ ïîñòèòü ñîîáùåíèÿ (ñî ñïàìîì), ñîáèðàþùèõ àäðåñà email (email harvesting) è ò.ä.

<br /><br />
Äàííûé êëàññ ïîçâîëÿåò àâòîìàòèçèðîâàòü ïðîöåññ èäåíòèôèêàöèè áîòà è âûïîëíåíèÿ äàëüíåéøèõ äåéñòâèé (ãåíåðàöèè êîíòåíòà)
â çàâèñèìîñòè îò ðåçóëüòàòîâ èäåíòèôèêàöèè.

<br /><br />
Îñíîâíàÿ èäåÿ íå íîâà - ïðîâåðêà ïî áàçå IP àäðåñà è/èëè ñòðîêè user-agent.
(Êîíå÷íî, ýòîò ìåòîä íå ïîçâîëÿåò îáíàðóæèòü áîòû, èñïîëüçóþùèå ñïóôèíã IP àäðåñà è ñòðîêè àãåíòà.)

<br /><br />
Îïèñàíèÿ áîòîâ ìîãóò áðàòüñÿ êàê èç òåêñòîâîãî ôàéëà (ñòðîêè, ðàçäåëåííûå ñïåö-ñèìâîëîì),
òàê è èç SQL áàçû.
<br /><br />
 ñëó÷àå èñïîëüçîâàíèÿ SQL êàê õðàíèëèùà îïèñàíèé áîòîâ, âîçìîæíî êàê èñïîëüçîâàíèå
äîïîëíèòåëüíîãî êëàññà-îáåðòêè äîñòóïà ê MySQL (âêëþ÷åííîãî â äèñòðèáóòèâ), òàê è êëàññîâ èç Zend Framework
(èñïîëüçóåòñÿ îáúåêò îäíîãî èç êëàññîâ Zend_Db_Adapter_* ).
<br /><br />
Ðàñïîçíàâàíèå áîòà ìîæåò âûïîëíÿòüñÿ ñîâìåñòíîé ïðîâåðêîé IP àäðåñà è ñòðîêè user-agent,
èëè òîëüêî îäíîãî èç ïàðàìåòðîâ.

<br /><br />
 íàñòîÿùèé ìîìåíò êëàññ èìååò ñëåäóþùèé ôóíêöèîíàë:
<ul>
  <li>Çàãðóçêà "íà÷àëüíûõ" îïèñàíèé áîòîâ èç òåêñòîâîãî ôàéëà (îáðàçåö âêëþ÷åí â äèñòðèáóòèâ);
  </li>
  <li>Èìïîðò íà÷àëüíûõ îïèñàíèé èç òåêñò-ôàéëà â SQL-áàçó, äëÿ äàëüíåéøåãî èñïîëüçîâàíèÿ õðàíèëèùà â ÁÄ;
  </li>
  <li>Èìïîðò äîïîëíèòåëüíûõ îïèñàíèé èç âíåøíèõ èñòî÷íèêîâ â èíòåðíåòå èëè èç ñîõðàíåíûõ ôàéëîâ;
    â íàñòîÿùåå âðåìÿ ïîääåðæèâàåòñÿ òîëüêî ôîðìàò ôàéëîâ ñ ñàéòà iplists.com (ñì.ññûëêó â êîíöå äîêóìåíòà);
  </li>
  <li>Îïîçíàíèå áîòà ïî IP àäðåñó è/èëè ïî ñòðîêå user-agent.
      ñëó÷àå èñïîëüçîâàíèÿ ìåòîäà Dispatch(), âûçûâàåòñÿ ñîîòâåòñòâóþùàÿ äàííîìó áîòó ôóíêöèÿ.
    "Äèñïàò÷èíã" ìîæåò ïðîèçâîäèòüñÿ êàê âûçîâ
    óíèêàëüíîé ôóíêöèÿ äëÿ ëþáîãî áîòà, òàê è åäèíûõ ôóíêöèé äëÿ áîòîâ îäíîãî òèïà (íàïðèìåð, äëÿ èíäåêñèðóþùèõ -
    âûçîâ ôóíêöèè 1, äëÿ ñïàì-áîòîâ - ôóíêöèè 2, äëÿ ïðîâåðÿþùèõ óíèêàëüíîñòü êîíòåíòà - 3 è ò.ä.
    <br />Äëÿ áîòîâ, çàðåãèñòðèðîâàííûõ êàê "çëîâðåäíûå", ìîæíî çàäàòü åäèíûé îáùèé îáðàáîò÷èê.
    <br />Ôóíêöèÿ Dispatch() ìîæåò ñðàáàòûâàòü òîëüêî â óêàçàííûé èíòåðâàë âðåìåíè ñóòîê.
  </li>
  <li>Îòëàäêà : óñòàíîâêà "ïñåâäî"-IP àäðåñà è ñòðîêè àãåíòà, äëÿ ïðîâåðêè ðàáîòû Âàøèõ ôóíêöèé â ñëó÷àå çàõîäà íà ñòðàíèöó äàííîãî áîòà.
  </li>
  <li>
  </li>
</ul>
<br />

<h4>Óñòàíîâêà íà ñàéò</h4>
<ul>
  <li>Ïîìåñòèòå ìîäóëü <b>bot_recognizer.php</b> è ôàéë "bot-defs.txt" â ïàïêó íà ñàéòå (åñëè ZEND Framework íå èñïîëüçóåòñÿ,
  ñêîïèðóéòå òàêæå ìîäóëü as_dbutils.php) .</li>
  <li>Âðó÷íóþ îòðåäàêòèðóéòå ïî ìåðå íàäîáíîñòè ôàéë îïèñàíèé "bot-defs.txt" .</li>
  <li>Åñëè ïëàíèðóåòñÿ èñïîëüçîâàíèå SQL ÁÄ êàê õðàíèëèùà îïèñàíèé, âûïîëíèòü îäíîêðàòíî ñêðèïò èìïîðòà import-botdefs.php,
   ïðåäâàðèòåëüíî ïîïðàâèâ â íåì ïàðàìåòðû äîñòóïà ê Âàøåé ÁÄ. Ýòèì Âû çàíåñåòå â ÁÄ íà÷àëüíûé ñïèñîê áîòîâ èç
   ôàéëà "bot-defs.txt". Ïðè ýòîì òàáëèöà îïèñàíèé áóäåò (ïåðå)ñîçäàíà ,
   òàê ÷òî ýòîò ñêðèïò ìîæåò áûòü ïåðåçàïóùåí çàíîâî, åñëè Âû âíåñëè íîâûå èñïðàâëåíèÿ â bot-defs.txt
   è õîòèòå çàãðóçèòü èõ â áàçó.
  </li>
</ul>

<h4>Ïðîñòûå ïðèìåðû èñïîëüçîâàíèÿ</h4>

<pre># Èñïîëüçóåì Dispath() äëÿ àâòî-ñðàáàòûâàíèÿ íà áîòà
require_once('bot_recognizer.php');

$botrec = new CBotRecognizer();
$botrec-&gt;RegisterActionForBots('MicrosoftBots','msn');
$botrec-&gt;RegisterActionForBots('GoogleBots','google');
$botrec-&gt;Dispatch();

echo "Hello, dear Human !"; // îòîáðàæàåòñÿ åñëè áîòîâ íå áûëî äåòåêòèðîâàíî
#...

function MicrosoftBots() {
  die "This text is shown for Microsoft spiders (msn) !";
}
function GoogleBots() {
  die "This text is shown for Google bots";
}
</pre>

<pre># Èñïîëüçóåì GetBotId() è îáðàáàòûâàåì ÈÄ îáíàðóæåííîãî áîòà ñàìè:
require_once('bot_recognizer.php');

$botrec = new CBotRecognizer();
$botid = $botrec-&gt;GetBotId();

if($botrec-&gt;IsMaliciousBot()) die "You are a malicious bot. Get lost !";

switch($botid) {
  case 'goolge' : case 'msn' :
      echo "This is Microsoft or Google bot. Let them in...";
      break;
  case CBotRecognizer::UNDEFINED_BOT:
      die "some undefined bot detected !";
      break;
  case 0:
     echo "Hello, dear Human !"; // this text is shown only if none of MicrosoftBots and GoogleBots called.
     break;
  default: # all other detected bots...
     echo "Bot $botid detected, no particular action for it !";
     break;
}
</pre>

<h4>Èñïîëüçîâàíèå êëàññà CBotRecognizer</h4>

Ïðîñòåéøèé ïðèìåð ïîêàçàí âûøå, âñå ïàðàìåòðû áåðóòñÿ "ïî óìîë÷àíèþ" :
îïèñàíèÿ áîòîâ áåðóòñÿ èç òåêñòîâîãî ôàéëà "bot-defs.txt", êîòîðûé äîëæåí ëåæàòü â îäíîé ïàïêå ñ ìîäóëåì êëàññà,
ìåòîä ïîèñêà - ïî IP è ñòðîêå user-agent.

Èñïîëüçóåìûé ôàéë îïèñàíèé áîòîâ "bot-defs.txt" èìååò ïðîñòîé òåêñòîâûé ôîðìàò, îäíà ñòðîêà - îäíî îïèñàíèå,
ïîëÿ ðàçäåëÿþòñÿ ñèìâîëîì "|". Êàæäàÿ ñòðîêà äîëæíà ñîäåðæàòü 4-5 ïîëåé â ñëåäóþùåì ïîðÿäêå:

<ol>
<li>êîðîòêîå èìÿ (ÈÄ) áîòà (îíî áóäåò âîçâðàùåíî ìåòîäîì GetBotId(), áóäåì íàçûâàòü åãî <b>ÈÄ áîòà</b></li>
<li>íà÷àëüíûé IP àäðåñ,</li>
<li>êîíå÷íûé IP àäðåñ,</li>
<li>ïîäñòðîêà, èäåíòèôèöèðóþùàÿ äàííûé áîò â ñëó÷àå îáíàðóæåíèÿ â user-agent</li>
<li>íåîáÿçàòåëüíûé ïàðàìåòð (bot type) - òèï áîòà</li>
<li>íåîáÿçàòåëüíûé ïàðàìåòð (malicious) - ïðèçíàê "çëîâðåäíîñòè" äàííîãî áîòà</li>
</ol>

<br />Ôðàãìåíò ôàéëà bot-defs.txt
<pre>
msn|65.55.211.113|65.55.211.119|msnbot
msn|65.55.232.22|65.55.232.22|msnbot
google|66.249.71.22|66.249.71.139|Googlebot

alexa|67.202.54.191|67.202.54.191|ia_archiver
yahoo|72.30.142.240|72.30.142.240|Yahoo!
webalta|76.73.62.242|76.73.62.242|webalta crawler

# some malicious bots from kloth.net, "1" in 5-th field means "malicious bot"
rdprm.gouv.qc.ca|207.96.148.8|207.96.148.8||1
easydl|76.10.155.74|76.10.155.74|EasyDL|1
</pre>

Áîëåå îäíîé ñòðîêè ìîãóò èìåòü îäèí è òîò æå ÈÄ áîòà, ò.ê. áîòû îäíîé êîìïàíèè ìîãóò ðàáîòàòü íà ìíîãèõ IP àäðåñàõ è èìåòü ðàçíûå ñòðîêè
user agent. ×òîáû óáåäèòüñÿ â ýòîì, äîñòàòî÷íî ïîñìîòðåòü ëþáîé èç ôàéëîâ ñïèñêîâ áîòîâ íà <a href="http://www.iplists.com/" target="_blank">iplists.com</a>.

<br /><br />

 ñëó÷àå èñïîëüçîâàíèÿ ðåæèìà "DB storage" âîçìîæíû äâà âàðèàíòà ðàáîòû ñ ÁÄ :

<br /><br />

1. ×åðåç îáúåêò êëàññà CDbEngine èç ïðèëàãàþùåãîñÿ ìîäóëÿ <b>as_dbutils.php</b> :

<pre>require_once('as_dbutils.php'); // database access wrapper
require_once('bot_recognizer.php');

$mydb = new CDbEngine(DBTYPE_MYSQL,'localhost','user','password','mydatabase');
$botrec = new CBotRecognizer(array('dbobject'=&gt;$mydb));
#...
$botrec-&gt;Dispatch();
</pre>

<br />
2. Åñëè ñàéò íàïèñàí íà Zend Framework (ZF), ìîãóò ïðèìåíÿòüñÿ Zend-îâñêèå êîìïîíåíòû ðàáîòû ñ ÁÄ :
(â íàøèõ ïðèìåðàõ èñïîëüçóåòñÿ êîìïîíåíò MySQL PDO)

<pre>require_once('Zend/Db.php');
require_once('Zend/Db/Table.php');
require_once('Zend/Db/Adapter/Pdo/Mysql.php');

require_once('bot_recognizer.php');

# create Zend db adapter object...
$mydb = new Zend_Db_Adapter_Pdo_Mysql(
  array( 'host'=&gt; 'localhost',
         'username' =&gt; 'user',
         'password' =&gt; 'password',
         'dbname'   =&gt; 'mydatabase'));

Zend_Db_Table::setDefaultAdapter($dbAdapter);

# the rest is identical:
$botrec = new CBotRecognizer(array('dbobject'=&gt;$mydb));
#...
$botrec-&gt;Dispatch();
</pre>

Ïåðåä èñïîëüçîâàíèåì ðåæèìà "õðàíèëèùà ÁÄ" , íàäî ñîçäàòü òàáëèöó â ÁÄ è çàãðóçèòü â íåå íà÷àëüíîå ñîñòîÿíèå ñïèñêà îïèñàíèé.
Ñîçäàòü òàáëèöó ìîæíî äâóìÿ ñïîñîáàìè :
<ol>

<li>Âûçîâîì ìåòîäà CBotRecognizer::CreateBotDefTable(); â ýòîì ñëó÷àå ñîçäàåòñÿ <b>ïóñòàÿ</b> òàáëèöà [prefix]<b>bot_definitions</b>.
  <br />(<span style="color:#e00; font-weight:bold;">Âíèìàíèå</span>: åñëè òàáëèöà ñ òàêèì æå èìåíåì óæå áûëà â áàçå,
  îíà áóäåò ñòåðòà, òàê ÷òî ïðîâåðüòå âàøè òàáëèöû íà íåñîâïàäåíèå èìåíè, è èñïîëüçóéòå ïîäõîäÿùèé ïðåôèêñ èìåíè òàáëèöû !)
</li>

<li>Âûçîâîì CBotRecognizer::LoadBotDefinitionsFile('',true) : ýòîò ìåòîä (ïåðå)ñîçäàåò ÷èñòóþ òàáëèöó (âûçâàâ CreateBotDefTable())
 è ãðóçèò â íåå íà÷àëüíûå îïèñàíèÿ èç ôàéëà bot-defs.txt . Âîçìîæíî, ïåðåä ýòèì âû çàõîòèòå äîáàâèòü â ôàéë ñâîè îïèñàíèÿ áîòîâ,
 ÷òîáû îíè ñðàçó ïîïàëè â áàçó.
</li>
</ol>

<h4>Ñïèñîê ìåòîäîâ êëàññà</h4>

<br /><br />
<b>CBotRecognizer([$param])</b> - êîíñòðóêòîð êëàññà.
<br /><br />Ïåðåäàííûé <b>$param</b> äîëæåí áûòü àññîöèàòèâíûì ìàññèâîì çíà÷åíèé, ñî ñëåäóþùèìè êëþ÷àìè :
<table border="0" cellspacing="1">

  <tr class="odd"><td><b>êëþ÷</b></td><td><b>íàçíà÷åíèå</b></td></tr>

  <tr class="even"><td><b>tableprefix</b></td>
    <td>Çàäàåò ïðåôèêñ èìåíè òàáëèöû äëÿ îïèñàíèé áîòîâ. Ïî óìîë÷àíèþ ïðåôèêñ <b>botrec_</b>, ïîýòîìó ñòàíäàðòíîå èìÿ
    òàáëèöû - "<b>botrec_bot_definitions</b>".
    </td>
  </tr>

  <tr class="odd"><td><b>dbobject</b></td>
    <td>Ïåðåäàåò îáúåêò äëÿ ðàáîòû ñ ÁÄ, êîòîðûé äîëæåí áûòü çàðàíåå ñîçäàí è ïîäãîòîâëåí äëÿ âûçîâà SQL çàïðîñîâ.
    Ýòî ëèáî îáúåêò îäíîãî èç êëàññîâ <b>Zend_Db_Adapter</b> ëèáî îáúåêò êëàññà <b>CDbEngine</b> object (ñì. as_dbutils.php).
    Ïàðàìåòðû äîñòóïà ê áàçå äîëæíû áûòü óñòàíîâëåíû çàðàíåå (ñì.ïðèìåðû âûøå).
    <br />
    Ïî óìîë÷àíèþ îáúåêò CBotRecognizer ñîçäàåòñÿ â ðåæèìå "ôàéëîâîå õðàíèëèùå".
    Ò.å. åñëè ýëåìåíò "dbobject" â ïåðåäàííîì ìàññèâå îòñóòñòâóåò, êîíñòðóêòîð ïûòàåòñÿ çàãðóçèòü ñïèñîê îïèñàíèé èç bot-defs.txt (èëè äðóãîãî ôàéëà,
    åñëè ïåðåäàí ïàðàìåòð sourcefile').
    <br />
    Ïåðåäàâàÿ ïàðàìåòð dbobject, âû àêòèâèðóåòå ðåæèì "õðàíèëèùà â ÁÄ", òàê ÷òî äàëüíåéøèé ïîèñê áîòîâ áóäåò ïðîèñõîäèòü â ÁÄ.
    </td>
  </tr>

  <tr class="even"><td><b>searchmode</b></td>
    <td>Îäíî èç çíà÷åíèé :
    <br />CBotRecognizer::SEARCH_IP_ONLY,
    <br />CBotRecognizer::SEARCH_IP_OR_AGENT
    <br />èëè CBotRecognizer::SEARCH_AGENT_ONLY.
    <br /><br />
    Ïî óìîë÷àíèþ ðåæèì ïîèñêà - SEARCH_IP_OR_AGENT (equal 1), ïðè êîòîðîì ïîèñê áîòà âåäåòñÿ êàê ïî IP àäðåñó, òàê è ïî ñòðîêå
    user-agent, è åñëè ëþáîå óñëîâèå âûïîëíèòñÿ, ÈÄ íàéäåííîãî áîòà áóäåò âîçâðàùåí êàê ðåçóëüòàò ïîèñêà.
    Äðóãèå çíà÷åíèÿ âêëþ÷àþò ðåæèì ïîèñêà òîëüêî ïî îäíîìó èç ïðèçíàêîâ.
    </td>
  </tr>
  <tr class="odd"><td><b>sourcefile</b></td>
    <td>Ïåðåäàåò èìÿ ôàéëà "íà÷àëüíûõ" çíà÷åíèé îïèñàíèé áîòîâ. Ïåðåáèâàåò ñòàíäàðòíîå "bot-defs.txt"
    </td>
  </tr>
  <tr class="even"><td><b>worktime</b></td>
    <td>çàäàåò "ðàáî÷åå âðåìÿ" äëÿ ôóíêöèè äèñïåò÷èðîâàíèÿ áîòîâ (Dispatch()).
    Åñëè òåêóùåå âðåìÿ îêàæåòñÿ âíå çàäàííîãî èíòåðâàëà, ìåòîä Dispatch() íå âûïîëíèò ñâîåé ðàáîòû è ñðàçó âåðíåò óïðàâëåíèå.
    Çíà÷åíèå ïàðàìåòðà - ñòðîêà â âèäå "HH:MI-HH:MI" èëè ìàññèâ : array($time_from, $time_to). Âðåìÿ äîëæíî áûòü óêàçàíî
    ñ âåäóùèìè íóëÿìè.
    <br />Íàïðèìåð, åñëè çàäàòü èíòåðâàë "05:00-07:00", Dispatch() áóäåò îòðàáàòûâàòü òîëüêî ñ 5 èëè äî 7-ìè ÷àñîâ óòðà.
    </td>
  </tr>

</table>

<br /><br />
<b>CreateBotDefTable()</b> - ñîçäàåò ïóñòóþ òàáëèöó â ÁÄ äëÿ îïèñàíèé áîòîâ. Èìÿ òàáëèöû  [passed_prefix]bot_definitions.
(Ïðåôèêñ â èìåíè ïî óìîë÷àíèþ - "botrec_")

<br /><br />
<b>EmulateBot($ip [, $agent])</b> - çàäàåò ðåæèì ýìóëÿöèè áîòà.
<br />Èñïîëüçóåòñÿ äëÿ îòëàäêè ïîâåäåíèÿ ñàéòà ïðè çàïðîñå îò äàííîãî áîòà. Ïîñëåäóþùèå âûçîâû GetBotID()
è Dispatch() áóäóò òàêèå æå, êà è ïðè çàïðîñå ê ñàéòó îò äàííîãî áîòà (êëèåíòà ñ äàííûì àäðåñîì è ñòðîêîé uaser-agent).

<br /><br />

<b>SetSearchMode($mode)</b> - çàäàåò ìåòîä îïðåäåëåíèÿ áîòà ($mode - îäíî èç çíà÷åíèé CBotRecognizer::SEARCH_IP_ONLY (0),
  CBotRecognizer::SEARCH_IP_OR_AGENT (1) èëè CBotRecognizer::SEARCH_AGENT_ONLY (2).

<br /><br />

<b>GetBotId($ua='',$ip='')</b> - èùåò â áàçå è âîçâðàùàåò ÈÄ áîòà â ñîîòâåòñòâèè ñ IP àäðåñîì è/èëè user-agent.
Åñëè òî÷íîãî ñîîòâåòñòâèÿ íå íàéäåíî, íî â ñòðîêå user-agent îáíàðóæåíî îäíî èç ñëîâ-ïðèçíàêîâ áîòà (spider, crawl è ò.ä.),
âîçâðàùàåòñÿ çíà÷åíèå <b>CBotRecognizer::UNDEFINED_BOT</b> (-1). Åñëè íàéäåííûé áîò ïðèçíàí "çëîâðåäíûì" (malicious), âêëþ÷àåòñÿ 
ñîîòâåòñòâóþùèé ôëàã, è âïîñëåäñòâèè ìåòîä Dispath() âûçîâåò ôóíêöèþ, íàçíà÷åííóþ äëÿ âñåõ malicious - áîòîâ.
<br />Íåîáÿçàòåëüíûå ïàðàìåòðû $ua è $ip='' ìîãóò èñïîëüçîâàòüñÿ, ÷òîáû îïðåäåëèòü áîòà äëÿ íóæíîé ñòðîêè user-agent 
è/èëè IP àäðåñà, âìåñòî àäðåñà è ñòðîêè êëèåíòà. 
Ýòî ìîæåò áûòü ïîëåçíî, íàïðèìåð, ïðè àíàëèçå ëîãîâ äîñòóïà ê ñàéòó.

<br /><b>Âîçâðàùàåìîå çíà÷åíèå</b>: ÈÄ áîòà (ñòðîêà) èëè CBotRecognizer::UNDEFINED_BOT (-1) èëè <b>false</b> åñëè áîò íå äåòåêòèðîâàí.

<br /><br />
<b>LoadBotDefinitionsFile($srcfile='', $clearexisting=false)</b> - ãðóçèò îïèñàíèÿ èç "ñòàíäàðòíîãî" ôàéëà îïèñàíèé,
äîáàâëÿÿ çàïèñè ê óæå ñóùåñòâóþùèì (åñëè åñòü).
Åñëè àêòèâåí ðåæèì "ôàéëîâîãî õðàíèëèùà", îïèñàíèÿ äîáàâëÿþòñÿ âî âíóòðåííèé ìàññèâ â îáúåêòå.
 ïðîòèâíîì ñëó÷àå çàïèñè çàíîñÿòñÿ â òàáëèöó ÁÄ.
<br />
Åñëè ïàðàìåòð $srcfile ïóñò èëè íå ïåðåäàí, çàãðóçêà èäåò èç bot-defs.txt.
<br />Íåîáÿçàòåëüíûé âòîðîé ïàðàìåòð $clearexisting çàäàåò î÷èñòêó (è ïåðå-ñîçäàíèå òàáëèöû â ÁÄ) ñóùåñòâóþùåé áàç îïèñàíèé,
ëèáî î÷èñòêó âíóòðåííåãî ìàññèâà îïèñàíèé (ïðè ðàáîòå â ôàéë-ðåæèìå).

<br /><br />
<b>ImportBotsFromUrl($bot_id, $url,$file_type=0,$malicious=0)</b> ñëóæèò äëÿ èìïîðòà îïèñàíèé áîòîâ èç âíåøíèõ èñòî÷íèêîâ -
íàïðÿìóþ èç ôàéëîâ â èíòåðíåòå èëè èç ñîõðàíåíûõ ëîêàëüíî. Ôàéëû äîëæíû áûòü îäíîãî èç ïîääåðæèâàåìûõ ôîðìàòîâ, íà äàííûé ìîìåíò
ïîääåðæèâàåòñÿ òîëüêî ôîðìàò òåêñòîâûõ ôàéëîâ ñ ñàéòà iplists.com :
<br />

<pre># Ôðàãìåíò ôàéëà èç google.txt file, çàãðóæåííîãî ñ www.iplists.com:
# UA "Mediapartners-Google/2.1"
# UA "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
# UA "gsa-crawler (Enterprise; S4-E9LJ2B82FJJAA; hide@address.com)"
209.185.108
209.185.253
209.85.238
209.85.238.11
209.85.238.4
...
</pre>

Êàê âèäíî âî ôðàãìåíòå, íåêîòîðûå ñòðîêè ñîäåðæàò ñòðîêó user-agent, íåêîòîðûå - îòäåëüíûå IP àäðåñà èëè ïîäñåòè.

<br /><br /><b>ImportBotsFromUrl()</b> ðàçáèðàåò ñîäåðæèìîå ôàéëà, ñîáèðàÿ âñå ñòðîêè user-agent è IP àäðåñîâ äèàïàçîíû
 áàçû, è çàãðóæàåò èõ â ÁÄ ëèáî â ïàìÿòü (â çàâèñèìîñòè îò àêòèâíîãî ðåæèìà õðàíåíèÿ).
IP àäðåñà ïîä-ñåòåé òèïà 209.85.238 êîíâåðòèðóþòñÿ â ñîîòâåòñòâóþùèå äèàïàçîíû (209.85.238.0 - 209.85.238.255).
<br />
Îòìåòèì, ÷òî äëÿ îïòèìèçàöèè áàçû è óñêîðåíèÿ ïîèñêà ïåðåêðûâàþùèåñÿ, âëîæåííûå èëè ïðèìûêàþùèå äèàïàçîíû àäðåñîâ îáúåäèíÿþòñÿ.
Òàê, íàáîð äèàïàçîíîâ 64.68.80, 64.68.81, 64.68.82 ñîëüåòñÿ â îäèí äèàïàçîí IP àäðåñîâ 64.68.80.0 - 64.68.82.255.


<br /><br />
<b>AddBotDefinition($botid, $ipfrom, $ipto=0, $useragent='', $bottypr=0, $malicious=0)</b> - ôóíêöèÿ èñïîëüçóåòñÿ äëÿ âíóòðåííèõ âûçîâîâ,
îíà äîáàâëÿåò îäíî îïèñàíèå áîòà ê òåêóùóþ êîëëåêöèþ (â ïàìÿòè èëè â ÁÄ). Íî òàêæå ìîæåò áûòü ÿâíî âûçâàíà ïðîãðàììèñòîì äëÿ
äîáàâëåíèÿ íîâûõ îïèñàíèé áîòîâ. Íàïðèìåð, ìîæíî ñîçäàòü ôîðìó ââîäà äëÿ àäìèíèñòðàòîðà ñàéòà è ðåçóëüòàòû ââîäà çàíîñèòü â áàçó
ýòîé ôóíêöèåé.

<br /><br />Ïàðàìåòðû ìåòîäà:
<br />
<br /><b>$botid</b> - ÈÄ áîòà, ïîä êîòîðûì îí áóäåò çàðåãèñòðèðîâàí.
<br /><b>$ipfrom</b> - íà÷àëüíûé IP àäðåñ (â âèäå öåëîãî ÷èñëà ! IP-àäðåñ â îêòåòíîé íîòàöèè "nnn.nnn.nnn.nnn" äîëæåí áûòü ïðåäâàðèòåëüíî ïðåîáðàçîâàí
 â integer ñ ïîìîùüþ ìåòîäà FromIpToX32()).
<br /><b>$ipto</b> - êîíå÷íûé àäðåñ äèàïàçîíà. Åñëè ïóñòîé (íîëü), áóäåò ïðèðàâíåí ê $ipfrom (ò.å. äèàïàïçîí áóäåò $ipfrom...$ipfrom).
<br /><b>$useragent</b> - ïîäñòðîêà, ïî íàõîæäåíèþ êîòîðîé â user-agent ìîæíî èäåíòèôèöèðîâàòü äàííîãî áîòà. Íàïðèìåð, "msn" äëÿ Microsoft MSN áîòîâ.
<br /><b>$bottype</b> - òèï áîòà â ñîîòâåòñòâèè ñ âàøåé êëàññèôèêàöèåé.
<br /><b>$malicious</b> - ïðèçíàê "çëîâðåäíîñòè" áîòà (0 èëè 1).

<br /><br />
<b>SetHandlerForBots($callbackfnc,$botlist)</b> - ðåãèñòðàöèÿ ôóíêöèè, âûçûâàåìîé èç ìåòîäà Dispatch() ïðè äåòåêòèðîâàíèè îäíîãî èç óêàçàííûõ áîòîâ.

<br /><br />Ïàðàìåòðû ìåòîäà:
<br />
<br /><b></b> - ñòðîêà ñ èìåíåì âûçûâàåìîé ôóíêöèè.
<br /><b>$botlist</b> - ñòðîêà èëè ìàññèâ, ñîäåðæàùèé ñïèñîê ÈÄ áîòîâ, äëÿ êîòîðûõ âûçûâàåòñÿ äàííàÿ ôóíêöèÿ.
 ñòðîêå èäåíòèôèêàòîðû áîòîâ ìîãóò ðàçäåëÿòüñÿ îäíèì èç ñèìâîëîâ "|" "," ";"
<br />
Ñëåäóþùèå çíà÷åíèÿ äëÿ $botlist ýêâèâàëåíòíû : <b>"msn|google|yahoo"</b> è <b>array('msn','google','yahoo')</b>.
<br />Åñëè Âû õîòèòå çàðåãèñòðèðîâàòü ôóíêöèþ äëÿ ïðî÷èõ (íåîïîçíàííûõ) áîòîâ, ìîæíî èñïîëüçîâàòü âûçîâ <br />
SetHandlerForBots($callbackfnc,CBotRecognizer::UNDEFINED_BOT).

<br /><br />
<b>SetHandlerForTypes($callbackfnc,$bottype)</b> ðåãèñòðèðóåò åäèíóþ ôóíêöèþ-îáðàáîò÷èê äëÿ âñåõ áîòîâ äàííîãî òèïà.
Òèï áîòà - ýòî ïàðàìåòð, óñòàíàâëèâàåìûé Âàìè ïðè ðåãèñòðàöèè áîòà, è çäåñü íåò íèêàêèõ îãðàíè÷åíèé.
Íàïðèìåð, ìîæíî íàçíà÷èòü òèï 0 èíäåêñèðóþùèì áîòàì, òèï 1 - äëÿ ñáîðùèêîâ àäðåñîâ email, òèï 2 - äëÿ ÑÏÀÌ-áîòîâ è ò.ä.,
è êîãäà âñå áîòû áóäóò ðàçáèòû ïî òèïàì, âû ìîæåòå ñ ïîìîùüþ SetHandlerForTypes() çàäàâàòü äëÿ íèõ åäèíûå îáðàáîò÷èêè
âìåñòî (èëè âìåñòå) òîãî, ÷òîáû óêàçûâàòü ïåðñîíàëüíûé îáðàáîò÷èê äëÿ êàæäîãî áîòà.
Åñëè óêàçàí îòäåëüíûé îáðàáîò÷èê äëÿ îáíàðóæåííîãî áîòà, îí áóäåò âûçâàí âìåñòî åäèíîãî îáðàáîò÷èêà òèïà.


<br /><br />
<b>SetMaliciousHandler($funcname)</b> çàäàåò åäèíóþ ôóíêöèþ, âûçûâàåìóþ äëÿ âñåõ "çëîâðåäíûõ" áîòîâ (èìåþùèõ íåíóëåâîé ôëàã malicious).
Åñëè çàðåãèñòðèðîâàòü òàêóþ ôóíêöèþ, îíà áóäåò âûçâàíà äëÿ ëþáîãî <b>çëîáíîãî</b> áîòà íåçàâèñèìî îò åãî ÈÄ, òèïà è ñâÿçàííîãî ñ íèì "ïåðñîíàëüíîãî" îáðàáîò÷èêà.

<br /><br />
<b>IsMaliciousBot()</b> âîçâðàùàåò <b>true</b> åñëè îïîçíàííûé áîò èìååò ñòàòóñ çëîâðåäíîãî.

<br /><br />
<b>GetBotType()</b> âåðíåò òèï îáíàðóæåííîãî áîòà.

Ïîíÿòíî, ÷òî âûçîâ ìåòîäîâ SetHandlerForBots() è SetMaliciousHandler() èìååò ñìûñë òîëüêî ïðè èñïîëüçîâàíèè ôóíêöèè Dispatch().
Åñëè Âû ïðîñòî õîòèòå ïîëó÷èòü ÈÄ áîòà, âûçâàâ ñàìîñòîÿòåëüíî GetBotId() (èëè åãî òèï, èëè ïðèçíàê "çëîâðåäíîñòè"),
ôóíêöèè SetHandlerForBots() è SetMaliciousHandler() âûçûâàòü íåò ñìûñëà.

<br /><br />
<b>Dispatch()</b> âûïîëíÿåò "äèñïåò÷èðîâàíèå" : îí îïîçíàåò ÈÄ áîòà (à òàêæå òèï è çíà÷åíèå ôëàãà malicious) è âûçûâàåò ñîîòâåòñòâóþùóþ
çàðåãèñòðèðîâàííóþ äëÿ áîòà ôóíêöèþ (ëèáî ôóíêöèþ äëÿ äàííîãî òèïà èëè malicious-áîòîâ).
<br />Åñëè áûëî çàäàíî "ðàáî÷åå âðåìÿ" (worktime â êîíñòðóêòîðå êëàññà), Dispatch() áóäåò "ñðàáàòûâàòü íà áîòà" òîëüêî â óêàçàííûé èíòåðâàë
âðåìåíè.
<br /><br />
<b>GetErrorMessage()</b> âîçâðàùàåò òåêñò ñîîáùåíèÿ îá îøèáêå, åñëè îíà ïðîèçîøëà ïðè ïîñëåäíåé âûïîëíåííîé îïåðàöèè (ëèáî ïóñòóþ ñòðîêó).

<br /><br />

<h4>Âñïîìîãàòåëüíûå ôóíêöèè</h4>
<br /><br /><b>FromIpToX32($ipaddr)</b> ïðåîáðàçóåò ïåðåäàííûé IP àäðåñ èç "îêòåòíîé" íîòàöèè (212.56.200.111) â ñîîòâåòñòâóþùåå öåëîå ÷èñëî.
Àíàëîã MySQL-ôóíêöèè INET_ATON().
<br />Åñëè ïåðåäàíûé ïàðàìåòð íå ñîäåðæèò òî÷åê, âîçâðàùàåòñÿ áåç ïðåîáðàçîâàíèé.

<br /><br />
<b>FromX32ToIp($ipx32)</b> - âûïîëíÿåò îáðàòíîå ïðåîáðàçîâàíèå (â "nnn.nnn.nnn.nnn"), àíàëîã MySQL INET_NTOA().

<br />
<hr />
<div style="text-align:right">Ðàñïðîñòðàíÿåòñÿ ïî ëèöåíçèè <a href="http://www.opensource.org/licenses/bsd-license.php" target="_blank">BSD License</a></div>

<h4>Ññûëêè</h4>
<ul>
  <li><a href="http://www.iplists.com/" target="_blank">iplists.com</a> "IP Addresses of Search Engine Spiders" ñáîðíèê òåêñòîâûõ ôàéëîâ ñïèñêîâ IP àäðåñîâ è ñòðîê user-agent
  íåñêîëüêèõ îáùåèçâåñòíûõ áîòîâ.</li>
  <li><a href="http://www.spanishseo.org/how-to-identify-user-agents-and-ip-addresses-for-bot-blocking" target="_blank">Ïîëåçíàÿ
  ñòàòüÿ íà spanishseo.org</a> î ñïîñîáàõ ðàñïîçíàâàíèÿ áîòîâ, âêëþ÷àÿ "çëîáíûå". Îïèñûâåò íåòðèâèàëüíûå ìåòîäû îáíàðóæåíèÿ
  òèïà reverce è forward DNS ëóêàïîâ.</li>
  <li><a href="http://www.kloth.net/internet/badbots.php" target="_blank">Ñïèñîê "ïëîõèõ" áîòîâ íà kloth.net. Ïàðà àäðåñîâ âçÿòà îòòóäà
  â ôàéë bot-defs.txt êàê îáðàçöû "çëîâðåäíûõ" (malicious) áîòîâ (õîòÿ çëîâðåäíîñòü èõ âûðàæàåòñÿ òîëüêî â òîì, ÷òî îíè èíäåêñèðóþò íå èñïîëüçóÿ ôàéë robots.txt)</a></li>
</ul>

<H4>Èñòîðèÿ èçìåíåíèé</H4>

<h5>1.00.001 (17.09.2009)</h5>
<ul>
  <li>Ïåðâàÿ ïóáëèêàöèÿ</li>
</ul>

<!-- DOC END -->
<br />
<hr>
<div align=center><font size=-2>Copyright &copy; Alexander Selifonov, <a href="http://www.selifan.ru">www.selifan.ru</a>
</font></div>
</body></html>
Return current item: Bot recognizer and dispatcher