Javascript: Get Cookies – Cookies auslesen

Es sollte eine eigentlich einfache Aufgabe sein. Geplant war es ein bestimmtes Element auf einer Webseite aufgrund der DSGVO nur anzuzeigen, wenn der Besucher den Werbe-Cookies zu gestimmt hat. Anhand von Google Adsense habe ich dies bereits in einem anderen Artikel gezeigt und die Vorgehensweise war eigentlich nicht all zu schwer. Mittels einer einfachen Javascript-Funktion kann man den Inhalt eines Cookies auslesen und dann anhand des Inhalts beliebig agieren.

Auf der Seite, in die das ganze eingebaut werden sollte, gibt es allerdings einen gravierenden Unterschied: Das Consent-Cookie wird nicht durch ein eigenes Skript gesetzt, wie in meinem anderen Artikel zur DSGVO-konformen Einbindung von Google Adsense. Da auf der Seite Ezoic genutzt wird, wird auch der umfangreiche Cookie-Banner von Ezoic genutzt, welcher dann eigene Cookies setzt. Auch diesen Cookie zu nutzen ist theoretisch kein Problem sein, hat mich allerdings einige Nerven gekostet.

Cookie finden

Das Cookie zu finden ist mit Hilfe der Entwicklertools in Firefox oder Chrome kein Problem. So lässt sich je nach Auswahl im Cookie-Banner herausfinden welche Einstellungen für welche Einträge in dem entsprechenden Cookie sorgen.

Im Falle des Consent-Cookies von Ezoic ist es das folgende Cookie:

ezCMPCookieConsent

Dieses beinhaltet z. B. folgende Wert wenn der Benutzer allen Maßnahmen zugestimmt hat:

-1=0|1=1|2=1|3=1|4=1

Analog dazu sieht es bei der Ablehnung so aus:

-1=0|1=0|2=0|3=0|4=0

Der Einfachheit halber will ich nur prüfen ob wirklich allen Maßnahmen zugestimmt worden ist und will nur dann mein Element auf der Webseite anzeigen.

 

Probleme

Nachdem ich das entsprechende Cookie gefunden hatte, sollte die Abfrage eigentlich ein Klacks sein. Leider begann hier eine Odyssee durch Javascript-Code.

Beim Versuch das Cookie direkt beim Aufrufen der Seite auszulesen kam als Ergebnis immer NULL zurück. Andere Cookies von Ezoic ließen sich ohne Probleme auf diese Weise auslesen. An dem Cookie selber liegt es also nicht. Es wird auch für die richtige (Sub-)Domain abgespeichert, sollte also in Javascript zur Verfügung stehen.

 

Die nächste Vermutung war, dass es daran liegen könnte, dass sich in dem Cookie ein Array befindet. Dies hat sich allerdings nicht bestätigt, denn durch das manuelle Aufrufen der Cookie-Funktion mit Hilfe eines Buttons hat die Ausgabe in einem Alert und auch die Nutzung der Variable in einer if-Abfrage problemlos funktioniert.

 

Mit einer Testseite, die einfach den gesamten Inhalt von document.cookie ausgibt, tauchte das entsprechende Cookie leider nur sehr unregelmäßig mal mit auf und auch der Inhalt wurde korrekt ausgegeben. Dies funktionierte in vielleicht zwei von zehn Versuchen. Hierfür habe ich eine getCookie-Funktion genutzt welche den Inhalt von document.cookie schöner formatiert.

 

Mit Hilfe der Entwicklertools konnte ich dann folgendes feststellen: Das betroffene Cookie taucht fast immer erst einen kurzen Moment nach den anderen Cookies in der Übersicht auf. Ab und an gefühlt eine ganze Sekunde später. Für die Funktion zum Auslesen beim Aufrufen der Webseite ist dies natürlich zu spät. Schade…

 

Lösung

Okay, dann baue ich einfach eine Wartezeit ein habe ich mir gedacht. Das ist in Javascript, insbesondere wenn man keine Ahnung davon hat was man da eigentlich genau macht, auch wieder eine komplexere Angelegenheit.

 

document.ready

Rückwirkend war es schon dämlich, aber ich habe es mit JQuery versucht und meinen ganzen Kram der das Cookie benötigt in einen document.ready-Bereich gepackt. Tja, das wird zwar erst ausgeführt wenn die Seite geladen wurde, aber das heißt ja immer noch nicht dass auch das Cookie geladen wurde. Denn die Seite ist ja auch zuvor HTML-seitig schon immer fertig aufgebaut gewesen, bevor das Cookie geladen wurde.

 

Sleep-Funktion

Eine klassische sleep-Funktion gibt es in Javascript leider nicht, dann habe ich eine solche Funktion gefunden und eingebaut, was sich als ebenfalls unsinnig herausgestellt hat. Anscheinend hat die Funktion wirklich eine Pause verursacht, aber nicht so wie von mir vermutet. Denn das Cookie wurde durch die Funktion anscheinend einfach noch später geladen da dies irgendwie die gesamte Codeausführung geblockt zu haben scheint. Da diese Pause also vor dem Laden des Cookies liegt und auch für diesen Vorgang eine Pause verursacht ist nichts gewonnen.

Falls jemand so etwas gebrauchen kann, ist hier der Code den ich von Stackoverflow oder einer anderen Seite verwendet hatte:

 

 

setTimeout ist des Rätsels Lösung

Statt weiter mit irgendwelchen komischen sleep-Funktionen herumzuprobieren habe ich dann die setTimeout-Funktion gefunden, welche wie folgt funktioniert:

Man gibt ihr eine Funktion an und einen Zeitraum in ms nachdem diese dann ausgeführt wird. Das Konzept dahinter habe ich aufgrund der Asynchronität in Javascript zuerst nicht wirklich verstanden und es ist vermutlich eher ein Thema für einen eigenen Artikel. In Bezug auf dieses Problem ist erst einmal folgendes wichtig: Es wird nur die Ausführung der gewünschten Funktion verzögert und funktioniert damit tatsächlich!

 

Fazit

Ich hasse Javascript 😀

 

Schreibe einen Kommentar