Utilizzare Google Analytics API con PHP

di  Antonio Coschignano, lunedì 01 giugno 2009
Recentemente Google Labs ha rilasciato le API per Google Analytics che permettono a tutti gli sviluppatori di interagire con i dati statistici del proprio account e quindi avere la possibilità di implementarli in svariati ambiti applicativi.

In questa guida vedremo una libreria di classi PHP da me sviluppata che svolge il ruolo 'difficile' di estrarre (tramite l'utilizzo delle API) questi dati dal nostro account e trasformare i risultati XML in semplici oggetti PHP. Con poche e semplici chiamate avremmo a disposizione dei report impacchettati in un array di oggetti da utilizzare facilmente a nostro piacimento. Vedremo diversi esempi per capirne meglio l' utilizzo.
(Vai direttamente agli esempi oppure Scarica direttamente la libreria (ZIP))

Prima di mostrare l' utilizzo delle classi diamo uno sguardo alle tre fasi necessarie per recuperare i dati da google analytics :
  • Autenticazione
  • Query
  • Risultato
La fase di autenticazione necessita dei dati del nostro account di google analytics che usiamo di solito per l'accesso tramite il browser. Una volta effettuata l' autenticazione ci viene restituito un token Auth, semplicemente una lunga stringa alfanumerica, da inviare in tutte le successive richieste. I risultati delle query ci vengono restituiti naturalmente in XML in formato Feed. Ma questo comunque non deve preoccuparci, le classi che vedremo, effettuano tutte queste operazioni in maniera trasparente.

Le classi in questione sono :
  • class GoogleAnalyticsApi
  • class QueryGA
  • class Entry
La classe GoogleAnlyticsApi contiene metodi statici, per l'autenticazione, la ricerca dell' ID del profilo del sito, e il metodo che si occupa di effettuare l' interrogazione e restituire il risultato XML.
/*** Autenticazione ****/
$auth = GoogleAnalyticsApi::getAuth("nostroaccount@xxxx.xxx","password");
Se l'autenticazione (o login) non ha esito positivo ci viene restituito il codice di errore 401 (Unauthorized), altrimenti $auth conterrà il token Auth (una stringa alfanumerica).
Come sappiamo ad ogni account analytics può essere associato più di un profilo web, e quindi ognuno di questi possiede un proprio ID. Vediamo come reperire l' id del profilo :
$codiceWeb = GoogleAnalyticsApi::getAccount("www.example.com",$auth);
Per comporre ed effettuare la query utilizzamo la classe QueryGA, che riceve nel costruttore i parametri recuperati nel codice visto sopra. Nella tabella qui sotto potete osservare i singoli campi della query con il relativo metodo della classe che dobbiamo utlizzare :
ids Obbligatorio. Il profilo unico ID utilizzato per recuperare i dati dei rapporti di Analytics che abbiamo estratto con l'esempio sopra $query->setIds() (oppure nel costruttore, vedi sotto)
dimension Facoltativo. Specifica le dimensioni incluse nella relazione e con il quale i dati saranno segmentati. Una sola richiesta è limitata a un massimo di 7 dimensioni. $query->addDimension()
metrics Facoltativo. Specifica i parametri inclusi nel rapporto. Una sola richiesta è limitata a un massimo di 10 parametri $query->addMetrics()
sort Facoltativo. Specifica di ordinamento dei risultati $uqery->addSort()
filters Facoltativo. Specifica i filtri che applichiamo alla nostra query, ad esempio le visite provenienti da una determinata zona geografica $query->addFilters()
start-date & end-date Obbligatorio. In tutte le richieste per i report Analytics deve essere specificato una data iniziale e finale, cioè un range temporale. La data deve essere specificata nel formato : MM-GG-YYYY $query->setStartDate() e setEndDate()
Per i valori possibili di dimension e metrics e di tutte le combinazioni consentite consultare la pagina specifica Reference Dimensions e Metrics di Google Code (in inglese). Se ad esempio volessimo un report che ci dica il numero di visitatori dal 1 al 31 Maggio 2009, si potrebbe costruire la query nel seguente modo :
$query = new QueryGA($codiceWeb,$auth);
/*
Settiamo il parametro per richiedere il numero di visite che in questo
caso è ga:visits
*/
$query->addMetric("ga:visits");
$query->setStartDate("2009-05-01"); //La data iniziale
$query->setEndDate("2009-05-25"); //La data finale
/* Effettua l' interrogazione ed effettua un parser al risultato XML,
incapsulando i campi in un oggetto Entry
*/
$entries = $query->getDataResult();
$entries é un array di oggetti di tipo Entry. La classe Entry contiene il risultato della query. Vediamo come accedere ai dati della classe :
$entry = $entries[0];
echo $entry->getPropertyValue("ga:visits");
In questo caso ci viene stampato il numero di visite nell' intervallo di tempo specificato. E se invece vogliamo il numero di visite per ciascun giorno in un intervallo di tempo ? Basta settare un parametro dimension con il valore ga:data :
$query = new QueryGA($codiceWeb,$auth);
$query->addDimension("ga:date");
$query->addMetric("ga:visits");
$query->setStartDate("2009-05-01");
$query->setEndDate("2009-05-25");
$entries = $query->getDataResult();
foreach($entries as $entry) {
  $data = $entry->getPropertyValue("ga:date");
  $value = $entry->getPropertyValue("ga:visits");
  echo "Data : ".$data." - Visite : ".$value;
}
Le combinazioni sono tantissime, possiamo ad esempio creare report per la pagine viste con il parametro ga:pageview e segmentarli per data (ga:data) oppure per citta (ga:city), basta consultare la pagina di Google Reference Dimensions e Metrics. Bisogna capire bene i ruoli di dimension e metric per creare report di tutti i tipi, ma questo è un argomento molto vasto che esula dallo scopo di questa guida. Adesso vi lascio con una serie di esempi un po più complessi, con il risultato formattato in un box con il logo di Google Analytics.

Esempi
1. La lista delle città con le relative pagine viste, il numero delle visite e il numero dei rimbalzi per ciascuna città, del 1 Maggio 2009 ordinate per visite :

include_once ("percorso_del_file/GoogleAnalytics.php");
$auth = GoogleAnalyticsApi::getAuth("account@xxxx.xx","000000");
if ($auth==401) {
  echo "Errore ";
} else {
  $codiceWeb = GoogleAnalyticsApi::getAccount("www.example.com",$auth);
  $query = new QueryGA($codiceWeb,$auth);
  $query->addDimension("ga:city");
  $query->addMetric("ga:pageViews");
  $query->addMetric("ga:visits");
  $query->addMetric("ga:bounces");
  $query->addSort("ga:visits");
  $query->setStartDate("2009-05-01");
  $query->setEndDate("2009-05-01");
  $entries = $query->getDataResult();
  //Stampa il risultato formattato come la tabella sotto
  GoogleAnalytics::printBoxGa($entries);
}

CityPageviewsVisitsBounces
Ancona111
Bellevue111
Macerata111
Bari1020
Rome321



2. Per ciascun browser, le relative visite e pagine viste tra il 1 Maggio 2009 e 10 Maggio 2009 :
include_once ("percorso_del_file/GoogleAnalytics.php");
$auth = GoogleAnalyticsApi::getAuth("account@xxxx.xx","000000");
if ($auth==401) {
  echo "Errore ";
} else {
  $codiceWeb = GoogleAnalyticsApi::getAccount("www.example.com",$auth);
  $query = new QueryGA($codiceWeb,$auth);
  $query->addDimension("ga:browser");
  $query->addMetric("ga:pageViews");
  $query->addMetric("ga:visits");
  $query->addMetric("ga:bounces");
  $query->setStartDate("2009-05-01");
  $query->setEndDate("2009-05-10");
  $entries = $query->getDataResult();
  //Stampa il risultato formattato come la tabella sotto
  GoogleAnalyticsApi::printBoxGa($entries);
}

BrowserPageviewsVisits
Chrome42
Firefox377113
Googlebot22
Internet Explorer970293
Opera1919
Safari114


3. Il numero totale di pagine viste dell' intero sito tra il 1 e il 31 Maggio 2009 :

include_once ("percorso_del_file/GoogleAnalytics.php");
$auth = GoogleAnalyticsApi::getAuth("account@xxxx.xx","000000");
if ($auth==401) {
echo "Errore ";
} else {
$codiceWeb = GoogleAnalyticsApi::getAccount("www.example.com",$auth);
$query = new QueryGA($codiceWeb,$auth);
$query->addMetric("ga:pageViews");
$query->setStartDate("2009-05-01");
$query->setEndDate("2009-05-31");
$entries = $query->getDataResult();
//Stampa il risultato formattato come la tabella sotto
GoogleAnalyticsApi::printBoxGa($entries);
}

Pageviews
6739

GoogleAnalyticsApi::printBoxGa() sul risultato e la tabella viene generata automaticamente in base ai parametri che abbiamo settato nella query. Naturalmente Google mette dei limiti alle richieste :
  • Massimo di 10,000 richieste in 24 ore
  • 100 richieste consentite in un tempo di 10 secondi
  • Una query di ricerca è limitata a 1000 record per pagina
Se un account supera il limite viene restituito l' errore HTTP 503 (Service Unavailable). Per qualsiasi errore, bug del codice, chiarimenti lasciate un commento nel form sottostante. Grazie.

Scarica la libreria (ZIP)

Articoli correlati


23 Commenti per "Utilizzare Google Analytics API con PHP"

Autore: luciano

Ciao! Molto interessante lo script, complimenti! Purtroppo però non sono riuscito a farlo funzionare... in locale (php4) ottengo questo errore: Warning: DOMDocument::loadXML() [function.DOMDocument-loadXML]: Start tag expected, '<' not found in Entity, line: 1 in htdocs\admin\GoogleAnalytics.php on line 268 Fatal error: Class 'GoogleAnalytics' not found in htdocs\admin\com\main.php on line 21 ...mentre su server (php5) ottengo questo: Fatal error: Call to undefined function curl_init() in htdocs/admin/GoogleAnalytics.php on line 216 Cosi ad occhio mi sembra di capire che in tutti e due i casi il problema sia dovuto a limiti di php... come potrei fare? Grazie in anticipo.

martedì 09 giugno 2009 ore 18:04

Autore: Antonio Coschignano

Ciao Luciano, grazie per i complimenti. Purtroppo hai ragione nel dire che il problema riguarda PHP.
Siccome questa librearia è stata sviluppata interamente ad oggetti, nel primo caso, non so fino a che punto PHP 4 supporta la programmazione ad oggetti, infatti nel tuo caso mi sembra che ci sono dei problemi con i metodi statici della classe GoogleAnlyticsApi.
Nel secondo caso invece, forse il tuo server è su piattaforma Windows e quindi il problema è la libreria CURL, che su hosting Linux di solito è implementata nativamente, mentre su hosting Windows difficilmente la si trova installata. Se sei propritario del server, la potresti installare, (leggiti questo articolo) Installare cURL per PHP/Apache su Windows XP. Cmq, vedo se posso implementare la classe con un alternativa a CURL anche per piattaforme Windows. Torna a visitare questa pagina oppure in caso autorizzami a mandarti una email. Ciao.

martedì 09 giugno 2009 ore 19:57

Autore: luciano

Ciao Antonio, grazie a tè per la risposta tempestiva! Mi sono appena accorto che sul mio server (linux) posso modificare le impostazioni di php... quindi sono passato a php5, abilitando cURL, ma continuo ad ottenere lo stesso errore che si presenta con php4 in locale. La situazione si complica... :(

mercoledì 10 giugno 2009 ore 09:33

Autore: Antonio Coschignano

Ciao Luciano. Allora, c'era effettivamente un errore nel recuperare l' id del profilo di un account.Adesso ho sistemato. Riscaricati la libreria e fammi sapere se tutto va bene oppure no :-) Grazie.

mercoledì 10 giugno 2009 ore 11:24

Autore: luciano

Sei un genio Antonio! :D Ora funziona alla perfezione... grazie mille! Veramente uno script utilissimo! grazie ancora.

mercoledì 10 giugno 2009 ore 14:34

Autore: Antonio Coschignano

Benissimo allora, grazie a te :-) , perchè cmq mi hai fatto notare e risolvere un errore. Ciao e buon lavoro.

mercoledì 10 giugno 2009 ore 17:00

Autore: Pasquale

Ciao Antonio, grazie di esistere!!! :) Le tue librerie funzionano alla perfezione e la documentazione (con esempi) davvero chiara!!! Dalla documentazione di google, "Reference Dimensions e Metrics", non mi sembra ci sia il modo di accedere al numero di visite di una specifica pagina nel sito. Mi dai conferma, oppure conosci un modo per accedere a quest'informazione? Grazie, ancora complimenti Pasquale

mercoledì 22 luglio 2009 ore 12:23

Autore: Pasquale

Forse ho già risolto: la metrica "ga:pageviews" associata a "ga:pagePath"... ...faccio subito una prova! Comunque grazie lo stesso :)

mercoledì 22 luglio 2009 ore 12:32

Autore: Daniele

Ottimo lavoro, complimenti. Una sola domanda : per settare il numero massimo di risultati come si fa ? ho visto che da qui e' possibile settarlo: http://code.google.com/intl/it-IT/apis/analytics/docs/gdata/gdataExplorer.html Grazie anticipatamente. Saluti, Daniele

martedì 06 ottobre 2009 ore 02:14

Autore: Daniele

ok ho risolto :) Per chi fosse interessato ho semplicemente aggiunto una cosa del genere : $query->setEndDate("2009-09-01&max-results=10"); dove max-results=10 limita i risultati a 10.

martedì 06 ottobre 2009 ore 02:22

Autore: Max

Ma se volessi utilizzare asp per creare il contatore visite?

giovedì 15 ottobre 2009 ore 12:59

Autore: Antonio Coschignano

Ciao Max, be veramente Google Analytics e molto di piu che un contatore visite. Comunque se vuoi usare le API GA in ASP questa libreria di sicuro non va bene :-), dai un'occhiata a questo link http://www.akamarketing.com/blog/103-introducing-google-analytics-api-with-aspnet-c.html

giovedì 15 ottobre 2009 ore 13:55

Autore: daniele

Ciao Antonio, Volevo segnalarti una piccola miglioria nella lib alla riga di codice 274 aggiungerei un controllo del tipo : if ( is_array($entries)) {...} else { echo "errore"; return false;} Cosi' almeno non printa in caso di errori il warning con le path dei files ecc.. Ciao

sabato 12 dicembre 2009 ore 10:46

Autore: Andrea

Complimenti, ottimo lavoro. Molto utile. Metterò il tuo sito tra i preferiti

sabato 06 febbraio 2010 ore 11:15

Autore: Giuseppe Di Vuolo

Salve, sarò io inceppato ma c'è un'errore del file GoogleAnalytics.php: Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /web/htdocs/xxxxxxxxxxxxx/home/prova/GoogleAnalytics.php on line 52 Capita solo a me?

