45

我正在尝试构建一个像素来跟踪用户访问时所使用的当前 URL。我可以使用 JS(首选)或 1x1 图像像素。使用 JS,我假设我需要对 PHP 脚本运行 AJAX 请求以捕获我需要的信息,并且使用图像像素我在获取当前 URL 时遇到问题。

我还考虑过使用 JS 对当前 URL 进行 URL 编码,并将具有编码的当前 URL 的图像像素作为查询字符串动态放置到 PHP 脚本中,但我可能会变得很长。

如果我要走 AJAX 路线,我可以使用哪个 AJAX 库?JQuery 对于这个目的来说太臃肿了。

还有其他想法吗?

4

6 回答 6

72

您可以使用GD 库(在现代版本中通常与 PHP 一起分发)编写一个脚本.gif,使用 PHP 来创建和返回一个.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 的更多有用信息:

于 2012-10-26T02:05:23.443 回答
57

这是另一个跟踪像素的 PHP 实现,来自Open Web Analytics项目,它试图基本上是 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
于 2013-09-17T14:11:30.867 回答
13

以这种方式输出 1px x 1px:

header('Content-type: image/png');
echo gzinflate(base64_decode('6wzwc+flkuJiYGDg9fRwCQLSjCDMwQQkJ5QH3wNSbCVBfsEMYJC3jH0ikOLxdHEMqZiTnJCQAOSxMDB+E7cIBcl7uvq5rHNKaAIA'));
于 2014-08-25T11:13:02.133 回答
3

这是一个用 PHP 编写的极其简化的跟踪像素。

跟踪像素的工作原理

跟踪像素就像最原始的信标一样,它通过利用网页的事实来操作:图像是来自页面的单独请求。

如果您已经能够在其他人的页面上运行您的 JS 代码,您应该将数据发布回您的服务器。无需显示只会获得相同类型数据的微小像素。

于 2018-02-26T12:21:13.067 回答
0

如果您的项目范围需要,使用OpenPixel将处理大部分繁重的工作。

于 2020-12-06T19:52:20.067 回答
0

这种效果也存在类似的问题,因为在像素的 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&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=');

}
于 2018-06-25T10:21:42.220 回答