@codenerd på twitter Mit seneste tweet:

Google Analytics API med PHP – Del 2: Hent data

I Introduktion til Google Analytics API gennemgik jeg hvordan du loggede ind i Google Analytics API. Del 2 fokuserer på hvordan vi kan hente data fra APIen og hvordan dette kan læses og fx omdannes til et array som er nemt at tilgå fra PHP. Vi tager udgangspunkt i koden fra Del 1, og jeg vil derfor anbefale at du henter hente min fil her.

Hvilke data kan jeg hente?

De data som er tilgængelige via Google Analytics, er også tilgængelige i APIen, så det handler simpelthen bare om at sende de korrekte forespørgsler, og behandle det svar der kommer fra APIen.

Når vi snakker google analytics api er der generelt fem typer reporter vi kan forespørger på:

  • Besøgende
  • Trafik kilder
  • Indhold
  • Mål
  • E-handel

Inden for disse fem områder er der så en lang række rapporttyper vi kan hive ud. Dette kommer vi tilbage til.

For at kunne hente data, skal vores applikation kende det numeriske ID for den profil vi ønsker at hente data fra. For at finde dette ID går du ind i Analytics og trykker “Se Rapport” Du vil nu kunne  finde dit ID i browserens adresselinje fx som ved min:

https://www.google.com/analytics/reporting/?reset=1&id=5311824&pdr=20090402-20090502

Koden fremhævet med rød er vores profil id.

Vores første dataudtræk

Når vi skal hente data fra APIen, skal vi lave de korrekte forespørgsler til https://www.google.com/analytics/feeds/data. For at kunne gøre dette bruger vi cURL, og tilføjer først og fremmest følgende funktion til vores php fil:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
/**
* Hent data fra url i analytics api
* @param string - url vi vil hente
* @return string|boolean xml output fra analytics eller false hvis fejl
*/
function hent_data($url) {
    global $auth; //gør vores auth global
    $headers = array("Authorization: GoogleLogin auth=$auth"); //sæt headers med auth
    $ch = curl_init($url); //start curl
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //tilføj vores headers
    $google_svar = curl_exec($ch); //googles svar -enten en fejl eller vores feed
    $google_info = curl_getinfo($ch); //hent headers
    curl_close($ch); //stop curl
    if($google_info['http_code'] == 200) {//hvis ikke fejl
        return $google_svar; //retuner vores xml
    }
    else {
        //udskriv fejl for nemhedens skyld og retuner false
        echo $google_svar;
        return false;
    }
}
?>    

Funktionen bruger cURL til at forespørger en given url. Som headers medsender vi vores variabel $auth, som indeholder vores auth token fra login() funktionen. Når vi spørger google om data, får vi enten data tilbage i XML format, eller også får vi en fejl besked.

Opbygning af kald til APIen

Data kald er altid til https://www.google.com/analytics/feeds/data, og disse kald skal formateres med følgende parametre:

URL Altid: https://www.google.com/analytics/feeds/data og er selvfølgelig påkrævet
Profil ID Påkrævet. Det unikke numeriske ID for en profil fx 5311824 – dette skal formateres med ga foran, således vi får ga:5311824
dimensions

Dimensions er måden hvorpå vores svar fra Google er grupperet, dette kan fx være efter dato, land, by osv osv. Du kan max forespørge på 7 dimensions.

metrics

Metrics angiver hvilke tal det er vi ønsker at få ud og grupperet efter dimensions. Her kan fx være tale om antal besøgende, antal sidevisninger, konverteringer osv. Du kan max forespørge på 10 metrics ad gangen.

sort Hvis vi ønsker det kan vi sortere vores resultat efter vores dimensions og metrics
filters Hvis vi ønsker det kan vi filtrere vores resultater
date range
start-date & end-date
Her skal vi angive hvilken periode vi ønsker vores rapport skal strække sig over. Det er vigtigt at huske at angive datoer i amerikansk dato format dvs. 1/5/2009 bliver til 2009-05-01

De forskellige metrics og dimensions kommer vi ikke ind på her, men i stedet i de enkelte eksempler. I dag kommer vi til at se hvordan vi kan hive antal besøgende ud for en given dato eller periode på fx en uge, og de eneste parametrer vi vil bruge er profil id, dimensions metrics og date range.

Hent antal besøgende for en given periode

Det første vi skal vidde er hvilken metrics og dimensions vi skal anvende, her er det bare et spørgsmål om at slå op på siden og finde de rette. I dag bruger vi ga:date som dimension (hvilket grupperer resultaterne efter dato), og ga:visits som metric, og vi henter data ud fra den 1 april 2009 til den 7 april 2009 – hvilket bliver til 2009-04-01 og 2009-04-07. Derved får vi følgende URL:

https://www.google.com/analytics/feeds/data?ids=ga:5311824&dimensions=ga:date&metrics=ga:visits&start-date=2009-04-01&end-date=2009-04-07

Det er denne URL vi skal sende igennem vores hent_data() funktion:

PHP
1
2
3
4
5
6
7
8
9
10
11
<?php
//forsøg at logge ind, giv fejl hvis ikke
if (login()) {
    //vi er nu logget ind
    echo 'logget ind';
    $xml = hent_data('https://www.google.com/analytics/feeds/data?ids=ga:5311824&dimensions=ga:date&metrics=ga:visits&start-date=2009-04-01&end-date=2009-04-07&prettyprint=true'); //hent data fra google
} else {
    //ikke logget ind
    echo 'Der opstod en fejl i login';    
}
?>

