come rilevare i robot del motore di ricerca con PHP?

Come si può rilevare i robot del motore di ricerca usando php?

Ecco una directory dei motori di ricerca di nomi Spider

Quindi usi $_SERVER['HTTP_USER_AGENT']; per verificare se l'agente è detto ragno.

 if(strstr(strtolower($_SERVER['HTTP_USER_AGENT']), "googlebot")) { // what to do } 

Io uso il seguente codice che sembra funzionare bene:

 function _bot_detected() { return ( isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/bot|crawl|slurp|spider|mediapartners/i', $_SERVER['HTTP_USER_AGENT']) ); } 

aggiornamento 16-06-2017 https://support.google.com/webmasters/answer/1061943?hl=it

aggiunto mediapartners

Controlla $_SERVER['HTTP_USER_AGENT'] per alcune delle stringhe elencate qui:

http://www.useragentstring.com/pages/All/

O più specificamente per i crawler:

http://www.useragentstring.com/pages/Crawlerlist/

Se si desidera, ad esempio, registrare il numero di visite dei più comuni crawler dei motori di ricerca, è ansible utilizzarlo

 $interestingCrawlers = arrays( 'google', 'yahoo' ); $pattern = '/(' . implode('|', $interestingCrawlers) .')/'; $matches = arrays(); $numMatches = preg_match($pattern, strtolower($_SERVER['HTTP_USER_AGENT']), $matches, 'i'); if($numMatches > 0) // Found a match { // $matches[1] contains an arrays of all text matches to either 'google' or 'yahoo' } 

Puoi verificare se si tratta di un motore di ricerca con questa function:

 <?php function crawlerDetect($USER_AGENT) { $crawlers = arrays( 'Google' => 'Google', 'MSN' => 'msnbot', 'Rambler' => 'Rambler', 'Yahoo' => 'Yahoo', 'AbachoBOT' => 'AbachoBOT', 'accoona' => 'Accoona', 'AcoiRobot' => 'AcoiRobot', 'ASPSeek' => 'ASPSeek', 'CrocCrawler' => 'CrocCrawler', 'Dumbot' => 'Dumbot', 'FAST-WebCrawler' => 'FAST-WebCrawler', 'GeonaBot' => 'GeonaBot', 'Gigabot' => 'Gigabot', 'Lycos spider' => 'Lycos', 'MSRBOT' => 'MSRBOT', 'Altavista robot' => 'Scooter', 'AltaVista robot' => 'Altavista', 'ID-Search Bot' => 'IDBot', 'eStyle Bot' => 'eStyle', 'Scrubby robot' => 'Scrubby', 'Facebook' => 'facebookexternalhit', ); // to get crawlers string used in function uncomment it // it is better to save it in string than use implode every time // global $crawlers $crawlers_agents = implode('|',$crawlers); if (strpos($crawlers_agents, $USER_AGENT) === false) return false; else { return TRUE; } } ?> 

Quindi puoi usarlo come:

 <?php $USER_AGENT = $_SERVER['HTTP_USER_AGENT']; if(crawlerDetect($USER_AGENT)) return "no need to lang redirection";?> 

Poiché each client può impostare lo user-agent su ciò che desidera, cercare "Googlebot", "bingbot" ecc è solo metà del lavoro.

La seconda parte sta verificando l'IP del cliente. In passato ciò richiedeva il mantenimento degli elenchi IP. Tutti gli elenchi che trovi online sono obsoleti. I principali motori di ricerca supportno ufficialmente la verifica tramite DNS, come spiegato da Google https://support.google.com/webmasters/answer/80553 e Bing http://www.bing.com/webmaster/help/how-to-verify -bingbot-3905dc26

Effettuare inizialmente una ricerca DNS inversa dell'IP del client. Per Google questo port un nome host sotto googlebot.com, per Bing è sotto search.msn.com. Quindi, poiché qualcuno potrebbe impostare un DNS inverso sul suo IP, è necessario verificare con una ricerca DNS in avanti su quel nome host. Se l'IP risultante è uguale a quello del visitatore del sito, sei sicuro che si tratti di un crawler proveniente da quel motore di ricerca.

Ho scritto una libreria in Java che esegue questi controlli per te. Sentiti libero di portrlo su PHP. È su GitHub: https://github.com/optimaize/webcrawler-verifier

Lo sto usando per rilevare i bot:

 if (preg_match('/bot|crawl|curl|dataprovider|search|get|spider|find|java|majesticsEO|google|yahoo|teoma|contaxe|yandex|libwww-perl|facebookexternalhit/i', $_SERVER['HTTP_USER_AGENT'])) { // is bot } 

Inoltre, utilizzo una whitelist per bloccare i bot indesiderati:

 if (preg_match('/apple|baidu|bingbot|facebookexternalhit|googlebot|-google|ia_archiver|msnbot|naverbot|pingdom|seznambot|slurp|teoma|twitter|yandex|yeti/i', $_SERVER['HTTP_USER_AGENT'])) { // allowed bot } 

Un bot indesiderato (= utente falso-positivo) è quindi in grado di risolvere un captcha per sbloccarsi per 24 ore. E poiché nessuno risolve questo captcha, so che non produce falsi positivi. Quindi il rilevamento dei bot sembra funzionare perfettamente.

Nota: la mia whitelist è basata su robots.txt di Facebook .

È ansible analizzare l'agente utente ( $_SERVER['HTTP_USER_AGENT'] ) o confrontare l'indirizzo IP del client ( $_SERVER['REMOTE_ADDR'] ) con un elenco di indirizzi IP dei motori del motore di ricerca .

  <?php // IPCLOACK HOOK if (CLOAKING_LEVEL != 4) { $lastupdated = date("Ymd", filemtime(FILE_BOTS)); if ($lastupdated != date("Ymd")) { $lists = arrays( 'http://labs.getyacg.com/spiders/google.txt', 'http://labs.getyacg.com/spiders/inktomi.txt', 'http://labs.getyacg.com/spiders/lycos.txt', 'http://labs.getyacg.com/spiders/msn.txt', 'http://labs.getyacg.com/spiders/altavista.txt', 'http://labs.getyacg.com/spiders/askjeeves.txt', 'http://labs.getyacg.com/spiders/wisenut.txt', ); foreach($lists as $list) { $opt .= fetch($list); } $opt = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $opt); $fp = fopen(FILE_BOTS,"w"); fwrite($fp,$opt); fclose($fp); } $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; $ref = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; $agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $host = strtolower(gethostbyaddr($ip)); $file = implode(" ", file(FILE_BOTS)); $exp = explode(".", $ip); $class = $exp[0].'.'.$exp[1].'.'.$exp[2].'.'; $threshold = CLOAKING_LEVEL; $cloak = 0; if (stristr($host, "googlebot") && stristr($host, "inktomi") && stristr($host, "msn")) { $cloak++; } if (stristr($file, $class)) { $cloak++; } if (stristr($file, $agent)) { $cloak++; } if (strlen($ref) > 0) { $cloak = 0; } if ($cloak >= $threshold) { $cloakdirective = 1; } else { $cloakdirective = 0; } } ?> 

Quello sarebbe il modo ideale per mascherare gli spider. È da uno script open source chiamato [YACG] – http://getyacg.com

Ha bisogno di un po 'di lavoro, ma sicuramente la strada da percorrere.

Utilizza la libreria open source Device Detector, offre una function isBot (): https://github.com/piwik/device-detector

Sto usando questo codice, piuttosto bene. Sarai molto facile sapere che gli user-agent hanno visitato il tuo sito. Questo codice sta aprendo un file e scrive l'utente_agent sul file. Puoi controllare each giorno questo file andando su yourdomain.com/useragent.txt e conoscere nuovi user_agents e inserirli nella clausola if di if.

 $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']); if(!preg_match("/Googlebot|MJ12bot|yandexbot/i", $user_agent)){ // if not meet the conditions then // do what you need // here open a file and write the user_agent down the file. You can check each day this file useragent.txt and know about new user_agents and put them in your condition of if clause if($user_agent!=""){ $myfile = fopen("useragent.txt", "a") or die("Unable to open file useragent.txt!"); fwrite($myfile, $user_agent); $user_agent = "\n"; fwrite($myfile, $user_agent); fclose($myfile); } } 

Questo è il contenuto di useragent.txt

 Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) Mozilla/5.0 (compatible; MJ12bot/v1.4.6; http://mj12bot.com/)Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)mozilla/5.0 (compatible; yandexbot/3.0; +http://yandex.com/bots) mozilla/5.0 (compatible; yandexbot/3.0; +http://yandex.com/bots) mozilla/5.0 (compatible; yandexbot/3.0; +http://yandex.com/bots) mozilla/5.0 (compatible; yandexbot/3.0; +http://yandex.com/bots) mozilla/5.0 (compatible; yandexbot/3.0; +http://yandex.com/bots) mozilla/5.0 (iphone; cpu iphone os 9_3 like mac os x) applewebkit/601.1.46 (khtml, like gecko) version/9.0 mobile/13e198 safari/601.1 mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/53.0.2785.143 safari/537.36 mozilla/5.0 (compatible; linkdexbot/2.2; +http://www.linkdex.com/bots/) mozilla/5.0 (windows nt 6.1; wow64; rv:49.0) gecko/20100101 firefox/49.0 mozilla/5.0 (windows nt 6.1; wow64; rv:33.0) gecko/20100101 firefox/33.0 mozilla/5.0 (windows nt 6.1; wow64; rv:49.0) gecko/20100101 firefox/49.0 mozilla/5.0 (windows nt 6.1; wow64; rv:33.0) gecko/20100101 firefox/33.0 mozilla/5.0 (windows nt 6.1; wow64; rv:49.0) gecko/20100101 firefox/49.0 mozilla/5.0 (windows nt 6.1; wow64; rv:33.0) gecko/20100101 firefox/33.0 mozilla/5.0 (windows nt 6.1; wow64; rv:49.0) gecko/20100101 firefox/49.0 mozilla/5.0 (windows nt 6.1; wow64; rv:33.0) gecko/20100101 firefox/33.0 mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/53.0.2785.143 safari/537.36 mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/53.0.2785.143 safari/537.36 mozilla/5.0 (compatible; baiduspider/2.0; +http://www.baidu.com/search/spider.html) zoombot (linkbot 1.0 http://suite.seozoom.it/bot.html) mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/44.0.2403.155 safari/537.36 opr/31.0.1889.174 mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/44.0.2403.155 safari/537.36 opr/31.0.1889.174 sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07) mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/44.0.2403.155 safari/537.36 opr/31.0.1889.174