Tracker Colpirio – zpětná analýza – 2.část

800px-vienne_saint-romain-en-gal_roman_latrine

Má fascinace trackerem Colpirio stále pokračuje a je zde pokračování analýzy po necelých dvou měsících od prvního dílu.

Tracker se nám dosti rozrostl o další integrace, nalezl jsem 3rd party cookies na serverech, kde bych je vůbec nečekal a také jsem objevil několik nebezpečných konstrukcí v implemnetaci trackeru, které by teoreticky mohly poškodit některé weby.

Pojďme se na druhou várku zvláštností tohoto trackeru společně podívat.

Tracker Colpiria, nad kterým dělám tuto analýzu, si můžete stáhnout zde: dmt-viv_2016_10_25.

Integrace s dalšími weby

Novinkou oproti zářijovému vydání tvoří nové integrace.

GooglePlugin

Uvnitř samotného trackeru Colpiria je nově celá řada integrací s GoogleAnalytics pro několik společností.

window._dmt.addPlugin(new DeepMind.GooglePlugin.Plugin([
    new DeepMind.Sites.Nakupvakci,
    new DeepMind.Sites.Drmax,
    new DeepMind.Sites.Slevadne,
    new DeepMind.Sites.Answear,
    new DeepMind.Sites.Sconto
]))

Zajímavé je, že na některých webech Colpirio tracker ještě není, takže nejspíše čekají na integraci.

  • DrMax – nemá k 25.10.2016
  • Nákup v akci – nemá k 25.10.2016

Účel těchto scriptů je z DOM konkrétní stránky scrapovat data o produktech a nákupním košíku. V praxi to vypadá následovně:

Script scrapující sconto.cz

var DeepMind;
! function(e) {
    var t;
    ! function(t) {
        var n = function(e) {
            function t() {
                e.apply(this, arguments)
            }
            return __extends(t, e), t.prototype.register = function(e) {
                if (window.location.pathname.indexOf("produkty") > -1) try {
                    var t = {};
                    t.item = document.getElementById("cartFormProductId").value.toString().toLowerCase(),
                    t.price = parseInt(document.getElementsByClassName("retail-price")[0].getElementsByTagName("td")[1].innerHTML.replace(new RegExp([" "], "g"), "")),
                    t.brand = "",
                    t.category = document.getElementById("navig-path").getElementsByTagName("a")[document.getElementById("navig-path").getElementsByTagName("a").length - 1].title.toString().toLowerCase(), e.push(["trackEvent", "Ecommerce", "Product", "View", t])
                } catch (n) {} else if (window.location.pathname.indexOf("kosik") > -1) {
                    var i = [],
                        r = [],
                        o = [],
                        a = 0;
                    try {
                        document.getElementById("basket-content-table").childNodes[1].childNodes.forEach(function(e) {
                            if ("undefined" != typeof e.nodeName && "tr" === e.nodeName.toLowerCase() && "undefined" != typeof e.className && "" == e.className) {
                                i.push(e.getElementsByClassName("td-add-pcs")[0].getElementsByTagName("input")[0].getAttribute("productid"));
                                var t = e.getElementsByClassName("td-add-pcs")[0].getElementsByTagName("input")[0].value;
                                r.push(t);
                                var n = parseInt(e.getElementsByClassName("cart-product-price")[0].innerHTML.replace(" ", ""));
                                o.push(n), a += t * n
                            }
                        }), _dmt.push(["trackEvent", "Ecommerce", "Cart", "Update", {
                            items: i,
                            quantity: r,
                            prices: o,
                            total: a
                        }])
                    } catch (n) {}
                }
            }, t
        }(e.Plugin);
        t.Sconto = n
    }(t = e.Sites || (e.Sites = {}))
}(DeepMind || (DeepMind = {}));

Data o produktech na sconto.cz

Na stránce https://www.sconto.cz/produkty/konferencni-stolek-venta.html se odesílá:

https://tr.feynmanhopeful.eu/ecommerceproductview

{
	"pageview": 1477426015,
	"timestamp": 1477426016,
	"useragent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0",
	"referrer": "https://www.sconto.cz/",
	"url": "https://www.sconto.cz/produkty/konferencni-stolek-venta.html",
	"PWID": "08b112d50016598c",
	"BBID": "BBID-01-01243955516874739",
	"value": {
		"item": "4690742417410100",
		"price": 1149,
		"brand": "",
		"category": "konferenční stolky"
	}
}

 

Na stránce https://www.sconto.cz/kosik/ se odesílá:

https://tr.feynmanhopeful.eu/ecommercecartupdate

