Publisert i bloggen, mandag 16. desember 2013:

Hente data med Google Analytics API

Dette blogginnlegget tok kun for seg API for Universal Analytics da det ble skrevet i 2013. Universal Analytics ble lagt ned til fordel for GA4 sommeren 2023. API for GA4 er nærmere beskrevet i den offisielle dokumentasjonen fra Google her.

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)

Relatert innhold

Google Analytics
Datoformat i Excel og Google Analytics
Google Analytics API: Muligheter

Bloggen

Paid and organic last click
Are og Ida på date
Kunstig intelligens
Vekst- prosjektet
Da Outlook stjal ikonet mitt
Sen eller tidlig påske?
Koordinater i SVG
Påstand: Corner er mål
Vestfold-Rogaland kalkulator
Twitter og VM på ski
My New Year's Resolutions
Et bilde sier mer enn tusen ord
Rogaland blir nye Vestfold
På størrelse med Vestfold
Datoformat i Excel og Google Analytics
what3words Hvilke tre ord?
Covfefe will make America great again
Om domenenavn og firmanavn
Fotballfrue: Jeg tar innpå deg
Sakte-TV: Se gresset gro
Sakte-TV: Se maling tørke
Første generasjon iPapp har kommet
Jukselapp fotografering
Det sorte hullet cookies disabled
Høysesong for kjipe annonser
Om analsex og popups
Rotasjon av vindsymboler
Hvor mye er Fotballfrue verdt?
Slik tar du et screenshot
Nyttige husketrekanter
Enklere utregning med kryssmultiplisering
Min egen lille adventskalender
Logge antall likes på Facebook
Hva er sitemap.xml?
Hva er robots.txt?
Responsivt design
Webscraping med PHP
Jeg sammenligner epler og pærer
Scalable Vector Graphics
Google Analytics API: Hente data
Google Analytics API: Muligheter
HTML5: Video
Big Data
Cookies: Hvordan det brukes
Cookies: Hva er det?
Excel i to vinduer
CRM-systemet «Kontor»
Gigantisk timelapse
Hva er jQuery?
Overvåke ReadyNAS DUO med PHP
Favicon - ikonet i adressefeltet
Animert heading på hardcode.no
CSS -sprites
Komprimere PNG-bilder
Redesign av hardcode.no
Klikkbar flash uten clickTAG
Relevans har stor verdi
Alle har wide- screen i 2013
Markedsandeler nettlesere 2010
Internet Explorer-vindu i feil størrelse
Hvor stor er en piksel?
Markedsføring og kundelojalitet
Flash-versjoner
Vestre Sylling og Øverskogen JFF
Sidevisninger, besøk og brukere
Widescreen kommer
Hvor brede bør sidene være?
Fortsatt lese hele saken?
Lese hele saken nå?
Første møte med AdWords
Bort med IE6
Utviklingen på nettleserfronten
Nyttige jukselapper
Nye Sylling.no
Klær med egen logo?
Værdata fra yr.no
Logodesign trender i 2008
Gmail grimaser
Google Analytics
Publiseringssystemet Outpost
Hardcode.no relanseres
Publiserings -systemet