Разработка пикселя отслеживания

Я пытаюсь создать пиксель, который бы отслеживал текущий URL, на котором находится пользователь, когда он посещает. Я могу использовать либо JS (предпочтительно), либо пиксель изображения 1x1. С JS я предполагаю, что мне нужно выполнить AJAX-запрос к PHP-скрипту, чтобы получить необходимую информацию, и с пикселем изображения у меня возникают проблемы с получением текущего URL.

Я также подумал о URL, кодирующем текущий URL с помощью JS и динамически помещающем пиксель изображения с закодированным текущим URL в качестве строки запроса в сценарий PHP, но я могу получить очень длинный.

Если я пойду по маршруту AJAX, какую библиотеку AJAX я могу использовать? JQuery слишком раздутый для этой цели.

Есть другие идеи?

 Alex Markov26 окт. 2012 г., 03:43
@nickhar Что ты имеешь в виду? Как мне передать переменные записи в этот PHP-скрипт / пиксель изображения таким образом?
 nickhar26 окт. 2012 г., 03:41
Вам совсем не нужен ajax, так как пиксельное изображение, сгенерированное в PHP, будет просто включено и запрошено как изображение в вашем HTML.
 user55784626 окт. 2012 г., 03:41
просто используйте журнал сервера или Google Analytics.
 Alex Markov26 окт. 2012 г., 03:43
@Dagon Это для пользовательского приложения, для которого мне нужно собрать несколько фрагментов информации.
 user55784626 окт. 2012 г., 03:45
@AlexMarkov, например? Я должен сделать много предположений о том, чего вы хотите достичь.

Ответы на вопрос(5)

Открытая веб-аналитика проект, который пытается быть в основном PHP-клоном Google Analytics.

Возвращает 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
 MSpreij21 апр. 2015 г., 12:45
echo base64_decode ('R0lGODlhAQABAID / AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEA') также работает вместо sprintf, немного короче.
 Muhammad Tahir09 июл. 2015 г., 07:52
Выглядит хорошо.
 nickhar17 сент. 2013 г., 16:17
+1 Отличная (и изощренная) альтернатива без Б-га.
 nights23 апр. 2014 г., 15:36
Это не работает для меня ... выводит сломанное изображение :(
Решение Вопроса

.gif, .jpeg или же.png изображение с использованием PHP для целей отслеживания с использованиемБиблиотека GD (который часто распространяется с PHP в современных версиях). Если у вас нет доступа к GD, вы всегда можете перекомпилировать PHP с включенным GD.

Пример:

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:

GD ссылка - на php.net
 Alex Markov26 окт. 2012 г., 04:45
Понял. Похоже, мне может понадобиться просто использовать $ _SERVER ['HTTP_REFERER'] ... Очень ценю вашу помощь!
 Levchik18 мая 2018 г., 21:33
Что если я отслеживаю показы формы CTA (призыв к действию) ... Не будет ли запись в БД MySQL каждый раз, когда загрузка страницы будет слишком большой нагрузкой на сервер, если, скажем, я получаю 3000 просмотров в день, и большинство страниц будет отобразить CTA с отслеживающим пикселем. Я НЕ пользуюсь библиотекой GD. Я использую метод изriceball.com/tracking-pixel-works и просто сохранить результаты в MySql (вместо SQlite3) ... PS, может быть, лучше использовать SQLite3, так как это файл ??
 nickhar26 окт. 2012 г., 04:41
Я не вижу, чтобы вызов через JS вызвал бы у вас много проблем, если только ваша URL-строка не была смешной по длине !? Вы можете позвонить долго$_GET без проблем, но это субъективный вопрос. Это зависит от того, что вы делаете. @Baba Несмотря на то, что вы должны генерировать изображение на лету, я никогда не сталкивался с какими-либо проблемами при @ 1 миллионах запросов в день, включенных в электронное письмо! Именно так работают системы отслеживания электронной почты.
 Baba26 окт. 2012 г., 04:35
То есть к дорогому ??? Вы должны генерировать изображение все время
 Alex V26 нояб. 2013 г., 20:20
Это создает новый образ каждый раз. Плохо Плохо Плохо! Очень дорогой. Вы должны загрузить существующее изображение и визуализировать его.

поскольку вызов функции для выполнения отметки, когда электронное письмо было просмотрено или открыто, было введено в альт пикселя, но оно не вызывает корректное действие.

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

}

Выведите 1px x 1px следующим образом:

header('Content-type: image/png');
echo gzinflate(base64_decode('6wzwc+flkuJiYGDg9fRwCQLSjCDMwQQkJ5QH3wNSbCVBfsEMYJC3jH0ikOLxdHEMqZiTnJCQAOSxMDB+E7cIBcl7uvq5rHNKaAIA'));
 user495128 дек. 2016 г., 02:47
Кто-нибудь может подтвердить, что это работает?
 Steven smethurst20 мар. 2017 г., 07:19
@JimThio это работает для меня

Как работает пиксель слежения

Пиксель отслеживания похож на самый примитивный маяк из всех возможных, и он работает, используя факт веб-страниц: изображения - это отдельный запрос от страницы.

Если вы уже можете запустить свой JS-код на чужой странице, вам следует просто ПОСТАВИТЬ данные обратно на сервер. Не нужно отображать крошечный пиксель, который будет получать только те же данные.

Ваш ответ на вопрос