Skip to content

Instantly share code, notes, and snippets.

@mbaersch
Last active November 1, 2020 19:06
Show Gist options
  • Save mbaersch/d1c4c63dd11077b1eb821b1cafac6f4d to your computer and use it in GitHub Desktop.
Save mbaersch/d1c4c63dd11077b1eb821b1cafac6f4d to your computer and use it in GitHub Desktop.
/* Variante: Nur speichern der ersten Quelle (als Cookie "gmsOrgSource"). Alle anderen Hinweise: Siehe oben */
function setSourceCookie(domain) {
function getParamValue(pname, url) {
pname = pname.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var rx = new RegExp("[\\?&]" + pname + "=([^&#]*)");
var results = rx.exec(url);
if (results == null) {
return "";
} else return results[1];
}
var res;
//Erste Quelle schon ausgewertet? Dann uebergehen
if (document.cookie.indexOf('gmsOrgSource') < 0) {
var srcTag = "";
var url = document.location.href;
var host = document.location.hostname;
var ref = document.referrer.toLowerCase();
refdomain = (ref) ? ref.split('/')[2] : '';
if ((url.indexOf('utm_source=') >= 0) && (url.indexOf('utm_medium=') >= 0)) {
//UTM Parameter verwenden, wenn vorhanden
srcTag = getParamValue('utm_source', url) + ' / ' +
getParamValue('utm_medium', url);
if (url.indexOf('utm_campaign=') >= 0)
srcTag += ' [' + getParamValue('utm_campaign', url) + ']';
} else if ((ref == "") || (refdomain == host)) {
//Kein Referrer vorhanden oder Selbstreferenz
srcTag = "direct / none";
} else {
//Referrer auswerten...
if ((refdomain.substring(0, 21) == 'www.googleadservices.') || (
refdomain.indexOf('googlesyndication.com') > 0) || (
refdomain.substring(0, 27) == 'googleads.g.doubleclick.net'
)) {
srcTag = "google / cpc";
} else if (refdomain.substring(0, 11) == 'www.google.') {
srcTag = (url.indexOf('gclid=') >= 0) ? 'google / cpc' : (url
.indexOf('dclid=') >= 0) ? 'google / cpm' :
'google / organic';
} else if (refdomain.substring(0, 9) == 'www.bing.') {
//Ja, hier steckt die Annahme drin, dass das Keyword als Parameter bei Ziel-URLs verwendet wird.
//Ansonsten greifen die hoffentlich verwendeten UTM Parameter
srcTag = (url.indexOf('keyword=') >= 0) || (url.indexOf('msclkid=') >= 0) ? 'bing / cpc' :
'bing / organic';
} else if (ref.search(/ (daum\.net)|(eniro\.se)|(naver\.com)|(yahoo\.com)|(msn\.com)|(aol\.com)|(lycos\.com)|(ask\.com)|(altavista\.com)|(search\.netscape\.com)|(about\.com)|(alltheweb\.com)|(voila\.fr)|(search\.virgilio\.it)|(baidu\.com)|(alice\.com)|(yandex\.com)|(najdi\.org\.mk)|(seznam\.cz)|(wp\.pl)|(online\.onetce&szlig;ter\.org)|(szukacz\.pl)|(yam\.com)|(pchome\.com)|(kvasir\.no)|(sesam\.no)|(ozu\.es)|(terra\.com)|(mynet\.com)|(ekolay\.net)|(rambler\.ru)|(duckduckgo\.com)|(ecosia\.org)|(metager\.de)|(suche\.aol\.de)|(search\.aol\.com)|(metager2\.de)|(metasuche\.ch)|(qwant\.com)|(search\.avira\.com)|(samsung\.de\.searchturbo\.com)|(search\.1and1\.com)|(search\.avast\.com)|(search\.excite\.com)|(search\.gmx\.net)|(search\.infospace\.com)|(search\.mail\.com)|(search\.selfbutler\.com)|(search\.yahoo\.com)|(searchthis\.com)|(sm\.de)|(suche\.1und1\.de)|(suche\.gmx\.at)|(suche\.gmx\.ch)|(suche\.gmx\.net)|(suche\.t-online\.de)|(suche\.web\.de)|(suchen\.1und1\.de)|(suchen\.co\.at)|(swissle\.ch)|(thesmartsearch\.net)|(vodafone\.de\.searchturbo\.com)|(yoursearch\.me)|(zapmeta\.at)|(zapmeta\.ch)|(zapmeta\.com)|(zapmeta\.de)|(zdsearch\.com)/i) > 0){
//andere Bekannte Suchmaschinen. Annahme: Alles, was hierher kommt, ist organisch.
//Das muss freilich nicht immer stimmen (z. B. bei Links aus Foren etc.)
srcTag = refdomain + " / organic";
} else srcTag = refdomain + " / referral";
}
//Ergebnis speichern als erste Quelle
if (srcTag != "direct / none") {
res = srcTag;
var cExDate = new Date(+new Date() + 1000 * 60 * 60 * 24 * 30 * 6);
document.cookie = 'gmsOrgSource=' + srcTag + ';Expires=' +
cExDate.toGMTString() + ';domain=' +
domain || host + ';path=/';
}
}
return res;
}
/* Ermittelt die Quelle eines Besuchers und speichert diese in einem Session-Cookie "gmsSource" für die laufende Sitzung.
Wenn es die erste Sitzung ist (erkannt anhand des eigenen Cookies), wird der Wert als ursprüngliche Trafficquelle
zusätzlich dauerhaft (inkl. aller Probleme mit ITP & Co. für maximal 6 Monate) in einem weiteren
Cookie "gmsOrgSource" gespeichert.
Wird eine ursprüngliche Quelle im Fall einer ersten Sitzung gespeichert, liefert die Funktion die Quelle
als Rückgabewert zurück.
Nutzung: z. B. als verstecktes Feld in Kontaktformularen zur Dokumentation der Besucherquelle. Auch die
Speicherung in einer Benutzerdefinierten Dimension auf User-Ebene in Google Analytics ist damit möglich.
*/
function setSourceCookie(domain) {
function getParamValue(pname, url) {
pname = pname.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var rx = new RegExp("[\\?&]" + pname + "=([^&#]*)");
var results = rx.exec(url);
if (results == null) {
return "";
} else return results[1];
}
var res;
//Quelle schon ausgewertet? Dann uebergehen
if (document.cookie.indexOf('gmsSource') < 0) {
var srcTag = "";
var url = document.location.href;
var host = document.location.hostname;
var ref = document.referrer.toLowerCase();
refdomain = (ref) ? ref.split('/')[2] : '';
if ((url.indexOf('utm_source=') >= 0) && (url.indexOf('utm_medium=') >= 0)) {
//UTM Parameter verwenden, wenn vorhanden
srcTag = getParamValue('utm_source', url) + ' / ' +
getParamValue('utm_medium', url);
if (url.indexOf('utm_campaign=') >= 0)
srcTag += ' [' + getParamValue('utm_campaign', url) + ']';
} else if ((ref == "") || (refdomain == host)) {
//Kein Referrer vorhanden oder Selbstreferenz
srcTag = "direct / none";
} else {
//Referrer auswerten...
if ((refdomain.substring(0, 21) == 'www.googleadservices.') || (
refdomain.indexOf('googlesyndication.com') > 0) || (
refdomain.substring(0, 27) == 'googleads.g.doubleclick.net'
)) {
srcTag = "google / cpc";
} else if (refdomain.substring(0, 11) == 'www.google.') {
srcTag = (url.indexOf('gclid=') >= 0) ? 'google / cpc' : (url
.indexOf('dclid=') >= 0) ? 'google / cpm' :
'google / organic';
} else if (refdomain.substring(0, 9) == 'www.bing.') {
//Ja, hier steckt die Annahme drin, dass das Keyword als Parameter bei Ziel-URLs verwendet wird.
//Ansonsten greifen die hoffentlich verwendeten UTM Parameter
srcTag = (url.indexOf('keyword=') >= 0) ? 'bing / cpc' :
'bing / organic';
} else if (ref.search(/ (daum\.net)|(eniro\.se)|(naver\.com)|(yahoo\.com)|(msn\.com)|(aol\.com)|(lycos\.com)|(ask\.com)|(altavista\.com)|(search\.netscape\.com)|(about\.com)|(alltheweb\.com)|(voila\.fr)|(search\.virgilio\.it)|(baidu\.com)|(alice\.com)|(yandex\.com)|(najdi\.org\.mk)|(seznam\.cz)|(wp\.pl)|(online\.onetce&szlig;ter\.org)|(szukacz\.pl)|(yam\.com)|(pchome\.com)|(kvasir\.no)|(sesam\.no)|(ozu\.es)|(terra\.com)|(mynet\.com)|(ekolay\.net)|(rambler\.ru)|(duckduckgo\.com)|(ecosia\.org)|(metager\.de)|(suche\.aol\.de)|(search\.aol\.com)|(metager2\.de)|(metasuche\.ch)|(qwant\.com)|(search\.avira\.com)|(samsung\.de\.searchturbo\.com)|(search\.1and1\.com)|(search\.avast\.com)|(search\.excite\.com)|(search\.gmx\.net)|(search\.infospace\.com)|(search\.mail\.com)|(search\.selfbutler\.com)|(search\.yahoo\.com)|(searchthis\.com)|(sm\.de)|(suche\.1und1\.de)|(suche\.gmx\.at)|(suche\.gmx\.ch)|(suche\.gmx\.net)|(suche\.t-online\.de)|(suche\.web\.de)|(suchen\.1und1\.de)|(suchen\.co\.at)|(swissle\.ch)|(thesmartsearch\.net)|(vodafone\.de\.searchturbo\.com)|(yoursearch\.me)|(zapmeta\.at)|(zapmeta\.ch)|(zapmeta\.com)|(zapmeta\.de)|(zdsearch\.com)/i) > 0){
//andere Bekannte Suchmaschinen. Annahme: Alles, was hierher kommt, ist organisch.
//Das muss freilich nicht immer stimmen (z. B. bei Links aus Foren etc.)
srcTag = refdomain + " / organic";
} else srcTag = refdomain + " / referral";
}
//Ergebnis speichern in Session und ggf. als erste Quelle
if (!domain) domain = host;
//Quelle der Sitzung speichern
document.cookie = 'gmsSource=' + srcTag + ';domain=' + domain +
';path=/';
//Quelle dauerhaft speichern, wenn nicht bereits vorhanden.
//Aktiv ist eine "First Non-Direct-Click"-Variante, die nur speichert, was nicht "direct" ist.
//Soll auch Direct als erste Quelle gespeichert werden, folgende Bedingung statt der aktiven verwenden:
//if (document.cookie.indexOf('gmsOrgSource') < 0) {
if ((srcTag != "direct / none") && (document.cookie.indexOf('gmsOrgSource') < 0)) {
res = srcTag;
var cExDate = new Date(+new Date() + 1000 * 60 * 60 * 24 * 30 *
6);
document.cookie = 'gmsOrgSource=' + srcTag + ';Expires=' +
cExDate.toGMTString() + ';domain=' +
domain + ';path=/';
}
}
return res;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment