Jak na detekci botů (google, seznam)

Potřeboval jsem rychlou detekci botů v kódu, něco jednoduchého a přesto dostatečně účinného. No jo, způsobů, jak detekovat bota je spousta, ale který použít, aby byl nenáročný na konfiguraci, kód, …

Inu pomyslel jsem si, že taková šikovná php funkce, jako get_browser, by to docela jistě mohla mít nějak ošetřené a informace budou v browscap.ini dostupné. Hmm, nejsou.

Co budeme k detekci bota potřebovat

  1. trocha důvtipu
  2. seznam botů lite
  3. strlen, str_ireplace
  4. $_SERVER[„HTTP_USER_AGENT“]

Je příchozí uživatel bot?

Mnozí namítnou, že HTTP_USER_AGENT se dá v hlavičce podvrhnout. Samozřejmě, ale opravdu je potřeba mít naši detekci bulletproof?

Jednoduchá detekce je založena na skutečnosti, že téměř každé spojení uživatele je identifikováno řetězcem $_SERVER[„HTTP_USER_AGENT“], které nám hlásí, za normálních okolností, jaký že to prohlížeč k nám promlouvá.
Boti google, seznamu a jiných mají vlastní identifikační řetězce a podle nich se dají vcelku rychle rozpoznat.

Jak získat identifikační řetězce?

Buďto si je zjistíte z logu apache, anebo prostě někde na netu.

K čemu strlen a str_ireplace?

Tady nastíním onen důvtip, strlen slouží ke zjištění délky řetězce a str_ireplace pak k nahrazování podřetězců jinými. Nám pak postačí zjistit původní délku v $_SERVER[„HTTP_USER_AGENT“] a nahradit všechny známé boty prázdným řetězcem v něm a porovnat obě velikosti řetězců. Pokud je příchozí bot, zkrátí se řetězec a my díky tomu víme, že bychom některé věci v našem enginu neměli provádět (zůstanou dostupné pouze uživatelům)

Výsledný kód

Není potřeba nadále napínat, mnozí jistě již dávno vědí, co chtěl básnik říci, pro nováčky, ale výsledný kód níže

$bots=array('googlebot','seznambot'); // seznam botů lite
$ual=strlen($_SERVER["HTTP_USER_AGENT"]); // délka původního řetězce
$bal=strlen(str_ireplace($bots,'',$_SERVER["HTTP_USER_AGENT"])); // délka druhého
$jeBot=$ual!=$bal;
?>

Update

19.10.2011
a co takhle strpos? myslel jsem si, že strpos ma vstupně k hledání pouze string, ale dle dokumentace bere i mixed, což znamená, že programátor php musí dozajista zkusit test.php, ve kterém ochočí strpos vůčic botu v $_SERVER[„HTTP_USER_AGENT“] a array(%bot list,)

funguje to vůbec? nějak se mi to bez vína nechce zkoušet 😉

Jde to i jednodušeji

předpokládat, že každý z nás je bot 😉