Nu er vores data gemt i variablen $xml – dette data vil vi nu omdanne til en array med dato som key, og antal besøg som værdi. Vores XML svar (uddrag) ser nu sådan her ud:

PHP
1
2
3
4
5
6
7
8
<entry>
    <id>http://www.google.com/analytics/feeds/data?ids=ga:5311824&ga:date=20090401&start-date=2009-04-01&end-date=2009-04-07</id>
    <updated>2009-04-06T17:00:00.001-07:00</updated>
    <title type='text'>ga:date=20090401</title>
    <link rel='alternate' type='text/html' href='http://www.google.com/analytics'/>
    <dxp:dimension name='ga:date' value='20090401'/>
    <dxp:metric confidenceInterval='0.0' name='ga:visits' type='integer' value='71'/>
</entry>

For hver dag i vores periode vil der være et entry – og det er disse entrys vi skal ha omdannet:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
//forsøg at logge ind, giv fejl hvis ikke
if (login()) {
    //vi er nu logget ind
    echo 'logget ind';
    $xml = hent_data('https://www.google.com/analytics/feeds/data?ids=ga:5311824&dimensions=ga:date&metrics=ga:visits&start-date=2009-04-01&end-date=2009-04-07&prettyprint=true'); //hent data fra google
    if ($xml) { //er xml loadet?
        $xml = str_replace('dxp:','',$xml); //simple xml håndtere namespaces på en lidt besværlig måde, så for nemhedens skyld fjerner vi bare dxp: fra noder i xml dokumentet
        $xml = new SimpleXMLElement($xml); //start simple xml og load vores xml ind
        $data = array(); //array vi vil gemme vores data i
        foreach ($xml->entry as $entry) { //gennemløb entry da det er her vores dage er gemt
            $dag=date('Y-m-d',strtotime($entry->dimension->attributes()->value)); //hent dato som er vores dimension - denne er ikke formateret så det må vi selv klare med date og strtotime
            $antal=(integer)$entry->metric->attributes()->value; //hent antal besøg for dagen - vi er nødt til at angive datatypen her da vi ellers vil gemme et simple xml objekt
            $data[$dag]=$antal; //tilføj til vores data array
        }    
    } else {
        echo 'Fejl i xml';
    }
} else {
    //ikke logget ind
    echo 'Der opstod en fejl i login';    
}
?>

Før vi kan indlæse XMLen i SimpleXML fjerner vi lige dxp: (namespace) fra XMLen, dette gør jeg da SimpleXML håndterer namespaces lidt underligt, og det vil kræve en lidt længere forklaring. Når vi har loadet XMLen i SimpleXML kan vi gennemløbe alle “entry” noder med en almindelig foreach løkke. I denne løkke hiver vi så vores data ud. Hvis vi skal ha’ fat i en node bruger vi ->nodenavn, og hvis vi skal bruge en nodes attributter bruger vi ->nodenavn->attributes()->attributnavn

Når vi gemmer data fra SimpleXML, er det vigtigt at vi angiver en datatype eller behandler dataet, da vi ellers vil få gemt et simplexml objekt.

Vores uges data er nu gemt i arrayet $data som vi nemt kan tilgå fra PHP, arrayet ser sådan her ud:

PHP
1
2
3
4
5
6
7
8
9
10
Array
(
[2009-04-01] => 71
[2009-04-02] => 76
[2009-04-03] => 63
[2009-04-04] => 79
[2009-04-05] => 70
[2009-04-06] => 65
[2009-04-07] => 52
)

Vi kan selvfølgelig også bare udskrive vores data direkte til skærmen, fx i en tabel:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
if (login()) {
    //vi er nu logget ind
    echo 'logget ind';
    if ($xml) { //er xml loadet?
        $xml = str_replace('dxp:','',$xml); //simple xml håndtere namespaces på en lidt besværlig måde, så for nemhedens skyld fjerner vi bare dxp: fra noder i xml dokumentet
        $xml = new SimpleXMLElement($xml); //start simple xml og load vores xml ind
        $data = array(); //array vi vil gemme vores data i
        echo '<table>';
        foreach ($xml->entry as $entry) { //gennemløb entry da det er her vores dage er gemt
            $dag=date('d/m - Y',strtotime($entry->dimension->attributes()->value)); //hent dato som er vores dimension - denne er ikke formateret så det må vi selv klare med date og strtotime
            $antal=(integer)$entry->metric->attributes()->value; //hent antal besøg for dagen - vi er nødt til at angive datatypen her da vi ellers vil gemme et simple xml objekt
            echo '
                <tr>
                    <td>'.$dag.'</td>
                    <td>'.$antal.'</td>
                </tr>';
        }
        echo '</table>';
    }
} else {
    //ikke logget ind
    echo 'Der opstod en fejl i login';    
}
?>

Afslutning

Du har nu lært at hive data ud fra en dimension og en metric – så nu er det bare at kigge på metrics og dimensions, og prøve at hive forskellige rapporter ud.

Som altid kan du se min fulde kildekode for dag 2 her

Nu har du fået lidt at lege med, så det får du en ekstra dag til. På torsdag kigger vi på flere eksempler, herunder sortering, filtrering og brug af flere dimensions og metrics

Samlet bedømmelse

Martin Nielsen giver den: 1 ud af 5
starstarstarstarstar

3 kommentarer

  1. Pingback: Hent profiloversigt fra google analytics api med PHP | Martin Nielsens nørdede tanker

  2. Pingback: Google Analytics API med PHP - Del 3: Avancerede dataudtræk | Martin Nielsens nørdede tanker

Leave a Reply to ask josephsen Cancel reply

Krævede felter er markeret med *.

*