Hente data med Google Analytics API

Som nevnt i forrige blogginnlegg har jeg brukt API-et til Google Analytics en del de senere årene.

Her skal jeg dele fremgangsmåten og vise et konkret eksempel.

Autentisering

Å hente ut data via API-et til Google Analytics gjøres i to operasjoner:

  1. Man henter en «token» for autentisering
  2. Man bruker tidligere hentet «token» til å hente ut data

Når man spør etter en slik «token» får man en lang tekststreng i retur. Hva du gjør med denne er opp til deg, men du må ta vare på den til senere. Hver «token» har en begrenset varighet, så du må regne med å hente en ny med jevne mellomrom. Jeg har vanligvis gjort dette med en «cron job» som har kjørt en gang i døgnet.

Jeg henter min «token» med cURL. Når denne hentes må du oppgi brukernavn og passord til Google Analytics.

I dette eksempelet vil jeg sjekke hvor gammel eksisterende «token» er, og hvis den er eldre enn 7 døgn henter jeg en ny. Denne lagrer jeg i en tekstfil som jeg kaller «auth.txt»:

$authfilename = "auth.txt";

if( strtotime("-7 days") > filemtime(dirname(__FILE__) . "/".$authfilename) )
 {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin");
  curl_setopt ($ch, CURLOPT_POST, 1);
  curl_setopt ($ch, CURLOPT_POSTFIELDS, "accountType=GOOGLE&Email=[GOOGLEBRUKERNAVN]&Passwd=[GOOGLEPASSORD]&service=analytics&source=Hardcode");
  curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  $output = curl_exec ($ch);
  $startpos = strpos($output, "Auth=")+5;
  $output = substr($output, $startpos);
  $output = trim($output);
  $file = fopen(dirname(__FILE__) . "/".$authfilename,"w");
  fwrite($file,$output);
  fclose($file);
 }

Merk at du her må erstatte [GOOGLEBRUKERNAVN] og [GOOGLEPASSORD] med ditt eget brukernavn og passord. Det siste parameteret, «source» må også angis. Dette kan være et navn på den applikasjonen eller tjenesten du har laget, og jeg har rett og slett bare brukt navnet «Hardcode».

Uthenting av data

Uthenting av data gjør jeg også med cURL. For å finne den URI-en til API-et med alle parametere anbefaler jeg å bruke Google Analytics Query Explorer 2.

Her må du først autentisere deg slik at du får tilgang til riktige kontoer og profiler. Deretter er det bare å plukke de forskjellige dataene du vil ha med, hvordan de skal brytes ned, hvordan det skal sorteres og om du ønsker et filter. Når dette er gjort klikker du ikonet oppe til venstre for å få din «Query URI».

En liten bonus: Skal du hente ut noen data fra Google Analytics som du ikke får opp så enkelt i selve brukergrensesnittet til GA, så kan dette verktøyet være kjekt å ha. Du kan rett og slett foreta en liten testkjøring her, og så kopiere utdataene rett inn i Excel for videre behandling.

Koden nedenfor bruker «token» nevnt overfor. Den lange URL-en (egentlig en URI, Uniform Resource Identifier) er den du fikk ut av verktøyet nevnt overfor:

$ch = curl_init();
$filename = dirname(__FILE__) . "/".$authfilename;
$handle = fopen($filename, "r");
$auth = fread($handle, filesize($filename));
fclose($handle);
$headers = array("Authorization: GoogleLogin auth=".$auth);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HTTPGET, 0);
curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/analytics/v3/data/ga?ids=ga%3A1234567&dimensions=ga%3Adate&metrics=ga%3Avisitors%2Cga%3Avisits%2Cga%3Apageviews&start-date=".strftime("%F", strtotime("-30 days"))."&end-date=".strftime("%F", strtotime("-1 day"))."&sort=ga%3Adate&max-results=1000&prettyprint=true");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$data = curl_exec($ch);
curl_close($ch);
$mystats = json_decode($data, true);

Jeg pleier å legge til &prettyprint=true til slutt i URI-en. Om du skal feilsøke eller ta en nærmere titt på de utdataene du mottar, så gjør dette at det blir litt mer lesbart, med linjeskift og tekstinnrykk.

Dataene får du ut som JSON. Jeg har lagt til startdato 30 dager tilbake i tid og sluttdato 1 dag tilbake i tid i dette eksempelet.

Bruke dataene

Dataene du får ut er på JSON-format, med veldig mye metadata i begynnelsen. Her er utdata som viser visitors, visits og pageviews per dag i 3 dager på Hardcode.no:

