11

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

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)

11 commentaires

  1. Analytics ou Xiti, voir Piwik ne suffisent pas à compter les visites des billets ? Désolé si ma question est idiote…

  2. Aymeric, je suis prêt à payer pour mettre la main sur le CMS d’Hervé, est-ce que ça te tente de gagner de l’argent ? 😉

    • On pourrait le faire en Ajax aussi mais trop compliqué pour moi. Je suis dans ma phase http headers;)

  3. @Aymeric, Florian : je savais qu’Aymeric était un petit filou, mais alors toi 🙂

    Bon en attendant, je vais de ce pas tester ce petit bout de script.

  4. Perso je ne connaissais pas. Il fallait y penser ! Même si j’avoue ne pas en avoir l’utilité :). J’aime bien les pistes que tu explores dans tes derniers billets en tout cas.

    Ps : c’est pas faux pour la mention 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *