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
  GoogleAnalytics::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
GoogleAnalytics::printBoxGa($entries);
}

Pageviews
6739

I dati che vedete nelle tabelle sono riferite a questo sito. Come potete vedere nel codice, basta richiamare la funzione 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


14 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

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.