Tracking script zoals analytics

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Brecht S

Brecht S

27/10/2016 22:15:47
Quote Anchor link
Ik ben aan het uitzoeken hoe ik iets gelijkaardig kan maken aan het trackingscript van google analytics. Deze werken met een javascript code om gegevens te verzenden zonder ajax.
Met wat opzoekwerk vond ik dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
var statsPage = 'http://www.uw-url.be/process.php';
var stats = {
    page: location.href,
    browser: 'ie',
    ip: '127.0.0.1',
    referral: 'google.com?search=test'
};
var params = $.param(stats);
alert(statsPage+'?'+params);
</script>

De alert geeft alles mooi weer.
Nu ben ik nog op zoek naar hoe ik die parameters naar de url opgegeven in statsPage kan verzenden. Ik heb hier geen idee en kan dit ook nergens terugvinden precies. Misschien is er een betere methode om dit te doen ook. Ik luister naar jullie...

Ik vond wel deze, maar weet niet of dit gaat werken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
$('<img>', {
    src: statsPage + '?' + params
}).appendTo('body').remove()


Als ik analytics script bekijk ziet dit er totaal anders uit, maar ik versta daar niet zoveel van. Misschien kan iemand mij dit even uitleggen?
Een voorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-49578310-1', 'auto');
  ga('send', 'pageview');

</script>

De bedoeling zou uiteindelijk zijn dat iedereen dat javascript op zijn pagina kan plakken en ik in de backend alles mooi kan opvangen. Vandaar wou ik niet met AJAX werken en ook niet met een REST API. Daar kan niet iedereen mee overweg.

Voor mijn script (eerst geposte) heb ik ook jquery nodig en voor de analytics.js script niet blijkbaar. In mijn geval moet ook iedereen het jquery script (<script src="https://code.jquery.com/jquery-1.12.4.js"></script>) boven de code gaan zetten. Misschien is dit ook te omslachting?
Gewijzigd op 27/10/2016 22:52:13 door Brecht S
 
PHP hulp

PHP hulp

21/11/2024 13:03:38
 
Ben van Velzen

Ben van Velzen

27/10/2016 23:13:58
Quote Anchor link
Wat meestal gewoon wordt gedaan is gebruik maken van een "meetpixel", dus een image van 1x1 die feitelijk een php script is. Deze kun je gewoon met javascript invoegen, en als je aan iets minder gegevens genoeg hebt kan het zelfs zonder javascript.

Overigens heb je strict genomen jquery nooit *nodig*. De cross browser zaken moet je dan alleen wel even zelf doen. In het geval van het invoegen van een plaatje hoef je niets bijzonders te doen. Zie document.createElement, of zonder fysieke image een Image object.
Gewijzigd op 27/10/2016 23:18:13 door Ben van Velzen
 
Brecht S

Brecht S

27/10/2016 23:34:16
Quote Anchor link
Is dit dan iets wat ik in mijn post heb geschreven?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
$('<img>', {
    src: statsPage + '?' + params
}).appendTo('body').remove()


Ik zie niet direct hoe ik de params kan meesturen met mijn meetpixel zoals jij het hier voorstelt.
 
Ben van Velzen

Ben van Velzen

27/10/2016 23:38:21
Quote Anchor link
Dat is inderdaad wat dat ook doet, maar dat vereist geen jquery als je het gewoon met platte JS oplost.
De params stuur je mee door uit te gaan van een image als http://www.example.com/analytics.php?referer=...&page=... etc. Dat wordt hier ook gedaan, zie de params variabele.
 
Brecht S

Brecht S

27/10/2016 23:48:19
Quote Anchor link
Wat ik dan niet kan doen is die params in een array gaan verzamelen en die automatisch laten toevoegen zoals het nu is met die jquery param? Dus ik moet wel degelijk alles in de URL gaan zetten zodat ik dat er achteraf terug kan uithalen met $_GET?
 
Ben van Velzen

Ben van Velzen

27/10/2016 23:52:14
Quote Anchor link
Om het op die manier te kunnen doen wel ja. Uiteraard zijn er andere mogelijkheden zoals een XHR POST, maar je geeft aan dat je dat niet wilt. Voor de goede orde: je hebt natuurlijk je javascript bestand op jouw server, en deze wordt aangeroepen door de website via een script resource. Je bent daarbij dus vrij om te gebruiken wat je wilt. Voor de betrouwbaarheid zou ik alleen wel snel voor een image gaan, ook om de vertraging voor de website zelf minimaal te houden.

Dus in feite moet je een script gaan ontwerpen die voldoet aan je eisen. Meestal zal gewoon een simple <script src="analytics.js"> genoeg zijn, zonder verdere functiekoppelingen. Maar nogmaals: het is maar net wat je wilt, en hoe savvy je je gebruikers inschat.

En natuurlijk: het voorbeeld van Google is wat ondoorzichtig, maar dat is minified, mogelijk met webpack oid. Wat het doet is een script tag invoegen op de juiste plek in de html. De rest gebeurt in https://www.google-analytics.com/analytics.js.
Gewijzigd op 27/10/2016 23:57:28 door Ben van Velzen
 
Brecht S

Brecht S

28/10/2016 15:24:23
Quote Anchor link
Ik heb nog wat verder zitten graven en ben uiteindelijk tot een werkende code gekomen die je hieronder kan terugvinden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<script type="text/javascript">
var statsPage = 'http://www.my-url.com/response.php';

var p = {
      type: "pageview", //Type: pageview, form, ...
      userid:1,
      gender: "male",
}

var params = Object.keys(p).map(function(k) {
    return encodeURIComponent(k) + '=' + encodeURIComponent(p[k])
}).join('&')

const req = new XMLHttpRequest();
//req.addEventListener('load' /*callback after req is complete*/);
req.open('GET', statsPage + '?' + params);
req.send();

req.onreadystatechange = function() {
    if (req.readyState == XMLHttpRequest.DONE) {
        alert(req.responseText);
    }
}
</script>


Dat werkt helemaal zonder het gebruik van jquery.
Ik heb ook een functie geschreven voor mijn var p
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<script type="text/javascript">
var statsPage = 'http://www.my-url.com/response.php';

function ca(c,o,n,t,e,t,u){return p={type:c,userid:o,gender:n}}

ca("pageview", "1", "male");

var params = Object.keys(p).map(function(k) {
    return encodeURIComponent(k) + '=' + encodeURIComponent(p[k])
}).join('&')

const req = new XMLHttpRequest();
//req.addEventListener('load' /*callback after req is complete*/);
req.open('GET', statsPage + '?' + params);
req.send();

req.onreadystatechange = function() {
    if (req.readyState == XMLHttpRequest.DONE) {
        alert(req.responseText);
    }
}
</script>




Toevoeging:

Wat ik nu nog zou willen toevoegen is een tijd wanneer iemand de pagina verlaat. Hiervoor zou ik in de functie ca nog iets moeten kunnen toevoegen, hoe pak ik dit het best aan?
Ik had hier eerder al iets geschreven daaromtrent:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    var startTime = new Date();        //Start the clock!
    window.onbeforeunload = function()        //When the user leaves the page(closes the window/tab, clicks a link)...
    {
        var endTime = new Date();        //Get the current time.
        var timeSpent = (endTime - startTime);        //Find out how long it's been.
        var xmlhttp;        //Make a variable for a new ajax request.
        if (window.XMLHttpRequest)        //If it's a decent browser...
        {
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp = new XMLHttpRequest();        //Open a new ajax request.
        }
        else        //If it's a bad browser...
        {
            // code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");        //Open a different type of ajax call.
        }
        var url = "http://www.my-url.com/response.php?userID=1&pag_titel=1&datum=1&time="+timeSpent;        //Send the time on the page to a php script of your choosing.
        xmlhttp.open("GET",url,false);        //The false at the end tells ajax to use a synchronous call which wont be severed by the user leaving.
        xmlhttp.send(null);        //Send the request and don't wait for a response.
        
    }

Hoe krijg ik nu die 2 in elkaar?

Toevoeging op 29/10/2016 10:41:38:

Heeft iemand een idee hier?
Gewijzigd op 28/10/2016 18:51:13 door Brecht S
 
Brecht S

Brecht S

29/10/2016 17:47:25
Quote Anchor link
Ik heb volgende script geschreven om te proberen maar de reponse komt altijd in het begin als ik de pagina de eerste keer ga herladen met F5, daarna niet meer. Dus de beforeunload functie werkt hier duidelijk niet. Als ik de browser tab sluit in Chrome krijg ik geen response.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
window.onbeforeunload = function()  {  
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.digital-productions.be/dev/analytics/response.php?pag_titel=1', true);

// If specified, responseType must be empty string or "text"
xhr.responseType = 'test';

xhr.onreadystatechange = function() {
    if (xhr.readyState == XMLHttpRequest.DONE) {
        alert(xhr.responseText);
    }
}

xhr.send(null);

    }
 
Ben van Velzen

Ben van Velzen

29/10/2016 17:52:29
Quote Anchor link
Logisch ook, want onbeforeunload is bedoeld voor de vraag of je wilt wegnavigeren van de huidige pagina. Wat is je doel?
 
Brecht S

Brecht S

29/10/2016 18:12:24
Quote Anchor link
De eerst geschreven code met de functie gaat van zodra een pagina geladen is mij bepaalde parameters doorsturen. Dat zit goed, nu moet er bij het verlaten van de website ook een bepaald aantal parameters verstuurd worden. En dat was ik aan het proberen met de laatst geposte code.
Nu moet dit ook in pure javascript zonder jquery zoals ik mijn eerste code heb opgebouwd.
Gewijzigd op 29/10/2016 18:13:23 door Brecht S
 
Ben van Velzen

Ben van Velzen

29/10/2016 18:24:36
Quote Anchor link
Er is geen betrouwbare trigger voor het verlaten van een pagina. Jammer maar helaas.
 
Brecht S

Brecht S

29/10/2016 18:59:56
Quote Anchor link
Deze eerder geposte code heb ik vroeger nog gebruikt op oude websites om dat bij te houden en dat werkt wel goed...
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var startTime = new Date();        //Start the clock!
    window.onbeforeunload = function()        //When the user leaves the page(closes the window/tab, clicks a link)...
    {
        var endTime = new Date();        //Get the current time.
        var timeSpent = (endTime - startTime);        //Find out how long it's been.
        var xmlhttp;        //Make a variable for a new ajax request.
        if (window.XMLHttpRequest)        //If it's a decent browser...
        {
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp = new XMLHttpRequest();        //Open a new ajax request.
        }
        else        //If it's a bad browser...
        {
            // code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");        //Open a different type of ajax call.
        }
        var url = "http://www.my-url.com/response.php?userID=1&pag_titel=1&datum=1&time="+timeSpent;        //Send the time on the page to a php script of your choosing.
        xmlhttp.open("GET",url,false);        //The false at the end tells ajax to use a synchronous call which wont be severed by the user leaving.
        xmlhttp.send(null);        //Send the request and don't wait for a response.
        
    }

Of ze betrouwbaar is weet ik niet, maar het werkt ondertussen al 3 jaar. Dus de functie onbeforeunload zit hier ook in, waarom is deze dan niet goed in mijn nieuwe code?
 
Ben van Velzen

Ben van Velzen

29/10/2016 19:02:46
Quote Anchor link
Het is in geen van beide gevallen goed of betrouwbaar, je hebt alleen de illusie dat het werkt. Dat is heel wat anders dan dat het daadwerkelijk werkt. De enige manier om "bij te houden" hoe lang men op een pagina aanwezig is, is meten wanneer de volgende pagina wordt opgevraagd.

//When the user leaves the page(closes the window/tab, clicks a link)...
En dat is gewoonweg niet het gedrag van onbeforeunload. In oudere IE versies wel, nu mogelijk ook al niet meer.
onbeforeunload wordt aangeroepen als je op een link klikt of refresht. Wanneer onbeforeunload een resultaat geeft wordt een vraag gesteld of navigatie moet plaatvinden en wordt deze gebruikt voor de tekst in de navigatievraag.
Gewijzigd op 29/10/2016 19:07:18 door Ben van Velzen
 
Brecht S

Brecht S

29/10/2016 19:08:07
Quote Anchor link
De geposte code stuurt een datum mee van zodra de user de pagina verlaat. Ik hou dat bij in database en er is geen enkel record die die gegevens niet heeft. Dus ga ik er van uit dat het wel werkt?
Wat jij bedoeld is hier waarschijnlijk telkens een referrer mee te sturen ook? En op die manier te meten? Ik heb ook geen idee hoe dit aan te pakken eigenlijk... Maar wil dat wel eens proberen. Kan jij me hier even op weg helpen? En wat gaat er gebeuren als iemand een laatste pagina heeft bezocht en dan de browser tab sluit? Dan heb ik waarschijnlijk geen data hieromtrent?

