En-tête HTTP, les bots ne parlent aucune langue

écrit par Aymeric

http-accept-languageLa semaine dernière, je discutais avec Hervé aka @infiniclick sur la manière de comptabiliser le nombre de lectures sur un article d'un site, dans son CMS dont le nom de code doit rester secret (fais moi confiance, je ne dévoilerai jamais ton back-office).
Mais un problème se posait: comment comptabiliser le nombre de vues d'un billet sans prendre en compte les différents bots qui visitent une URL dès qu'elle vient d'être tweetée (comme l'ami Twitterbot) ?

Bot, tu n'es pas un visiteur

D'abord, il a fallu filtrer quelques User_agent (twitterbot et des API Twitter), mais à force de rajouter des détections, la liste commençait à devenir longue quand Googlebot a fait son apparition:

<?php
$pattern='#(googlebot|yandex|slurp|twitterbot|bing)#ie';
if (!preg_match($pattern,$_SERVER['HTTP_USER_AGENT']) comptabilise();
?>

Mais toujours avec le risque d'en oublier... (spiders et scrapers en tous genres!). Alors je me suis penché sur les en-têtes HTTP renvoyées par ces crawlers. Eureka! Ils avaient tous un point en commun: Le header $_SERVER['HTTP_ACCEPT_LANGUAGE'] qui sert à renvoyer la langue du navigateur aux serveurs est vide, et oui les robots ne parlent aucune langue 🙂

Pourquoi faire compliqué quand on peut faire simple ?

Allez hop, un petit script codé avec les pieds pour vérifier tout ça sur la homepage d'un site avec pas mal de trafic (mon blog? non je déconne ^^):

<?php
if(!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
if (file_exists('acceptedlanguage.txt')) {
$filecontent=file_get_contents('acceptedlanguage.txt');
}
if (!eregi(';'.$_SERVER['HTTP_ACCEPT_LANGUAGE'].';',$filecontent)) $filecontent.= ';'.$_SERVER['HTTP_USER_AGENT'].';'."\n";
file_put_contents('acceptedlanguage.txt', $filecontent);
}
?>

C'est pas faux comme dirait @percevalSEO, la supposition semble vérifiée, excepté pour quelques smartphones qui ne renvoient pas de HTTP_ACCEPT_LANGUAGE et des navigateurs un peu exotiques. Donc plutôt que de faire du cloaking avec des listes de USER_AGENT à rallonge comme ici Bot detection with PHP, une petite ligne pour checker la langue du user_agent suffira, prenons le problème à l'envers. Bon, je n'ai rien inventé: si ça se trouve cette technique est vieille comme Hérode! Bref, du coup Hervé, tu n'as plus qu'a te servir;)

(Spéciale dédicace à @maximedt)

écrit dans Astuces par Aymeric | 11 commentaires

11 commentaires "En-tête HTTP, les bots ne parlent aucune langue"

  • Yoann dit:
  • Florian dit:
  • Mathieu dit:
  • 512banque dit:
  • Hervé dit:
  • percevalSEO dit: