Matomo/Réflexions version2/SearchEnginesDetection

Un livre de Wikilivres.

Description[modifier | modifier le wikicode]

Fonctionnalité qui serait vraiment très intéressante. Via un tag en PHP, collé après ou avant le tag javascript (et non pas dans le noscript car ce noscript n'est pas exécuté par tous les moteurs de recherche !!), on enregistre les logs des visiteurs détectés comme étant des moteurs de recherche. Liste des moteurs connus disponibles sur robots.net/robots.txt ou semblant. Faire une liste des moteurs assez exhaustive tant que possible, sans bien sûr prendre en compte les robots qui ne sont pas des moteurs de recherche (toutes saloperies diverses :))

Une fois les logs des robots enregistrés (forme des logs à déterminer), avec le plus d'informations possibles (que nous fournit PHP donc, car les infos JavaScript ne sont pas dispos), on crée des rapports sur la visite des robots qui sont intégrés à phpMyVisites. Pour créer les rapports il faut bien sûr faire un archivage dans le même esprit que celui de phpmyvisites. On parcourt les logs pour enregistrer toutes les données sous forme préformatées, la plupart du temps sous forme de tableaux PHP sérialisés.

On profite alors de toute l'architecture de base de l'appli. Ce module serait accessible via un nouveau menu « Moteurs ». Présentation contenu à déterminer.

Les stats disponibles pourraient être (à compléter par de bonnes idées)

  • par robot différent
  • nombre de visites dans la période
  • nombre de pages vues dans la période
  • liste des pages vues par URL physique, avec possibilité d'exclure des paramètres définis OU de ne prendre en compte que certains des paramètres des URLs (définition de ces paramètres dans l'administration)
  • heure de visites de chaque robot
  • autres ?
  • globalement
  • nombre de visites/nombre de pages vues
  • heures de passage
  • graphique camembert de répartition de l'activité des robots en nb de pages vues sur la période (Google bot : 70%, MSN : 20%, etc.) (utiliser bien sûr la lib déjà utilisée dans phpmv)
  • autres ?
  • Autre données.. idées dans la salle ?


Au niveau logs, calculs, archivages : il faut à mon avis internaliser le process à phpmyvisites directement.

  • On log à partir du moment où le tag PHP appelle le script, normal.
  • On calcule les données relatives aux robots au moment de l'archivage des stats classiques.

Les robots ont a mon avis une propre table d'archivage spécifique. Les pages qu'ils ont vues sont caractérisées par des ID reliées aux URL dans une table crée et alimentée lors de l'archivage. On utilise le même principe de nommage des pages, sauf que en plus de la variable javascript pagename qui contient le nom de la page, on assigne également une variable php $namepage qui sera utilisée à la place de l'URL pour savoir quelles pages ont visitées les robots. Si ce nom n'est pas renseigné, on utilise l'url brute, mais ça peut faire mal si le site a 10000 urls différentes (de Mo de textes en base qui font mal).

Allure du code PHP[modifier | modifier le wikicode]