Toevoeging op 29/10/2016 19:09:51:

Is er geen nieuwere manier om die onbeforeunload te laten werken? Of moet ik dit dan toch totaal vergeten? Vind dat raar aangezien dat nu bij mijn oudere websites wel werkt en alles mooi meekomt in de database.

Toevoeging op 29/10/2016 19:56:55:

Ik zie dat een script zoals google analytics gebruikt maakt van onderstaande:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
navigator.sendBeacon = navigator.sendBeacon || function () {
    var xhr = new XMLHttpRequest();

    xhr.open('GET', 'http://www.my-url.com/response.php?pag_title=1');
    xhr.send();

}
};

Is dat iets interessants?
Ik vond ook deze: http://jasonzissman.com/timeme/index.html, dat toont toch duidelijk dat die onbeforeunload nog steeds werkt?
Gewijzigd op 29/10/2016 20:38:12 door Brecht S
 
Ben van Velzen

Ben van Velzen

29/10/2016 23:23:01
Quote Anchor link
Ik heb nergens gezegd dat het *nooit* werkt, ik heb gezegd dat het *onbetrouwbaar* is. Het is deels afhankelijk van de browserinstellingen welke browser je gebruikt etc. In theorie kun je een xhr doen, maar deze zal wel synchroon moeten lopen, omdat de pagina anders al verlaten is voordat de request kan worden gestart. onbeforeunload is in die zin niet meer dan een hack. en wat doe je in het geval dat een pagina legitiem gebruik maakt van onbeforeunload? Dan registreer je een onterechte unload as er op nee wordt geklikt, of je overschrijft de methode zodat dat uberhaupt niet meer werkt. navigator.sendBeacon is een nieuwe methode die dat zo betrouwbaar mogelijk maakt. Zie https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon
Gewijzigd op 29/10/2016 23:25:06 door Ben van Velzen
 
Johan de wit

johan de wit

30/10/2016 12:45:46
Quote Anchor link
Ben van Velzen op 27/10/2016 23:13:58:
Wat meestal gewoon wordt gedaan is gebruik maken van een "meetpixel", dus een image van 1x1 die feitelijk een php script is. Deze kun je gewoon met javascript invoegen, en als je aan iets minder gegevens genoeg hebt kan het zelfs zonder javascript?

Overigens heb je strict genomen jquery nooit *nodig*. De cross browser zaken moet je dan alleen wel even zelf doen. In het geval van het invoegen van een plaatje hoef je niets bijzonders te doen. Zie document.createElement, of zonder fysieke image een Image object.


Hallo Ben,

Dit lijkt mij interessant om meer te weten maar dan zonder javascript. Mag ik hier wat meer over weten
Gewijzigd op 30/10/2016 12:46:41 door johan de wit
 
Ben van Velzen

Ben van Velzen

30/10/2016 14:47:51
Quote Anchor link
Waar loop je dan op vast? Het idee is eenvoudig genoeg, je hebt een PHP script dat een plaatje uitpoept en op de achtergrond wat statistiek bijhoudt.
 
Brecht S

Brecht S

31/10/2016 10:53:13
Quote Anchor link
Indien die sendbeacon een degelijke oplossing zou zijn zou ik graag weten waarom mijn code niet werkt hier.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
navigator.sendBeacon = navigator.sendBeacon || function () {
    var xhr = new XMLHttpRequest();

    xhr.open('GET', 'http://www.my-url.com/response.php?pag_title=1');
    xhr.send();

}
};

Ook hier krijg ik geen response terug. Misschien omdat er geen return in de functie is opgenomen? Enig idee hoe dit aan te pakken?

Voor de meetpixel: de vraag is hoe ik de tijd kan meten tussen de pagina's. Dat zie ik niet.
Gewijzigd op 31/10/2016 10:54:25 door Brecht S
 
Ben van Velzen

Ben van Velzen

31/10/2016 11:44:04
Quote Anchor link
Wanneer je de functie op die manier maakt is het automatisch een no-op. Zie https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon voor de rationale en de manier waarop sendBeacon gebruikt moet worden. Ook staat er nog een alternatief met het maken van een image in de unload.

