Google Analytics brez piškotkov

Razvili smo rešitev, ki omogoča uporabo Google Analytics brez piškotkov, v skladu z določili ZEKom-1.

Google Analytics brez piškotkov

Z izrecno privolitvijo, ki jo za “invazivne” piškotke zahteva ZEKom-1, postaja ustaljeni način uporabe Google Analytics neuporaben za merjenje obiska spletnih strani, saj lahko na podlagi izkušenj iz tujine pričakujemo, da bo velik del obiskovalcev strani zavrnil uporabo nenujnih piškotkov. Kakšno vrednost imajo potem podatki o obiskanosti in uporabi spletne strani, če zajemajo le (neznan)del dejanskih obiskovalcev?

Če vas zanima le končna rešitev, preskočite naslednja dva poglavja.

Vendar lahko Google Analytics uporabljamo tudi brez uporabe piškotkov. Kako?

Google je pred kratkim v Google Analytics dodal možnost zbiranja podatkov preko programskega vmesnika, ki ga imenujejo Measurement Protocol (MP). S tem so razširili uporabnost storitve preko meja spletnih rešitev v mobilne in desktop aplikacije ter celo v off-line svet. Z MP bi lahko npr. trgovina zbirala statistične podatke o svojih kupcih ali sistem za kontrolo dostopa zajemal podatke o dostopih obiskovalcev.

MP lahko uporabimo za zbiranje podatkov o uporabi spletnih strani brez, da za to uporabljamo piškotke ali druge podobne načine shranjevanja in branja podatkov z naprave uporabnika. ZEKom-1 namreč omenja piškotke, vendar se omejitve izrecno nanašajo na vse podobne načine shranjevanja podatkov na napravi uporabnika med katere lahko uvrstimo trike kot so dolgotrajno cachiranje javascript datotek, v katere zapečemo ID uporabnika, manipulacije z Etag-om, local storage,...

Pomembno: MP deluje le za Google Analytics profile, ki uporabljajo Universal Analytics. Če vaša stran uporablja klasičen GA profil, boste za uporabo rešitve brez piškotkov morali ustvariti nov, Universal Analytics, profil.

Torej, kako lahko uporabimo MP za zajem podatkov v Google Analytics?

Prvi način je, da MP uporabljamo za server-side zbiranje podatkov o dostopih: v PHP kodi (ali katerikoli drugi server-side kodi) bi preko HTTP GET ali POST klica poklicali Google Analytics in prek MP posredovali podatke o dostopu. Pri tem se pojavita dva problema: MP zaenkrat ne omogoča posredovanja uporabnikovega IP naslova. V pregledih Google Analytics bi izgledalo, da so vsi uporabniki prišli z geografske lokacije našega strežnika. Drug problem je filtriranje robotov, ki lahko predstavljajo velik del obiska spletne strani.

Poglejmo dalje...

MP podpira tako GET kot POST metodo. Lepa lastnost MP je, ta da če GET metodo pokličemo s pravim mime tipom, ta vrne 1x1 prozoren GIF. To pomeni, da lahko storitev kličemo prek ustavljanja IMG objektov v HTML kodo, podobno kot to počne klasičen Google Analytics. 

Prek MP v GA posredujemo parametre, kot so tip zapisa (pageview, event...), tracking ID (UA-XXXXXX-XX), naslov strani itd ter ID uporabnika, ki ga GA uporabi za ugotavljanje novih / vračajočih obiskovalcev, trajanje seje, števila obiskanih strani v seji in števila edinstvenih obiskovalcev.

S piškotki bi bila rešitev trivialna. V piškotek z dolgim trajanjem vpišemo generiran uporabnikov ID, ki ga ob vsakem klicu posredujemo v analitiko.

Brez piškotkov moramo najti drugačno rešitev. Najelegantnejša bi bila, da v HTML stran vključimo Javascript datoteko, ki jo generiramo na strežniku, kjer v njo vpišemo edinstveno številko uporabnika (npr. UUID) in datoteki s HTTP headerji nastavimo dolgotrajno cachiranje v brskalniku. S pomočjo Etag-a in 304 Not modified statusa lahko ta ista strežniška koda poskrbi, da se tako generirana Javascript datoteka res dolgo ohrani v cachu brskalnika. 

Vendar s tem kršimo ZEK-om1. Kajti na ta način shranjeno javascript datoteko lahko opredelimo kot način shranjevanja in dostopanja do podatkov shranjenih na opremi uporabnika. Dvomim, da bi takšna rešitev šla čez inšpekcijski pregled.

Kaj je alternativa? Kakšen podatek lahko uporabimo kot ponavljajoč in predvidljiv »edinstven« id uporabnika?

V naši rešitvi uporabljamo kombinacijo IP naslova uporabnika, vrste brskalnika in operacijskega sistema ter velikost zaslona. Pri tem ne uporabimo celotne User Agent vrednosti, saj se ta zaradi auto-updata pri vseh sodobnih brskalnikov prepogosto spreminja. Uporabimo le vrsto brskalnika in operacijskega sistema. Vse skupaj sestavimo v niz in izračunamo MD5 hash. Tako ob vsakem dostopu izračunamo id uporabnika.