<?php
$pagename = ; // valeur a remplir, sinon l'URL sera utilisée
include "http://www.site.com/phpmyvisites/searchengines.php";
?>
Le tag devra plutôt être de la forme :
<?php
$pagename = ; // valeur a remplir, sinon l'URL sera utilisée
include "/data/members/paid/l/e/monsite.com/htdocs/www/phpmyvisites/searchengines.php";
?>
car il faut que le fichier travail en local. L'adresse sera calculée lors de l'installation.--Jidébé 22 jul 2005 à 22:53 (UTC)
En fait j'ai réfléchi et mieux vaut que le code print une image du style
<?php
$pagename = ; // valeur a remplir, sinon l'URL sera utilisée
print("<img src=\"http://site.com/phpmv/searchengines.php?para1=TOTO&param2=".$_SERVER['truc']");;
?>
non ?
tout dépend en fait des infos qu'on ne peut prendre que via php (pas grand chose normalement), qu'en penses tu ? Matthieu Aubry 22 jul 2005 à 23:57 (UTC)
Là, tu m'intéresse. C'est effectivement une bonne idée et probablement la solution aux sites hébergés sur un autre serveur que phpMyVisites. je vais tester ça.--Jidébé 23 jul 2005 à 09:17 (UTC)

Voila un tag qui devrait fonctionner :

<?php
$pagename = ; // valeur a remplir, sinon l'URL sera utilisée
$_SERVER = $HTTP_SERVER_VARS; // ligne inutile !
$url = $_SERVER['REQUEST_URI'];
$url = urlencode($url); // mettre les urlencode directement au dessus urlencode($_SERVER['REQUEST_URI']);
$ip = $_SERVER['REMOTE_ADDR'];
$agent = $_SERVER['HTTP_USER_AGENT'];
$agent = urlencode($agent);
print("<img src=http://www.site.com/phpmv/searchengines.php?url=$url&ip=$ip&agent=$agent>");
?>

Je suis en train de le tester.--Jidébé 23 jul 2005 à 16:11 (UTC)

ok tiens moi au courant ! Matthieu Aubry 24 jul 2005 à 11:10 (UTC)
Marco => La piste de l'image est une fausse piste, les robots ne vont pas l’appeler, en tout cas très rarement. Il faut utiliser un formulaire http et l'envoyer à l'aide de fsockopen, fputs, fclose, il y a des exemples dans mon code interrogation des FAI (http://www.webmaster-experience.net/telechargement/avfpp.tar.gz). On pourrait aussi utiliser curl mais ce n'est pas présent chez beaucoup d'hébergeurs.Il ne me semble pas utile d'utiliser urlencode. Cela permet d'avoir un tag PHP qui fonctionne même si le site audité n'est pas sur le même serveur que phpMyVisites. On peut imaginer dans l'avenir fournir des tags en java, asp... La solution noscript, comme celle de l'image est à écarter. Ensuite il faut bien voir comment détecter les robots, il faut trouver une solution pérenne et si on passe par une liste récupéré sur un site il faut bien vérifier que la licence d’utilisation soit compatible.
Marco Après réflexion, l'idée de faire une requête http me parait pas très judicieuse car ça va vraiment ralentir l'affichage. Je suis pour mettre un tag PHP uniquement dans le cas où le site audité est sur le même serveur.
Matthieu 26 jul 2005 à 17:28 (UTC) moi je suis contre le fait que le script doit être sur le serveur, ce n'est pas du tout pratique et c'est contre la politique actuelle de phpmyvisites qui est de tout centraliser dans le /phpmyvisites/. On oblige les webmasters à mettre le tag php juste avant </html> point final, ça ne ralentira pas les page comme ça. Et une requête http aussi basique que celle là ne doit vraiment pas poser problème je pense (a vérifier par des tests)


Pour la requête HTTP, à partir du code de Marco j'ai testé ça :


<?php
$url =urlencode($_SERVER['REQUEST_URI']);
$ip = $_SERVER['REMOTE_ADDR'];
$agent =urlencode($_SERVER['HTTP_USER_AGENT']);

$variablescodees = "url=".$url."&ip=".$ip."&agent=".$agent;

$urlphpmv = parse_url("http://www.monsite.com/phpmyvisites/searchengine.php");

$fp = fsockopen($urlphpmv['host'],80);
if(!$fp)
{
echo"probleme";
}

fputs($fp,sprintf("POST %s%s%s HTTP/1.0\n",$urlphpmv['path']));
fputs($fp, "host: {$urlphpmv['host']}\n");
fputs($fp,"Content-type: application/x-www-form-urlencoded\n");
fputs($fp, "Content-length:".strlen($variablescodees)."\n");
fputs($fp,"Connection: close\n\n");
fputs($fp,"$variablescodees\n");
$ligne =fgets($fp);
echo"$ligne";
fclose($fp);
?>

Je n'ai pas d'affichage de "probleme", donc à priori la connection se fait, le echo"$ligne"; me donne :

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

mais rien ne se passe (pas de prise en compte de la visite), pourquoi?

--Jidébé 28 jul 2005 à 08:44 (UTC)J'ai modifié mon tag comme ça :
<?php
$url =urlencode($_SERVER['REQUEST_URI']);
$ip = $_SERVER['REMOTE_ADDR'];
$agent =urlencode($_SERVER['HTTP_USER_AGENT']);
$variablescodees = "url=".$url."&ip=".$ip."&agent=".$agent;
$urlphpmv = parse_url("http://www.le-site-des-petits-brun.com/phpmyvisites/searchengines.php");

// initialisation de l’entête

$entete = "POST /phpmyvisites/searchengines.php HTTP/1.1\r\n";
$entete .= "Host: " . $urlphpmv['host'] . "\r\n";
$entete .= "Content-Type: application/x-www-form-urlencoded\r\n";
$entete .= "Content-Length: " . strlen($variablescodees) . "\r\n";
$entete .= "Connection: close\r\n\r\n";
$entete .= $variablescodees . "\r\n";

// ouverture de la connexion

$socket = fsockopen($urlphpmv['host'], 80, $errno, $errstr);
if($socket) // si connexion ok
{
fputs($socket, $entete); // envoi de l'entete
fclose($socket);
}

?>

Si je le met sur une page de mon site ça marche, mais par contre si je le met sur un site hébergé sur un autre serveur (Multimania dans ce cas) ça ne marche pas. Quelqu'un a une idée?

--Jidébé 29 jul 2005 à 11:26 (UTC)Voila pourquoi ça ne marche pas :
Warning: fsockopen, pfsockopen, show_source, php_uname, ini_get, ini_alter, ini_restore, ini_set,
 getrusage, mysql_list_dbs, get_current_user, set_time_limit, getmyuid, getmypid, dl, leak, listen,
 chown, chmod, chgrp, realpath, tmpfile, link, mb_send_mail() has been disabled for security reasons
 in /data/members/free/multimania/fr/s/h/e/shetlandor/htdocs/test2.php on line 67

Je crains donc qu'il n'y ai pas de solution universelle, peut-être il faudra proposer plusieurs forme de tag...

Au niveau des fonctionnalités il faut voir ce que font les outils du marché :

  • webtrends derniere version
  • XITI (le fait il ?)
  • RobotStats (leader php je crois, mais il est naze)
  • AWStats
  • autre ?

pour prendre leurs bonnes idées.


On peut ajouter http://www.php-tools.de/site.php (patSpiderizer) en GPL

Mais attention cette solution exige que le serveur audité comprenne le php et que phpMyVisites soit sur le même serveur. C'est contraignant et limitatif, prévoir une option pour que ce ne soit pas actif. Voir aussi quelles sont les limitations de noscript, ça peut être suffisant.