Trackovací knihovny jsou vždy plné balastu, šesti půlek fallbacků a dalších krámů. Jako třeba potenciálních backdoorů (iframe, JSONP), document.write kravin atd. No a pokud je vám jedno, že nějaký vrak s IE 4 na tom vašem scriptu zahyne, pak si ušetřete 40kB a napište si vlastní mikro API, které je z velké části kompatibilní s tou původní knihovnou.
Nejdříve analyzovat
Nejdřív přes Charlese zjistíme, kam data tečou.
https://track.adform.net/Serving/TrackPoint/….
A jaká data tečou.
Koukneme se na vstupy od mediálky.
_adf.conf = { pm: 23547865, divider: encodeURIComponent('|'), pagename: encodeURIComponent('ceskytunak.cz|velka_ryba') }; window._adftrack = _adf.conf;
Pak už si jen napíšeme scriptík.
// Adform Micro API v0.1 var AdFormMicroAPI = function(caller){ try{ function merge(a,b){var c={};for(var d in a)c[d]=a[d];for(var d in b)c[d]=b[d];return c}; // Turn object into URL search string function serialize(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b.join("&")}; // Create image as a transport method function createImage(a){var b=new Image;b.src=a}; // Get Random ID function getRandomInt(a,b){return Math.floor(Math.random()*(b-a+1))+a}; // Get AdForm custom String1 function getBrowserInfo(){function d(a){var b;if(a)b=a.width+"x"+a.height;else if(!a&&window.java)try{var c=window.java.awt.Toolkit.getDefaultToolkit().getScreenSize();b=c.width+"x"+c.height}catch(a){}return b}var a=window,b=a.screen,c=a.navigator,e=c&&c.language?c.language:c&&c.browserLanguage?c.browserLanguage:"";return (e+"|"+e+"|"+d(b)+"|"+(b?b.colorDepth:""))}; // Constants for ADF var signals = { "ord": getRandomInt(10000000000,999999999999), "ADFtpmode" : "2", "loc" : caller || window.location.href, "Set1" : getBrowserInfo() }; } catch(e){} // Request server for image this.track = function(custom_data){ var c = "https://track.adform.net/Serving/TrackPoint/"; if(custom_data){signals = merge(signals,custom_data)}else{console.log("AdForm Custom Tracker called with incorrect parameters");return !1;} var src = c+"?"+serialize(signals); createImage(src); } }; // Create new Micro tracker var AdFormMicroTracker = new AdFormMicroAPI("https://ceskytunak.cz/fakeurl/"); AdFormMicroTracker.track({ // to co vám dodá mediálka });
Tradá a máme JavaScriptově programovatelný pixel pro AdForm.
Co mě pobavilo?
Když se v Charlesovi podíváte na parametr Set1, uvidíte string cs|cs|1945×666. Člověk oddtuší, že cs bude asi něco s češtinou. Ale proč jsou tam dvě cs|cs? Moc se mi nechtělo to zkoumat, tak jsem to do scriptu nafakoval oboje stejné, řízené jednou funkcí, stejně to nikdo nebude moc řešit.
Pak jsem se v tom ale začal vrtat a měl jsem hypotézu, že jedno je jazyk OS, druhé třeba klávesnice, tak jsem si deobfuscoval originální knihovnu a ti gangsteři od AdFormu to tam mají úplně stejně natvrdo, jak jsem se na to vyprdnul já. Předpokládám, že u nich je to tam z důvodu zpětné kompoatibility s verzí AdForm trackeru z doby nebreč, ale pobavilo mě to:-)
Disclamer
Jestli se bojíte, rozhodně to doma nezkoušejte. O AdFormu vím zhola ***, takže žádná garance že to bude dělat to, co má. Ale na stranu druhou, AdForm běžně vybavuje své scripty doplňkovou části NOSCRIPT, která vypadá třeba takto:
<img src="https://track.adform.net/Serving/TrackPoint/?pm=23789855&ADFPageName=tunak_con_carne&ADFdivider=|" width="1" height="1" alt="" />
Takže jestli jejich servery zchroupou takto tupý signál, tak z toho mého musí zpívat imperiální hymnu.