Seveda ta način ni popoln: IP naslovi se spreminjajo, več uporabnikov uporablja isti IP naslov (vendar imajo morda zaslone različnih dimenzij ali uporabljajo različne brskalnike)... Vendar pri zbiranju statistik ne gre za 100% natančnost, temveč za predvidljiv približek. Tudi piškotki niso natančni – nekateri uporabniki imajo izklopljen Javascript ali onemogočene piškotke. S hkratno uporabo tega načina in klasičnega Google Analytics smo se prepričali, da so rezultati v obeh primerih podobni in uporabni. Na vsak način so rezultati te metode bolj natančni, kot zbiranje podatkov s pohabljenimi piškotki.

Končna rešitev deluje takole:

Namesto Googlove analytics.js v stran vključimo datoteko ga_no_cookie.js. Če vključimo ga_no_cookie.php bo PHP koda vrnila Javascript kodo in hkrati nastavila ustrezna cache headerje, da si bo brskalnik datoteko zapomnil za dlje časa. V tej datoteki se ne nahajajo nobeni podatki, zato shranjevanje te datoteke ni sporno.

Ta Javascript koda bo med izvajanjem naložila še eno Javascript datoteko – ga_no_cookie_uid.php, ki jo na strežniku generira PHP koda. Vse kar ta naredi je, da preko vrnjenega Javascripta nastavi spremenljivko gaNoCookieUid, ki vsebuje na zgoraj opisan način zgeneriran id uporabnika: md5(IP naslov + vrsta brskalnika + vrsta operacijskega sistema + velikost zaslona).

S pomočjo »cache buster-ja«, naključne vrednosti, ki se prilepi k url naslovu te javascript datoteke, poskrbimo, da se ob vsakem dostopu do strani zgenerira in naloži s strežnika. S tem ne hodimo v zelje ZEKom-1, saj se ta podatek ne shranjuje pri uporabniku, prav tako pa ga od tam ne beremo.

Za uporabo te rešitve z drugimi programskimi jeziki je dovolj implementirati le kodo, ki zgenerira id uporabnika.

Vsi IP naslovi posredovani v GA so anonimizirani.

Če kodo uporabljate v spletni storitvi, kjer so uporabniki prijavljeni v sistem, lahko namesto zgoraj opisanega hasha posredujete hash uporabnikovega Id-ja v aplikaciji (vendar bodite pozorni na pogoje uporabe GA, ki prepovedujejo posredovanje osebnih uporabniških podatkov v GA).

Z vidika uporabe v HTML kodi je ta rešitev združljiva z GA analytcs.js. Podprta sta dva tipa zapisov: pageview in event. Primeri uporabe so priloženi izvorni kodi.

Vendar žuganju predpisov še ni konec. Google je v pogoje uporabe MA dodal člen, ki zahteva, da mora imeti uporabnik možnost opt-out-a iz zbiranja podatkov. Opt-out zavrnitev je veliko manj radikalna kot v Sloveniji predpisana opt-in potrditev.

Naša rešitev poskrbi tudi za to. Če je nastavljena vrednost ganc_status_eid na DOM id elementa, ki na strani obstaja, se bo v tem elementu pokzal link, ki omogoča izklop oziroma vklop zbiranja statistik. Besedaila obeh sporočil sta nastavljiva po želji. Pomembno je tudi, da vemo koliko uporabnikov je zbiranje statistik dejansko zavrnilo. Zato se v GA vsakič, ko uporabnik zbiranje statistik izklopi ali vklopi posreduje dogodek GA DISABLED oz. GA ENABLED.

Primer implementacije si lahko ogledate kar na tem spletnem mestu. V kolofonu na dnu strani je povezava za opt-out/in iz zbiranja podatkov.

Pomembno: Ta rešitev deluje le za Google Analytics profile, ki uporabljajo Universal Analytics. Če vaša stran uporablja klasičen GA profil, boste za uporabo rešitve brez piškotkov morali ustvariti nov, Universal Analytics, profil.

Licenca in nakup

Koda je licencirana pod CC-Non-Commercial, kar pomeni, da jo lahko brezplačno uporabite na osebnih in neprofitnih projektih. Za komercialno uporabo je potrebna komercialna licenca, ki je na voljo v dveh oblikah:

  • 19 EUR za uporabo na do petih spletnih mestih (različnih domenah)
  • 99 EUR za uporabo na neomejenem številu spletnih mest

Nakup licence lahko opravite:

a) preko PayPal-a:

License type

b) preko nakazila na TRR:

V tem primeru nam po elektronski pošti pošljite svoje podatke (podjetje, naslov, davčna številka), obvezno navedite, katero licenco potrebujete, mi pa vam bomo nazaj poslali račun. 

Podpora in pomoč

Uporabiška podpora za uporabnike s komercialno licenco je na naslovu matjaz@humane-tehnologije.si. Nudimo tudi storitev implementacije rešitve, če nimate tehničnega znanja ali izvajalcev.

Prenesite programsko kodo

Programska koda in primeri uporabe so na voljo na GitHub-u. 

Omejitev odgovornosti

Rešitev smo razvili na podlagi temeljite analize omejitev ZEKom-1 in smernic Urada informacijske pooblaščenke. Vendar ne prevzemamo nobene odgovornosti, za škodo, ki bi morebiti nastala zaradi uporabe te programske kode. Z prenosom kode na svoj računalnik se strinjate s tem določilom in prevzemate odgovornost za uporabo te kode.

---

Matjaž Trontelj

While you're here check-out our fun iOS apps:

Zen Habits

Focus of my Day

Life is Beautiful

podrobnostishadow1-3.png

Pišite nam!

E: info@humane-tehnologije.si