Sending HIT

Trackovací pixel, hit, beacon, tečka, event, signál. Kolik takových ještě znáte? A jak takový hit zkonstruovat a odeslat? To se dozvíme v tomto článku.

Varování: článek není pro másla!

Příprava dat

Než data odešleme na server, je třeba si je řádně připravit. V drtivé většině případů zasíláme data jako dvojici klíč:hodnota. Hodí se nám tedy datová struktura asociativní pole, nebo prostě objekt.

var call = {
  "v"  : "1", //protocol version
  "tid": "UA-10XXXXX-Y", // Property ID
  "cid": getRandomInt(1000000000,1900000000),
  "t"  : "event", //pageview,event,
  "dh" : location.hostname, // Source of problem
  "ec" : "Tunak Tracker",     // Event Category
  "ea" : "Failure",        // Event Action
  "el" : "Cookies are not allowed",    // Event label
  "cd2": "Non system error" // Custom dimension
};

Příprava dat k transportu mezi klientem a serverem přes Measurement Protokol

Abychom jej mohli poslat přes Measurement Protocol, potřebujeme z objektu udělat řetězec URL. K tomu nám slouží jednoduchá funkce, která převede objekt ‚call‘ s klíč:hodnota na řetězec klíč=hodnota&klíč2:hodnota2…

function serialize(obj) {
  var str = [];
  for(var p in obj)
    if (obj.hasOwnProperty(p)) {
      str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
    }
  return str.join("&");
}

Příprava finální URL kam data pošleme

Ještě potřebujeme přidat adresu serveru, který naši dávku parametrů přijme a zpracuje. V případě Google Analytics a Measurement Protocolu je to adresa: https://www.google-analytics.com/collect

var collector = "https://www.google-analytics.com/collect";
var src = collector+"?"+serialize(call);

Odeslání dat – iFrame

Mezi populární metody, jak posílat analytická data a získat od serveru odpověď ve formě spustitelného scriptu, patří rozhodně iFrame.

Možností, jak jej vytvořit a vyžádat si tak od serveru odpověď je celá řada. Nebudu zde objevovat ameriku a odkáži vás na článek Aarona Peterse, kde o jednotlivých metodách podrobně píše – http://www.aaronpeters.nl/blog/iframe-loading-techniques-performance

O odeslání dat se nám v našem případě postará funkce createIframe, jejíž jediný parametr je kompetní adresa s data.

function createIframe(url){
  var i = document.createElement("iframe");
  i.src = url;    
  i.frameborder = "0";
  i.width = "0px";
  i.height = "0px";
  i.style = "display: none;";
  document.body.appendChild(i);    
}

Kompletní ukázka

// Prepare UA signals for Measurement Protocol
var call = {
  "v"  : "1", //protocol version
  "tid": "UA-10XXXXX-Y", // Property ID
  "cid": getRandomInt(1000000000,1900000000),
  "t"  : "event", //pageview,event,
  "dh" : location.hostname, // Source of problem
  "ec" : "Tunak Tracker",     // Event Category
  "ea" : "Failure",        // Event Action
  "el" : "Cookies are not allowed",    // Event label
  "cd2": "Non system error" // Custom dimension
};

// Turn object into URL search string
function serialize(obj) {
  var str = [];
  for(var p in obj)
    if (obj.hasOwnProperty(p)) {
      str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
    }
  return str.join("&");
}

// Create iframe as a transport platform method
function createIframe(url){
  var i = document.createElement("iframe");
  i.src = url;    
  i.frameborder = "0";
  i.width = "0px";
  i.height = "0px";
  i.style = "display: none;";
  document.body.appendChild(i);    
}

// Prepare URL
var collector = "https://www.google-analytics.com/collect";
var src = collector+"?"+serialize(call);

// Request server for iFrame
createIframe(src);

Odeslání dat – Image

Pokud nepotřebujeme znát odpověď serveru, což je typické pro čistý sběr (na rozdíl od reklamních systémů), postačíme si s požadavkem na obrázek.

Obrázek v JavaScriptu vytvoříme velmi snadno

function createImage(url){
    var i = new Image();
    i.src = url;
}

Kompletní ukázka s použitím obrázku

// Prepare UA signals for Measurement Protocol
var call = {
  "v"  : "1", //protocol version
  "tid": "UA-10XXXXX-Y", // Property ID
  "cid": getRandomInt(1000000000,1900000000),
  "t"  : "event", //pageview,event,
  "dh" : location.hostname, // Source of problem
  "ec" : "Tunak Tracker",     // Event Category
  "ea" : "Failure",        // Event Action
  "el" : "Cookies are not allowed",    // Event label
  "cd2": "Non system error" // Custom dimension
};

// Turn object into URL search string
function serialize(obj) {
  var str = [];
  for(var p in obj)
    if (obj.hasOwnProperty(p)) {
      str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
    }
  return str.join("&");
}

// Create image as a transport method
function createImage(url){
    var i = new Image();
    i.src = url;
}

// Prepare URL
var collector = "https://www.google-analytics.com/collect";
var src = collector+"?"+serialize(call);

// Request server for image
createImage(src);