开发跟踪像素

问题描述 投票:0回答:7

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

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

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

还有其他想法吗?

php javascript pixel
7个回答
74
投票

您可以使用 PHP 编写一个脚本,创建并返回

.gif
.jpeg
.png
图像,以便使用 GD 库(在现代版本中通常与 PHP 一起分发)进行跟踪。如果您无法访问 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 的更多有用信息:


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

13
投票

这样输出 1px x 1px:

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

4
投票

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

跟踪像素的工作原理

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

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


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=');

}

0
投票

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


0
投票

此脚本应该解决其他答案的一些问题和评论。

<?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 if request is a POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    echo ' ';
} else {
    // return 1x1 pixel transparent gif
    header("Content-type: image/gif");
    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 base64_decode('R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEA');
}

// flush all output buffers
ob_flush();
flush();
ob_end_flush();

// DO ANALYTICS TRACKING HERE

// Server variables
$ip = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
}
$referer = filter_var($_SERVER['HTTP_REFERER'], FILTER_SANITIZE_URL);
$useragent = htmlspecialchars($_SERVER['HTTP_USER_AGENT'], ENT_QUOTES, 'UTF-8');

// Log the events
if (isset($_GET['a']) || isset($_GET['b']) || isset($_GET['c'])) {
    $logData = sprintf(
        "[%s] IP: %s, Referrer: %s, User Agent: %s, Event A: %s, Event B: %s, Event C: %s\n",
        date('Y-m-d H:i:s'),
        $ip,
        $referer,
        $useragent,
        $_GET['a'] ?? 'N/A',
        $_GET['b'] ?? 'N/A',
        $_GET['c'] ?? 'N/A'
    );
    file_put_contents('pixel_log.txt', $logData, FILE_APPEND);
}
© www.soinside.com 2019 - 2024. All rights reserved.