{
	"pageview": 1477426088,
	"timestamp": 1477426088,
	"useragent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0",
	"referrer": "https://www.sconto.cz/produkty/konferencni-stolek-venta.html",
	"url": "https://www.sconto.cz/kosik/",
	"PWID": "08b112d50016598c",
	"BBID": "BBID-01-01243955516874739",
	"value": {
		"items": ["4690742417410100"],
		"quantity": ["1"],
		"prices": [699],
		"total": 699
	}
}

Ostatní integrace

To samé se děje u všech ostatních scriptů, nebudu to zde dále rozebírat, kdo chce, sám si může provoz z analyzovat třeba v Charlesovi. Níže ukázka, kolik probíhá volání při načtení jedné stránky slevadne.cz na tracker Colpiria. Cca 19 requestů.

colpirio_slevadne

Economia

Scripty, které něco dělají s economia_uid a tracking-uid jsme tu měli již v předchozím díle, ale jak pracují, to jsem nezjistil, pouze informaci, že integrace Centrum a iBillboard je v blízké době v plánu. To bylo září 2016. Nyní je již integrace v provozu, tak co dělá?

Prvně jsme si toho všiml na webu Hypoteční banky, kde jsem nalezl 3rd party cookies centrum.cz. Vzhledem k tomu, že jsem na Hypoteční bance nastavoval snad všechny integrace analytických a remarketingových nástrojů, tak o centrum.cz nic nevím. To mi přišlo divné.

colpirio_centrum_cookies

VT (to bude asi VIV TRACKING) a CPEXSAPS (to bude ta integrace, o které mluvil Matěj).

mid (tipl bych si že to je Marketing ID), ale co znamená?

Mažu cookies a zkoumám, co dělá server centrum.cz když se na něj poprvé přihlásím.

Z domény uid.centrum.cz mi přichází cookie

tracking-uid
4ymbpUddPW

Což je překvapivě to, co zajímá Colpirio tracker.

var DeepMind;
! function(e) {
    var t;
    ! function(t) {
        var n = function(t) {
            function n() {
                t.apply(this, arguments), this.cname = "tracking-uid"
            }
            return __extends(n, t), n.prototype.register = function(e) {
                this.fetcher(e)
            }, n.prototype.fetcher = function(t) {
                var n = this,
                    i = e.Utils.getCookie(this.cname);
                return "" !== i ? void t.push(["trackData", "economia_uid", i]) : void setTimeout(function() {
                    return n.fetcher(t)
                }, 1500)
            }, n
        }(e.Plugin);
        t.Economia = n
    }(t = e.Sites || (e.Sites = {}))
}(DeepMind || (DeepMind = {}));

Více scrapování dataLayeru

V prvním díle mě nejvíce zaráželo automatické scrapování objektu window.dataLayer. Nově je zde detekce objektu:

window.dataLayerEtn

dataLayerEtn je například na stránkách drmax.cz, kde jsme již v úvodu rozebírali přítomnost GooglePluginu. Přídomek Etn odkazuje na (asi) tvůrce webu, tedy společnost Etnetera.

Nezodpovědné zacházení s window scope

Úvodní loader, popsaný v prvním díle, velmi neopatrně zabírá jmenný prostor hlavního objektu window.

viv_loader

var d = document,
	g = d.createElement('script'),
	s = d.getElementsByTagName('script')[0];
g.type = 'text/javascript';
g.async = true;
g.defer = true;
g.src = 'https://cdn.feynmanhopeful.eu/dmt-viv.min.js';
s.parentNode.insertBefore(g, s);

Chybí zde jakýkoliv wrapper, tedy např self-invoking funkce, která by zabránila přetečení proměnných d,g,s do window scope.

Pokud byste například měli na svých stránkách Adobe Analytics, právě jste díky Colpirio trackeru pravděpodobně přišli o svá data, jelikož Adobe Analytics obvykle zaujímá jmenný prostor s, který vám Colpirio zlikviduje svým trapným loaderem.

Správně by měl loader vypadat například takto:
(function(){
var d = document,
	g = d.createElement('script'),
	s = d.getElementsByTagName('script')[0];
g.type = 'text/javascript';
g.async = true;
g.defer = true;
g.src = 'https://cdn.feynmanhopeful.eu/dmt-viv.min.js';
s.parentNode.insertBefore(g, s);
})();

Všimněte si té self-invoking funkce, která slouží jako wrapper.

(function(){ ... })();

Čiší z toho čistý amaterismus!

Proč mi Colpirio stále tolik vadí?

 

  1. vykrádání dataLayeru
  2. neošetřené proměnné (chyby v integracích, window scope)
  3. nehospodárnost (desítky volání, mnohdy naprosto zbytečných)
  4. dvojitý loader
  5. netransparentnost
  6. zvláštní integrace

Na to, jak je Colpirio všude vychvalováno, ambicemi chce konkurovat Google, zaměstnává lidi z CERNu, Akademie věd, Seznamu a dalších, tak jejich tracker stojí za starou bačkoru.