Waar het op neerkomt is het volgende:
De meeste browsers negeren het gebruik van asynchrone XHR tijdens unload, maar navigator.sendBeacon niet. Deze moet je echter wel even zelf aanroepen tijdens unload.

Je huidige aanpak overschrijft de functie indien deze nog niet bestaat, deels correct.
Wat je wilt doen is het gedrag van navigator.sendBeacon emuleren wanneer deze niet bestaat, door een *synchrone* XHR request te doen, dus met de 3e parameter van xhr.open op false, en met directe doorgave van de data in de attributen zoals de request url niet hardcoded.

Wat je op de pagina op MDN zult terugzien is dat browserondersteuning voor sendBeacon beperkt is.

>> Voor de meetpixel: de vraag is hoe ik de tijd kan meten tussen de pagina's. Dat zie ik niet.
Niet? Trek de request tijd van de vorige en de huidige pagina van elkaar af. *boem* tijd die besteed is op de vorige pagina. Juist om die reden zet je per bezoek een cookie die een "sessie" representeert.
Gewijzigd op 31/10/2016 11:52:34 door Ben van Velzen
 
Brecht S

Brecht S

31/10/2016 12:55:20
Quote Anchor link
De uiteindelijk code zou dus zo moeten zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
window.addEventListener('unload', logData, false);

function logData() {
  navigator.sendBeacon = navigator.sendBeacon || function () {
    var xhr = new XMLHttpRequest();
    var endTime = new Date();

    xhr.open('GET', 'http://www.my-url.com/response.php?endTime='+endTime, false);
    xhr.send();

};
}

Of is dit nog steeds niet juist? Hoe krijg ik hier een response terug in alert van mijn reponse.php file?
Ik heb deze geprobeerd toe te voegen aan mijn functie logData maar krijg niks terug:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
xhr.onreadystatechange = function() {
    if (xhr.readyState == XMLHttpRequest.DONE) {
        alert(xhr.responseText);
    }
}

Wat bedoel je met de direct doorgave van de url niet harcoded?
Ik weet dat de browser ondersteuning beperkt is, heb dat gelezen.

Meetpixel: Wat gebeurd er dan met de eerst bezochte pagina? Die heeft toch geen request tijd?
En hoe kan ik nu weten in dezelfde response.php wat de eerste tijd was en wat de tweede tijd was? Hoe vang ik dat op?
Gewijzigd op 31/10/2016 13:28:50 door Brecht S
 
Ben van Velzen

Ben van Velzen

31/10/2016 13:45:26
Quote Anchor link
Hoezo alert? Je weet dat alerts e.d. gewoon genegeerd worden door de browser tijdens unload? Je zult je script ergens iets moeten laten schrijven om te zien dat het werkt. Tijdens unload werkt alleen het synchroon opvragen van XHR, dus de readystate zal niets gaan doen.

>> Wat bedoel je met de direct doorgave van de url niet harcoded?
Ik weet dat de browser ondersteuning beperkt is, heb dat gelezen.

Simpel. navigator.sendBeacon is een alternatief voor XHR, die zelf een url vraagt als argument. Het is dus de bedoeling om de url uit het argument te gebruiken in je *vervangende* functie, niet om deze daar te gaan hardcoden.

>> Meetpixel: Wat gebeurd er dan met de eerst bezochte pagina? Die heeft toch geen request tijd?
En hoe kan ik nu weten in dezelfde response.php wat de eerste tijd was en wat de tweede tijd was? Hoe vang ik dat op?

Natuurlijk heeft die dat wel, dat is de tijd waarop hij wordt opgevraagd. Dat gooi je gewoon in je database. Ik zie echt niet wat daar niet duidelijk aan is.


Het eindresultaat is heel simpel, je gooit de instructies nu gewoon door elkaar en hoopt dat het werkt, terwijl iets als dit beter zal gaan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
navigator.sendBeacon = navigator.sendBeacon || function (url, data) {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', url, false);
    xhr.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
    xhr.send(data);
};

function logData() {
  var data = {'endDate': new Date()};
  navigator.sendBeacon('http://www.my-url.com/response.php', data);
}

window.addEventListener('unload', logData, false);


Uiteraard niet getest, maar het zal iets in deze geest moeten worden. Dit POST gegevens naar response.php, geheel volgens sendBeacon specificatie.
Gewijzigd op 31/10/2016 13:50:55 door Ben van Velzen
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.