Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ujwaldhakal/a35961b6262e8c3c125b9206d6165f80 to your computer and use it in GitHub Desktop.
Save ujwaldhakal/a35961b6262e8c3c125b9206d6165f80 to your computer and use it in GitHub Desktop.
Track facebook pixel
<script>
// Facebook Pixel GET Request Data Logger (ES5 compatible)
(function() {
'use strict';
// Facebook tracking endpoints and domains
var FB_DOMAINS = [
'facebook.com',
'fbcdn.net',
'connect.facebook.net',
'graph.facebook.com',
'analytics.facebook.com'
];
var FB_TRACKING_PATHS = [
'/tr',
'/tr/',
];
// Storage for captured data
var capturedRequests = [];
var isInitialized = false;
function isFacebookRequest(url) {
if (!url) return false;
var urlStr = url.toString();
for (var i = 0; i < FB_DOMAINS.length; i++) {
if (urlStr.indexOf(FB_DOMAINS[i]) !== -1) return true;
}
for (var j = 0; j < FB_TRACKING_PATHS.length; j++) {
if (urlStr.indexOf(FB_TRACKING_PATHS[j]) !== -1) return true;
}
return false;
}
function parseURLParams(url) {
try {
var urlObj = document.createElement('a');
urlObj.href = url;
var query = urlObj.search.substring(1);
var vars = query.split('&');
var params = {};
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
if (pair[0]) {
params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');
}
}
return {
baseUrl: urlObj.protocol + '//' + urlObj.host + urlObj.pathname,
params: params,
fullUrl: url,
searchParams: urlObj.search
};
} catch (error) {
var parts = url.split('?');
var fallbackParams = {};
if (parts[1]) {
var raw = parts[1].split('&');
for (var j = 0; j < raw.length; j++) {
var kv = raw[j].split('=');
if (kv[0]) fallbackParams[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1] || '');
}
}
return {
baseUrl: parts[0],
params: fallbackParams,
fullUrl: url,
parseError: error.message
};
}
}
function decodeFacebookData(params) {
var decoded = {};
var fbParams = {
'id': 'pixel_id',
'ev': 'event_name',
'eid': 'event_id',
'dl': 'document_location',
'rl': 'referrer_url',
'ts': 'timestamp',
'sw': 'screen_width',
'sh': 'screen_height',
'v': 'version',
'r': 'random_number',
'ec': 'event_count',
'o': 'object_data',
'fbp': 'fbp',
'fbc': 'fbc',
'em': 'email',
'ph': 'ph',
'value': 'Purchase Value',
'cd': 'Custom Data',
'ud': 'User Data'
};
for (var key in params) {
if (!params.hasOwnProperty(key)) continue;
var value = params[key];
var decodedValue = value;
try {
if (typeof value === 'string' && (value.charAt(0) === '{' || value.charAt(0) === '[')) {
decodedValue = JSON.parse(value);
} else if (typeof value === 'string' && value.indexOf('%') !== -1) {
decodedValue = decodeURIComponent(value);
}
if (key === 'ts' && !isNaN(value)) {
decodedValue = new Date(parseInt(value, 10) * 1000).toISOString();
}
} catch (e) {
decodedValue = value;
}
decoded[fbParams[key]] = decodedValue;
}
return decoded;
}
function logRequest(method, url, additionalData) {
if (!isFacebookRequest(url)) return null;
var parsed = parseURLParams(url);
var decoded = decodeFacebookData(parsed.params);
if (decoded['event_name'] === 'LeadWithoutCustomer') {
console.log("send request to log here");
}
var logEntry = {
id: Date.now() + '-' + Math.random().toString(36).substr(2, 9),
timestamp: new Date().toISOString(),
method: method,
url: parsed.fullUrl,
baseUrl: parsed.baseUrl,
rawParams: parsed.params,
decodedParams: decoded,
pageUrl: window.location.href,
referrer: document.referrer,
userAgent: navigator.userAgent
};
if (additionalData) {
for (var key in additionalData) {
if (additionalData.hasOwnProperty(key)) {
logEntry[key] = additionalData[key];
}
}
}
capturedRequests.push(logEntry);
console.group('🎯 Facebook Pixel Request Captured');
console.log('πŸ“Š Event:', decoded['event_name'] || 'Unknown');
console.log('πŸ†” Pixel ID:', decoded['pixel_id'] || 'Unknown');
console.log('πŸ“‹ Raw Params:', parsed.params);
console.log('πŸ” Decoded Params:', decoded);
console.log('⏰ Timestamp:', logEntry.timestamp);
console.groupEnd();
return logEntry;
}
function interceptImages() {
if (HTMLImageElement.prototype._fbIntercepted) return;
var OriginalImage = window.Image;
window.Image = function(width, height) {
var img = new OriginalImage(width, height);
var originalDescriptor = Object.getOwnPropertyDescriptor(HTMLImageElement.prototype, 'src');
if (originalDescriptor && originalDescriptor.set && originalDescriptor.get) {
Object.defineProperty(img, 'src', {
set: function(value) {
if (isFacebookRequest(value)) {
logRequest('GET', value, {
type: 'image_pixel',
element: 'Image'
});
}
return originalDescriptor.set.call(this, value);
},
get: function() {
return originalDescriptor.get.call(this);
}
});
}
return img;
};
HTMLImageElement.prototype._fbIntercepted = true;
console.log('βœ… Image creation intercepted');
}
function initialize() {
if (isInitialized) return;
console.log('πŸš€ Initializing Facebook Pixel Logger...');
interceptImages();
isInitialized = true;
console.log('βœ… Facebook Pixel Logger initialized and ready!');
console.log('πŸ“Š Use FacebookPixelLogger.getRequests() to view captured requests');
}
initialize();
})();
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment