开发跟踪像素

IT技术 php javascript pixel
2021-03-11 22:37:55

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

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

如果我要走 AJAX 路线,我可以使用哪个 AJAX 库?为此,JQuery 过于臃肿。

还有其他想法吗?

6个回答

您可以使用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 的更多有用信息:

这每次都会生成一个新图像。坏坏坏!非常贵。您应该加载现有图像并渲染它。
2021-04-23 22:37:55
但是我如何访问像素通过这种类型的实现触发的 URL?我能想到的唯一方法是将 document.URL 作为查询字符串参数添加到像素,但我担心它会使像素 URL 太长。不?
2021-04-26 22:37:55
我看不出通过 JS 调用它会给你带来很多问题,除非你的 URL 字符串的长度很荒谬!?您可以$_GET毫无问题地调用 long ,但这是一个主观问题。这取决于你在做什么。@Baba 虽然您必须即时生成图像,但我从未见过它有任何问题@电子邮件中包含每天大约 100 万(百万)个请求!!这就是电子邮件跟踪系统的工作方式。
2021-04-26 22:37:55
明白了。似乎我可能需要使用 $_SERVER['HTTP_REFERER'] ... 非常感谢您的帮助!
2021-05-10 22:37:55
如果我正在跟踪 CTA(号召性用语)表单的印象怎么办...每次加载页面时都不会写入 MySQL DB 会给服务器带来太大压力,如果说我每天获得 3000 次浏览量,并且大多数页面都会显示带有跟踪像素的 CTA。我没有使用 GD 库。我正在使用来自Riceball.com/tracking-pixel-works 的方法,并将结果保存到 MySql(而不是 SQlite3)... PS,也许使用 SQLite3 更好,因为它是一个文件??
2021-05-11 22:37:55

这是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
@nights,确保在开始的 <?php 标签之前没有空格!
2021-05-03 22:37:55
这对我不起作用......输出一个破碎的图像:(
2021-05-06 22:37:55
@4umfreak 是的,但还是一样。我应该提到这只发生在 apache/windows 上
2021-05-06 22:37:55
echo base64_decode('R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAAABAAEAAAICRAEA') 也可以代替 sprintf 工作,但要短一些。
2021-05-13 22:37:55

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

header('Content-type: image/png');
echo gzinflate(base64_decode('6wzwc+flkuJiYGDg9fRwCQLSjCDMwQQkJ5QH3wNSbCVBfsEMYJC3jH0ikOLxdHEMqZiTnJCQAOSxMDB+E7cIBcl7uvq5rHNKaAIA'));
2019 年适用于 chrome 👍
2021-04-16 22:37:55

这是一个用 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&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=');

}