Til Top

I Google Analytics API med PHP - Del 1: Introduktion 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:

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

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:

Kopier til udklipsholder | Vis uden linie #
01 <?php
02 //forsøg  at  logge  ind,  giv  fejl  hvis  ikke
03 if(login())  {
04        //vi  er  nu  logget  ind
05        echo  'logget  ind';  
06        $xml  =  hent_data('https://www.google.com/analytics/feeds/data?ids=ga:5311824&dimensions=ga:date&metrics=ga:visits&st art-date=2009-04-01&end-date=2009-04-07&prettyprint=true');  //hent  data  fra  google
07 }  else{
08        //ikke  logget  ind
09        echo  'Der  opstod  en  fejl  i  login';        
10 }
11 ?>

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:

Kopier til udklipsholder | Vis uden linie #
01 <entry>
02        <id>http:
03        <updated>2009-04-06T17:00:00.001-07:00</updated>
04        <title  type='text'>ga:date=20090401</title>
05        <link  rel='alternate'  type='text/html'  href='http://www.google.com/analytics'/>
06        <dxp:dimension  name='ga:date'  value='20090401'/>
07        <dxp:metric  confidenceInterval='0.0'  name='ga:visits'  type='integer'  value='71'/>
08 </entry>

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

Kopier til udklipsholder | Vis uden linie #
01 <?php
02 //forsøg  at  logge  ind,  giv  fejl  hvis  ikke
03 if(login())  {
04        //vi  er  nu  logget  ind
05        echo  'logget  ind';  
06        $xml  =  hent_data('https://www.google.com/analytics/feeds/data?ids=ga:5311824&dimensions=ga:date&metrics=ga:visits&st art-date=2009-04-01&end-date=2009-04-07&prettyprint=true');  //hent  data  fra  google
07        if($xml)  {  
08                $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
09                $xml        =  new  SimpleXMLElement($xml);  //start  simple  xml  og  load  vores  xml  ind
10                $data  =  array();  //array  vi  vil  gemme  vores  data  i
11                foreach  ($xml->entry  as  $entry)  {  //gennemløb  entry  da  det  er  her  vores  dage  er  gemt  
12                        $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
13                        $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
14                        $data[$dag]=$antal;  //tilføj  til  vores  data  array
15                }        
16        }  else{
17                echo  'Fejl  i  xml';
18        }
19 }  else{
20        //ikke  logget  ind
21        echo  'Der  opstod  en  fejl  i  login';        
22 }
23 ?>

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:

Kopier til udklipsholder | Vis uden linie #
01 Array
02 (
03        [2009-04-01]  =>  71
04        [2009-04-02]  =>  76
05        [2009-04-03]  =>  63
06        [2009-04-04]  =>  79
07        [2009-04-05]  =>  70
08        [2009-04-06]  =>  65
09        [2009-04-07]  =>  52
10 )

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

Kopier til udklipsholder | Vis uden linie #
01 <?php
02 if(login())  {
03        //vi  er  nu  logget  ind
04        echo  'logget  ind';  
05        if($xml)  {  
06                $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
07                $xml        =  new  SimpleXMLElement($xml);  //start  simple  xml  og  load  vores  xml  ind
08                $data  =  array();  //array  vi  vil  gemme  vores  data  i
09                echo  '<table>';
10                foreach  ($xml->entry  as  $entry)  {  //gennemløb  entry  da  det  er  her  vores  dage  er  gemt  
11                        $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
12                        $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
13                        echo  
14                                <tr>
15                                        <td>'.$dag.'</td>
16                                        <td>'.$antal.'</td>
17                                </tr>;
18                }
19                echo  '</table>';
20        }
21 }  else{
22        //ikke  logget  ind
23        echo  'Der  opstod  en  fejl  i  login';        
24 }
25 ?>

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

kommentarer

Skrevet d. 6. Maj 2009 14:37 af ask josephsen
Bruger billede Tak for koden :) det ser jo piv-let ud når du præsenterer det på den måde...

skriv kommentar

Felter markeret med gult og * er påkrævet







Sikkerheds kode


Pingbacks

Hvis du linker til en af mine blog artikler fra et blogsystem der udsender pings vil du få et gratis do-follow link fra mig, du kna også twitte om en post og få et link til din twitter profil (Jeg forbeholder mig dog retten til at slette eller nofollow spam :P)

Hent profiloversigt fra google analytics api med PHP - Webudvikling | Blog om Webudvikling og andre nørderier fra Martin Nielsen
Sådan henter du en oversigt over dine profiler i google analytics med google analytics api og php - Webudvikling og andre nørderier [...]
Kode eksempel til Analytics API | Webanalyse blog | Webanalytiker.dk
Eksempler på Google Analytics API udtræk. Få oversigten over hvordan du skal trække data ud af Google Analytics med API. [...]
Pingback d. 5. Maj 2009 11:32 fra http://twitter.com/skardhamar
Tweetback fra: @skardhamar
rt @codenerd Google Analytics API med PHP - Del 2: Hent data http://tinyurl.com/cwqgcd [...]
Pingback d. 5. Maj 2009 11:41 fra http://twitter.com/webanalytiker
Tweetback fra: @webanalytiker
RT @codenerd Google Analytics API med PHP - Del 2: Hent data http://tinyurl.com/cwqgcd [...]