Created
September 8, 2020 21:46
-
-
Save mbaersch/0524eb9cb4093b31f2085b887202a595 to your computer and use it in GitHub Desktop.
Serverside GTM Demo Client + Tag Template
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
___INFO___ | |
{ | |
"type": "CLIENT", | |
"id": "cvt_temp_public_id", | |
"version": 1, | |
"securityGroups": [], | |
"displayName": "Demo Logger", | |
"brand": { | |
"id": "brand_dummy", | |
"displayName": "" | |
}, | |
"description": "", | |
"containerContexts": [ | |
"SERVER" | |
] | |
} | |
___TEMPLATE_PARAMETERS___ | |
[] | |
___SANDBOXED_JS_FOR_SERVER___ | |
//Alle APIs, die wir zum Lesen, Verarbeiten und Weitergeben brauchen, werden hier geladen | |
const claimRequest = require('claimRequest'); | |
const returnResponse = require('returnResponse'); | |
const getRequestQueryParameter = require('getRequestQueryParameter'); | |
const runContainer = require('runContainer'); | |
const setPixelResponse = require('setPixelResponse'); | |
const getRequestHeader = require('getRequestHeader'); | |
const getRequestPath = require('getRequestPath'); | |
const getRemoteAddress = require('getRemoteAddress'); | |
//Wurde "unser" Endpunkt angesprochen? Wenn ja, sind die Daten für | |
//diesen Client relevant, sonst tun wir nichts | |
if (getRequestPath() === '/demologger') { | |
//Wir werden die Daten verarbeiten, kein anderer Client muss diese dann noch bekommen | |
claimRequest(); | |
//Auslesen der drei erforderlichen Parameterwerte aus der Anfrage | |
//oder im Fall der url entweder per Parameter oder aus dem Referrer des Aufrufs | |
//Sonderfall cid: Wir nutzen eine Konstante, wenn diese fehlen sollte | |
const ref = getRequestQueryParameter('ref'); | |
const url = getRequestQueryParameter('url') || getRequestHeader('Referer'); | |
const cid = getRequestQueryParameter('cid') || 666; | |
//Exemplarisch "erheben" wir auch den User Agent und die IP, um diese | |
//allen nutzenden Tags zur Verfügung zu stellen | |
const ip = getRemoteAddress(); | |
const ua = getRequestHeader('user-agent'); | |
//Daten zusammenstellen, die den Tags zur Verfügung gestellt werden sollen | |
var event = {event_name : "page_view", page_location : url, client_id : cid, | |
ip_override : ip, user_agent : ua, page_referrer: ref}; | |
//Container aufrufen und Daten übergeben, danach ein Pixel als Antwort auf den Request senden | |
runContainer(event, () => { | |
setPixelResponse(); | |
returnResponse(); | |
}); | |
} | |
___SERVER_PERMISSIONS___ | |
[ | |
{ | |
"instance": { | |
"key": { | |
"publicId": "read_request", | |
"versionId": "1" | |
}, | |
"param": [ | |
{ | |
"key": "queryParametersAllowed", | |
"value": { | |
"type": 8, | |
"boolean": true | |
} | |
}, | |
{ | |
"key": "remoteAddressAllowed", | |
"value": { | |
"type": 8, | |
"boolean": true | |
} | |
}, | |
{ | |
"key": "headersAllowed", | |
"value": { | |
"type": 8, | |
"boolean": true | |
} | |
}, | |
{ | |
"key": "pathAllowed", | |
"value": { | |
"type": 8, | |
"boolean": true | |
} | |
}, | |
{ | |
"key": "queryParameterAccess", | |
"value": { | |
"type": 1, | |
"string": "any" | |
} | |
}, | |
{ | |
"key": "requestAccess", | |
"value": { | |
"type": 1, | |
"string": "specific" | |
} | |
}, | |
{ | |
"key": "headerAccess", | |
"value": { | |
"type": 1, | |
"string": "any" | |
} | |
} | |
] | |
}, | |
"clientAnnotations": { | |
"isEditedByUser": true | |
}, | |
"isRequired": true | |
}, | |
{ | |
"instance": { | |
"key": { | |
"publicId": "return_response", | |
"versionId": "1" | |
}, | |
"param": [] | |
}, | |
"isRequired": true | |
}, | |
{ | |
"instance": { | |
"key": { | |
"publicId": "access_response", | |
"versionId": "1" | |
}, | |
"param": [ | |
{ | |
"key": "writeResponseAccess", | |
"value": { | |
"type": 1, | |
"string": "any" | |
} | |
}, | |
{ | |
"key": "writeHeaderAccess", | |
"value": { | |
"type": 1, | |
"string": "specific" | |
} | |
} | |
] | |
}, | |
"clientAnnotations": { | |
"isEditedByUser": true | |
}, | |
"isRequired": true | |
}, | |
{ | |
"instance": { | |
"key": { | |
"publicId": "run_container", | |
"versionId": "1" | |
}, | |
"param": [] | |
}, | |
"isRequired": true | |
} | |
] | |
___TESTS___ | |
scenarios: [] | |
___NOTES___ | |
Created on 8.9.2020, 23:39:33 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
___INFO___ | |
{ | |
"type": "TAG", | |
"id": "cvt_temp_public_id", | |
"version": 1, | |
"securityGroups": [], | |
"displayName": "Demo Tag", | |
"brand": { | |
"id": "brand_dummy", | |
"displayName": "" | |
}, | |
"description": "", | |
"containerContexts": [ | |
"SERVER" | |
] | |
} | |
___TEMPLATE_PARAMETERS___ | |
[ | |
{ | |
"type": "TEXT", | |
"name": "endpointUrl", | |
"displayName": "Da gehts hin", | |
"simpleValueType": true | |
} | |
] | |
___SANDBOXED_JS_FOR_SERVER___ | |
const getAllEventData = require('getAllEventData'); | |
const sendHttpGet = require('sendHttpGet'); | |
const encodeUriComponent = require('encodeUriComponent'); | |
//URL des Trackers aus den Feldern lesen | |
const serviceUrl = data.endpointUrl; | |
//Alle Event-Daten lesen (weil wir faul sind) | |
const eventData = getAllEventData(); | |
//Die beiden verwendeten Datenelemente auslesen | |
const url = encodeUriComponent(eventData.page_location || ""); | |
const cid = encodeUriComponent(eventData.client_id || ""); | |
//Wenn wenigstens eine URL oder ID da sind, Trackinghit | |
//senden. Sonst Fehler an Container zurückmelden | |
if (cid || url) { | |
sendHttpGet(serviceUrl + '?cid='+cid+'&loc='+url); | |
data.gtmOnSuccess(); | |
} else data.gtmOnFailure(); | |
___SERVER_PERMISSIONS___ | |
[ | |
{ | |
"instance": { | |
"key": { | |
"publicId": "read_event_data", | |
"versionId": "1" | |
}, | |
"param": [ | |
{ | |
"key": "eventDataAccess", | |
"value": { | |
"type": 1, | |
"string": "any" | |
} | |
} | |
] | |
}, | |
"clientAnnotations": { | |
"isEditedByUser": true | |
}, | |
"isRequired": true | |
}, | |
{ | |
"instance": { | |
"key": { | |
"publicId": "send_http", | |
"versionId": "1" | |
}, | |
"param": [ | |
{ | |
"key": "allowedUrls", | |
"value": { | |
"type": 1, | |
"string": "any" | |
} | |
} | |
] | |
}, | |
"clientAnnotations": { | |
"isEditedByUser": true | |
}, | |
"isRequired": true | |
} | |
] | |
___TESTS___ | |
scenarios: [] | |
___NOTES___ | |
Created on 8.9.2020, 23:40:09 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Code zum Blogbeitrag unter https://www.markus-baersch.de/blog/eigene-clients-und-tags-fuer-den-gtm-tag-server/ bzw. Video unter https://www.youtube.com/watch?v=wDrctoXw_I0