Created
July 8, 2025 12:10
-
-
Save ujwaldhakal/a35961b6262e8c3c125b9206d6165f80 to your computer and use it in GitHub Desktop.
Track facebook pixel
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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