我正在尝试构建一个像素来跟踪用户访问时所在的当前 URL。我可以使用 JS(首选)或 1x1 图像像素。使用 JS,我假设我需要向 PHP 脚本运行 AJAX 请求以捕获我需要的信息,并且使用图像像素获取当前 URL 时遇到问题。
我还考虑过使用 JS 对当前 URL 进行 URL 编码,并将带有编码的当前 URL 的图像像素作为查询字符串动态放置到 PHP 脚本中,但是我可以变得很长。
如果我要走 AJAX 路线,我可以使用哪个 AJAX 库?为此,JQuery 过于臃肿。
还有其他想法吗?
我正在尝试构建一个像素来跟踪用户访问时所在的当前 URL。我可以使用 JS(首选)或 1x1 图像像素。使用 JS,我假设我需要向 PHP 脚本运行 AJAX 请求以捕获我需要的信息,并且使用图像像素获取当前 URL 时遇到问题。
我还考虑过使用 JS 对当前 URL 进行 URL 编码,并将带有编码的当前 URL 的图像像素作为查询字符串动态放置到 PHP 脚本中,但是我可以变得很长。
如果我要走 AJAX 路线,我可以使用哪个 AJAX 库?为此,JQuery 过于臃肿。
还有其他想法吗?
您可以使用GD 库(在现代版本中通常随 PHP 一起分发)编写一个脚本,该脚本使用 PHP 来创建和返回.gif,.jpeg或.png图像以进行跟踪。如果您无权访问 GD,您始终可以在启用 GD 的情况下重新编译 PHP。
例子:
pixel.php (评论是为了解释):
<?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);
?>
在一个简单的示例中,您可以在电子邮件或其他页面中使用以下示例 URL 调用此跟踪像素:
<img src="http://example.com/pixel.php?a=value1&b=value2&c=value3">
使用变量:
在您的内部,您pixel.php可以简单地解析和解释$_GET在图像标签中传递给它的任何变量:
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
}
根据需要应用和重复,但是您可以对自己的工作非常复杂,尤其是因为您可以通过在$_GET字符串上设置变量来访问有关用户的大量信息。
一个更适用的例子可能是:
<img src="http://example.com/pixel.php?userid=98798&campaign=302&last=8">
跟踪的不仅仅是 $_GET 变量:
您还可以使用 PHP 获取更多信息,例如:
// Server variables
$ip = $_SERVER['REMOTE_ADDR'];
$referer = $_SERVER['HTTP_REFERER'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
$browser = get_browser(null, true);
etc...
然后可能插入到数据库中的跟踪表中:
$sql = "INSERT INTO campaign_tracking 
        ('when','campaign','last','ip','useragent') 
        VALUES 
        (NOW(),'$campaign','$last','$ip','$useragent')";
这是一种广泛用于跟踪电子邮件营销活动的基本方法,特别是在 PHP 中,但同样的方法也适用于其他脚本/编程语言和库 - 也适用于其他目的。
关于 GD 的更多有用信息:
这是Open Web Analytics项目中跟踪像素的另一个 PHP 实现,该项目基本上试图成为 Google Analytics 的 PHP 克隆。
它返回一个 1x1透明GIF 图像(不使用 PHP 图像库!),带有无缓存标头(对于准确跟踪很重要),并刷新输出,以便您可以继续处理分析而不阻塞 HTTP 响应(性能)。这似乎是一个非常先进的实现,值得一试。
<?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
以这种方式输出 1px x 1px:
header('Content-type: image/png');
echo gzinflate(base64_decode('6wzwc+flkuJiYGDg9fRwCQLSjCDMwQQkJ5QH3wNSbCVBfsEMYJC3jH0ikOLxdHEMqZiTnJCQAOSxMDB+E7cIBcl7uvq5rHNKaAIA'));
这是一个用 PHP 编写的极其简化的跟踪像素。
跟踪像素就像是最原始的信标,它通过利用网页的事实进行操作:图像是来自页面的单独请求。
如果您已经能够在其他人的页面上运行您的 JS 代码,您应该只将数据 POST 回您的服务器。无需显示只能获得相同类型数据的微小像素。
这种效果也有类似的问题,因为在像素的 alt 中引入了对函数的调用来执行标记何时看到或打开电子邮件,但它没有正确抛出动作。
<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&id_cart=1002&action=visualize&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=');
}