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
- trocha důvtipu
- seznam botů lite
- strlen, str_ireplace
- $_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 😉