{
 "kind": "analytics#gaData",
 "id": "https://www.googleapis.com/analytics/v3/data/ga?ids=ga:1234567&dimensions=ga:date&metrics=ga:visitors,ga:visits,ga:pageviews&sort=ga:date&start-date=2013-12-14&end-date=2013-12-16&max-results=1000",
 "query": {
  "start-date": "2013-12-14",
  "end-date": "2013-12-16",
  "ids": "ga:1234567",
  "dimensions": "ga:date",
  "metrics": [
   "ga:visitors",
   "ga:visits",
   "ga:pageviews"
  ],
  "sort": [
   "ga:date"
  ],
  "start-index": 1,
  "max-results": 1000
 },
 "itemsPerPage": 1000,
 "totalResults": 3,
 "selfLink": "https://www.googleapis.com/analytics/v3/data/ga?ids=ga:1234567&dimensions=ga:date&metrics=ga:visitors,ga:visits,ga:pageviews&sort=ga:date&start-date=2013-12-14&end-date=2013-12-16&max-results=1000",
 "profileInfo": {
  "profileId": "1234567",
  "accountId": "679612",
  "webPropertyId": "UA-679612-3",
  "internalWebPropertyId": "1407651",
  "profileName": "Hardcode.no",
  "tableId": "ga:1234567"
 },
 "containsSampledData": false,
 "columnHeaders": [
  {
   "name": "ga:date",
   "columnType": "DIMENSION",
   "dataType": "STRING"
  },
  {
   "name": "ga:visitors",
   "columnType": "METRIC",
   "dataType": "INTEGER"
  },
  {
   "name": "ga:visits",
   "columnType": "METRIC",
   "dataType": "INTEGER"
  },
  {
   "name": "ga:pageviews",
   "columnType": "METRIC",
   "dataType": "INTEGER"
  }
 ],
 "totalsForAllResults": {
  "ga:visitors": "105",
  "ga:visits": "119",
  "ga:pageviews": "238"
 },
 "rows": [
  [
   "20131214",
   "26",
   "27",
   "54"
  ],
  [
   "20131215",
   "27",
   "32",
   "84"
  ],
  [
   "20131216",
   "52",
   "60",
   "100"
  ]
 ]
}

Deretter går jeg gjennom alle dataene og putter de inn i en helt enkel HTML-tabell:

$statistikktabell = "<table>"
. "<tr>"
. "<th>Dato</th>"
. "<th>Besøkende</th>"
. "<th>Besøk</th>"
. "<th>Sidevisninger</th>"
. "</tr>";

for ($i = 0; $i < count($mystats['rows']); $i++)
 {
 	$statistikktabell .= "<tr>"
 	. "<td>".strftime("%d.%m.%Y", strtotime($mystats['rows'][$i][0]))."</td>"
 	. "<td>".number_format($mystats['rows'][$i][1], 0, ',', ' ')."</td>"
 	. "<td>".number_format($mystats['rows'][$i][2], 0, ',', ' ')."</td>"
 	. "<td>".number_format($mystats['rows'][$i][3], 0, ',', ' ')."</td>"
 	. "</tr>";
 }
$statistikktabell .= "</table>";

echo $statistikktabell;

Resultatet kan du se i tabellen i denne statistikken:
Statistikk for Hardcode.no

Hvordan jeg har laget diagrammet er ikke beskrevet i dette blogginnlegget.

Oppsummert

Setter man sammen de forskjellige kodesnuttene får man dette fungerende eksempelet:

<?php

$authfilename = "auth.txt";

if( strtotime("-7 days") > filemtime(dirname(__FILE__) . "/".$authfilename) )
 {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin");
  curl_setopt ($ch, CURLOPT_POST, 1);
  curl_setopt ($ch, CURLOPT_POSTFIELDS, "accountType=GOOGLE&Email=[GOOGLEBRUKERNAVN]&Passwd=[GOOGLEPASSORD]&service=analytics&source=Hardcode");
  curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  $output = curl_exec ($ch);
  $startpos = strpos($output, "Auth=")+5;
  $output = substr($output, $startpos);
  $output = trim($output);
  $file = fopen(dirname(__FILE__) . "/".$authfilename,"w");
  fwrite($file,$output);
  fclose($file);
 }

$ch = curl_init();
$filename = dirname(__FILE__) . "/".$authfilename;
$handle = fopen($filename, "r");
$auth = fread($handle, filesize($filename));
fclose($handle);
//$headers = array("Authorization: GoogleLogin auth=".$auth.");
$headers = array("Authorization: GoogleLogin auth=".$auth);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HTTPGET, 0);
curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/analytics/v3/data/ga?ids=ga%3A1234567&dimensions=ga%3Adate&metrics=ga%3Avisitors%2Cga%3Avisits%2Cga%3Apageviews&start-date=".strftime("%F", strtotime("-30 days"))."&end-date=".strftime("%F", strtotime("-1 day"))."&sort=ga%3Adate&max-results=1000&prettyprint=true");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$data = curl_exec($ch);
curl_close($ch);
$mystats = json_decode($data, true);

$statistikktabell = "<table>"
. "<tr>"
. "<th>Dato</th>"
. "<th>Besøkende</th>"
. "<th>Besøk</th>"
. "<th>Sidevisninger</th>"
. "</tr>";

for ($i = 0; $i < count($mystats['rows']); $i++)
 {
  $statistikktabell .= "<tr>"
  . "<td>".strftime("%d.%m.%Y", strtotime($mystats['rows'][$i][0]))."</td>"
  . "<td>".number_format($mystats['rows'][$i][1], 0, ',', ' ')."</td>"
  . "<td>".number_format($mystats['rows'][$i][2], 0, ',', ' ')."</td>"
  . "<td>".number_format($mystats['rows'][$i][3], 0, ',', ' ')."</td>"
  . "</tr>";
 }
$statistikktabell .= "</table>";

echo $statistikktabell;

?>

Vil du teste dette konkrete eksempelet må du endre tre ting:

  1. Brukernavn
  2. Passord
  3. ids=ga%3A1234567 i Query URI (i eksempelet har jeg brukt en dummy ID)
Svend Asbjørn Sylling, 16. desember 2013

Bloggen fra Sylling Hardcode