Voici les bases pour réaliser un tracker de liens sortant. Pour réaliser l'exemple suivant, vous devez avoir à votre disposition un environnement LAMP .
Pour faire appel à la classe, placez ce code entre les balises head de votre page:
<script type="text/javascript" src="XHRConnection.js"></script>
Beaucoup de solutions de tracking utilise des pages de redirection. Nous allons mettre en place ici une autre solution à base de Javascript pour laisser les liens en "dur". Au chargement de la page nous allons définir une action sur le gestionnaire onclick de chaque lien.
Ouvrez votre éditeur et créez le fichier javascript appelé tracker.js et placez le code suivant :
// +------------------------------------------------------------------------+
// | track
// | Entrée :
// | - lnk, référence au lien
// +------------------------------------------------------------------------+
function track (lnk) {
// Création de l'objet
var XHR = new XHRConnection();
// Paramètre à envoyer : l'URL de la page encours
XHR.appendData('urlFrom', document.location.href);
// Paramètre à envoyer : l'URL de la page demandée
XHR.appendData('urlTo', lnk.href);
// Appel du script serveur de tracking
XHR.sendAndLoad('tracker.php', 'POST');
// On retourne true pour permettre au navigateur d'accéder à l'URL demandée
return true;
}
// +------------------------------------------------------------------------+
// | Définition du comportement onclick des liens de la page
// +------------------------------------------------------------------------+
window.onload = function() {
// Parcours de la liste des liens présent dans la page
for (i = 0; i < document.links.length; i++) {
// Définition de l'évènement onclick
document.links.item(i).onclick = function() {
// La valeur du return doit être true, la fonction track retournera true
return track(this);
}
}
}
document.links est un tableau contenant l'ensemble des liens présents dans la page. Il suffit de parcourir ce tableau et pour chaque élément/lien, on indique que lorsque l'utilisateur clique sur le lien, on appelle la fonction track() en passant comme argument une référence au lien en cours. La fonction, via un object XHRConnection, enverra à un script coté serveur (tracker.php) l'URL de la page courante ainsi que l'URL de la page demandée par l'utilisateur. track() renvoit ensuite TRUE afin que le navigateur puisse effectuer la requête utilisateur en accédant à l'URL demandée.
Pensez à inclure le fichier tracker.js de la même façon que vous l'avez fait pour XHRConnection.js
Voici la structure de la table MySQL utilisée :
CREATE TABLE `tracking` ( `trakId` int(10) unsigned NOT NULL auto_increment, `urlFrom` varchar(255) NOT NULL, `urlTo` varchar(255) NOT NULL, `date` datetime NOT NULL, `ip` int(11) NOT NULL, PRIMARY KEY (`trakId`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Voici le script PHP du fichier "tracker.php" :
<?php
// Connectez vous à votre base de données MySQL
// ...
// Faut-il prendre en compe les liens internes, TRUE ou FALSE
define('ACCEPT_INTERNAL_LINK', TRUE);
// Si l'URL demandée et la l'URL de provenance sont connues
if (!empty($_POST['urlTo']) && !empty($_POST['urlFrom'])) {
// Analyse de l'URL passée en paramètre
$arrParse = parse_url($_POST['urlTo']);
// L'URL a une forme correcte et la provenance est connue
if (sizeof($arrParse) > 1 && !empty($arrParse['host'])) {
// Contrôle de l'hôte et vérification du type d'URL
if ((boolean) strcmp($arrParse['host'], $_SERVER['HTTP_HOST']) | ACCEPT_INTERNAL_LINK) {
// Stockage en base de données
mysql_query("
INSERT INTO `tracking` (
`urlFrom`,
`urlTo`,
`date`,
`ip`)
VALUES (
" . $_POST['urlFrom'] . ",
" . $_POST['urlTo'] . ",
now(),
" . ip2long($_SERVER['REMOTE_ADDR']) . "
)
");
}
}
}
?>
La constante ACCEPT_INTERNAL_LINK est un booléen qui permet de prendre en compte dans les liens internes (même domaine) si elle est égale à TRUE. Comme vous pouvez le constater, le script ne retourne rien. Le serveur renverra tout de même les entêtes HTTP.
Le tracking est actif sur ce document. Je vous invite à naviguer également à travers ces trois pages, et même de cliquer sur des liens externes :
Ensuite vous pourrez vous rendre à cette page pour voir le résultat du tracking.
On peut imaginer ajouter plusieurs filtres, de contrôles et même d'ajouter des informations. Je pense en particulier aux liens entrants (bakclink/referer) à envoyer au script serveur. Il est également possible de créer une structures de base de données plus performante (regrouper les URLS, gestion de clés étrangères, tables d'association ...).