web-dev-qa-db-fra.com

Développer un pixel de suivi

J'essaie de créer un pixel qui permet de suivre l'URL actuelle de l'utilisateur lors de sa visite. Je peux utiliser JS (préféré) ou un pixel d'image 1x1. Avec JS, je suppose que je devrais exécuter une demande AJAX vers un script PHP pour capturer les informations dont j'ai besoin et avec un pixel d'image, j'ai des problèmes pour obtenir l'URL actuelle. 

J'ai également pensé à l'URL encodant l'URL actuelle avec JS et plaçant de manière dynamique le pixel d'image avec l'URL actuelle encodée en tant que chaîne de requête dans un script PHP, mais cela peut être très long. 

Si je dois emprunter la route AJAX, quelle bibliothèque AJAX puis-je utiliser? JQuery est trop lourd pour cela. 

D'autres idées?

32
Alex Markov

Vous pouvez écrire un script qui crée et renvoie une image .gif, .jpeg ou .png en utilisant PHP à des fins de suivi en utilisant Gd library (qui est souvent distribué avec PHP dans les versions modernes). Si vous n'avez pas accès à Gd, vous pouvez toujours recompiler PHP avec Gd activé.

Exemple:

pixel.php (commenté pour les besoins de l'explication):

<?php

  // Create an image, 1x1 pixel in size
  $im=imagecreate(1,1);

  // Set the background colour
  $white=imagecolorallocate($im,255,255,255);

  // Allocate the background colour
  imagesetpixel($im,1,1,$white);

  // Set the image type
  header("content-type:image/jpg");

  // Create a JPEG file from the image
  imagejpeg($im);

  // Free memory associated with the image
  imagedestroy($im);

?>

Dans un exemple simple, vous pouvez ensuite appeler ce pixel de suivi en utilisant l'URL exemple suivante dans un courrier électronique ou une autre page:

<img src="http://example.com/pixel.php?a=value1&b=value2&c=value3">



Utilisation de variables:

Dans votre pixel.php, vous pouvez ensuite analyser et interpréter toutes les variables $_GET qui lui sont transmises dans la balise image, de manière simpliste:

if (isset($_GET['a'])) {
  // (Do|log) act on a
}
if (isset($_GET['b'])) {
  // (Do|log) act on b
}
if (isset($_GET['c'])) {
  // (Do|log) act on c
}

Appliquez et répétez autant de fois que vous le souhaitez, mais vous pouvez être assez sophistiqué et surtout avoir accès à de nombreuses informations sur l'utilisateur grâce à la possibilité de définir des vars sur la chaîne $_GET.

Un exemple plus applicable pourrait être:

<img src="http://example.com/pixel.php?userid=98798&campaign=302&last=8">



Suivi de plus que des variables $ _GET:

Vous pouvez également obtenir beaucoup plus d'informations en utilisant PHP, telles que:

// Server variables
$ip = $_SERVER['REMOTE_ADDR'];
$referer = $_SERVER['HTTP_REFERER'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
$browser = get_browser(null, true);
etc...

et ensuite peut-être insérer dans une table de suivi dans votre base de données: 

$sql = "INSERT INTO campaign_tracking 
        ('when','campaign','last','ip','useragent') 
        VALUES 
        (NOW(),'$campaign','$last','$ip','$useragent')";

Il s'agit de la méthode de base a(the) largement utilisée pour le suivi des campagnes de marketing par courrier électronique, en particulier en PHP, mais la même méthode est applicable à l'aide d'autres langages et bibliothèques de script/programmation - et à d'autres fins également.

Informations complémentaires et utiles sur D.ieu:

54
nickhar

Voici une autre implémentation PHP d'un pixel de suivi, du projet Open Web Analytics , qui tente en gros d'être un clone PHP de Google Analytics. 

Il renvoie une image GIF 1x1 transparente (sans utiliser de bibliothèque d'images PHP!), Avec un en-tête sans cache (important pour un suivi précis), et vide la sortie afin que vous puissiez continuer à traiter les analyses sans blocage de la réponse HTTP (performance). Cela semble être une mise en œuvre assez avancée, qui vaut la peine d’être essayée.

<?php
ignore_user_abort(true);

// turn off gzip compression
if ( function_exists( 'Apache_setenv' ) ) {
  Apache_setenv( 'no-gzip', 1 );
}

ini_set('zlib.output_compression', 0);

// turn on output buffering if necessary
if (ob_get_level() == 0) {
  ob_start();
}

// removing any content encoding like gzip etc.
header('Content-encoding: none', true);

//check to ses if request is a POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // the GIF should not be POSTed to, so do nothing...
  echo ' ';
} else {
  // return 1x1 pixel transparent gif
  header("Content-type: image/gif");
  // needed to avoid cache time on browser side
  header("Content-Length: 42");
  header("Cache-Control: private, no-cache, no-cache=Set-Cookie, proxy-revalidate");
  header("Expires: Wed, 11 Jan 2000 12:59:00 GMT");
  header("Last-Modified: Wed, 11 Jan 2006 12:59:00 GMT");
  header("Pragma: no-cache");

  echo sprintf('%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%',71,73,70,56,57,97,1,0,1,0,128,255,0,192,192,192,0,0,0,33,249,4,1,0,0,0,0,44,0,0,0,0,1,0,1,0,0,2,2,68,1,0,59);    
}

// flush all output buffers. No reason to make the user wait for OWA.
ob_flush();
flush();
ob_end_flush();

// DO ANALYTICS TRACKING HERE
46
thaddeusmt

La sortie 1px x 1px de cette façon:

header('Content-type: image/png');
echo gzinflate(base64_decode('6wzwc+flkuJiYGDg9fRwCQLSjCDMwQQkJ5QH3wNSbCVBfsEMYJC3jH0ikOLxdHEMqZiTnJCQAOSxMDB+E7cIBcl7uvq5rHNKaAIA'));
9
Eldar

Voici un pixel de suivi extrêmement simplifié écrit en PHP.

Comment fonctionne un pixel de suivi

Un pixel de suivi est comme la balise la plus primitive possible, et il exploite un fait de pages Web: les images sont une demande distincte de la page.

Si vous êtes déjà capable d'exécuter votre code JS sur la page de quelqu'un d'autre, vous devez simplement POST renvoyer les données sur votre serveur. Pas besoin d'afficher un petit pixel qui ne recevra que le même type de données.

3
John Kawakami

C'est un problème similaire avec cet effet, puisqu'un appel à une fonction pour exécuter une marque indiquant quand l'e-mail a été vu ou ouvert a été introduit dans l'alt du pixel, mais ne lance pas l'action correctement.

<img src="https://datafeeds.baruwa.com/1x1spacer.gif" width="1" height="1" alt="Web Bug from https://devorpenguin.des1.net/module/cartabandonmentpro/FrontCartAbandonment?token_cart=87c83b8f77318a54fdd6be91aacc3574&amp;id_cart=1002&amp;action=visualize&amp;wichRemind=1">

public static function visualize()
{

    $wichRemind = Tools::getValue('wichRemind');
    $id_cart = Tools::getValue('id_cart');
    $token = Tools::getValue('token_cart');

    if ($token == md5(_COOKIE_KEY_.'recover_cart_'.$id_cart)) {
        $query = "UPDATE "._DB_PREFIX_."cartabandonment_remind SET visualize = 1 WHERE wich_remind = ".(int)$wichRemind." AND id_cart = ".(int)$id_cart;
        Db::getInstance()->Execute($query);
    }

    header('Content-Type: image/png');
    echo base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=');

}
0