giovedì 01 aprile 2010 ore 14:00

Autore: Matteo

Ciao, ho un problema con la funzione printBoxGa, non riesco a visualizzare la tabella con i risultati (nemmeno se provo con uno degli esempi sopra) e in particolare ottengo il seguente errore: Notice: Undefined offset: 0 in C:\wamp\www\test\Tesina\PHP\GoogleAnalytics.php on line 298 Fatal error: Call to a member function getArrayResult() on a non-object in C:\wamp\www\test\Tesina\PHP\GoogleAnalytics.php on line 298 Potete aiutarmi? Grazie

lunedì 12 aprile 2010 ore 17:19

Autore: Antonio Coschignano

Ciao, dunque x Giuseppe Di Vuolo : Hai per caso modificato il codice?? Gli esempi che vedi in questa pagina richiamano direttamente la suddetta libreria, quindi non rilasciano questo errore, che poi tra l'altro risulta di sintassi, controlla bene, dovrebbe mancare qualche parentesi. x Matteo : In questo caso è probabile che nella query che lanci su google analytics il risultato sia vuoto ed è un'eccezione che non ho comunque gestito bene. Penso di rivedere meglio la libreria e aggiornarla al piu presto. Grazie a tutti per le segnalazioni Ciao

martedì 13 aprile 2010 ore 00:11

Autore: Matteo

Ciao, mi chiedevo se tramite la tua libreria di classi è possibile fare una query che mi permetta, inserendo solo nome utente e password, di ottenere automaticamente tutti i nomi dei profili che ho su google analythics. Grazie

venerdì 23 aprile 2010 ore 21:55

Autore: Luca

Ciao, e veramente complimenti per il lavoro svolto su una cosa così utile! Volevo sapere se è possibile avere anche i dati dei visitatori del mese, ma divisi giorno per giorno. Grazie e ciao

mercoledì 22 dicembre 2010 ore 23:55

Autore: Luca

Ciao, chiedo scusa...dovevo leggere tutto l'articolo prima di rispondere!! Ancora veramente complimenti per il lavoro svolto!

giovedì 23 dicembre 2010 ore 00:01

Autore: Egidio

Ciao, volevo provare a integrare il tuo script nel mio sito, anche seguendo alla lettera tutto mi continua a dare errore Fatal error: Class 'GoogleAnalytics' not found in /web/htdocs/www.californiawaterpolocamp.it/home/modules/Statistics/index.php on line 174 ma nella linea 174 c'è esattamente il codice dell'esempio 1 Da cosa dipende Ciao e grazie dell'aiuto

martedì 25 gennaio 2011 ore 10:48

Autore: WcfQHzuwQsaEyvCsW

Google analytics api script php.. Very nice :)

domenica 05 giugno 2011 ore 13:54

Autore: Marco

Ciao grazie per l'articolo ;-) ho un problema non mi fa effettuare l'accesso. Mi dice dati errati ma sono sicuro che sono corretti. Da cosa può dipendere? Ciao e Grazie

lunedì 07 maggio 2012 ore 17:20

Lascia un commento

Nome :
E-mail :
Commento :

Tutti i commenti inseriti devono essere approvati da un amministratore prima di essere visualizzati al pubblico. Si tratta di una misura preventiva contro spam e pubblicità e non è necessario reinviare il commento. Si prega di scrivere commenti in tema. Spam e messaggi promozionali non vengono approvati.