Google Analytics API
Voici une classe vous permettant de profiter des services d’analyse de site web proposés par Google. Vous allez pouvoir, très facilement, récupérer les données qui sont affichées sur votre interface Google Analytics.

Cette classe s’appuie sur le web service proposé par google et utilise essentiellement deux types de paramètres : les metrics et les dimensions. Pour comprendre à quoi cela correspond, je vous conseil d’aller voir directement sur la documentation officielle. L’ensemble des paramètres sont visible ici.
Il est également indispensable de connaitre son ID de site web, que l’on retrouve dans l’url de Google Analytics quand on consulte ses stats. Exemple pour moi : https://www.google.com/analytics/reporting/?reset=1&id=14186909&pdr=xxx. Mon ID est « 14186909″ et il doit etre renseigner dans le constructeur de la classe.
![]()
Les 2 principales méthodes de cette classe sont : getDimensionByMetric & getMetric.
getDimensionByMetric renvoie un tableau contenant 2 sous tableaux « labels » et « datas ». « labels » contient les informations formatées tel qu’on les voient dans l’interface alors que « datas » ne contient que les données brutes. Exemple :
require_once('GoogleAnalyticsAPI.class.php');
$ga = new GoogleAnalyticsAPI('mon_adresse@gmail.com', 'mon_password', 'mon_id', date('Y-m-d', time()));
$navigateurs = $ga->getDimensionByMetric('pageviews', 'browser');
renvoie
Array
(
[labels] => Array
(
[0] => Firefox (17)
[1] => Safari (5)
[2] => Chrome (3)
[3] => Internet Explorer (2)
)
[datas] => Array
(
[0] => 17
[1] => 5
[2] => 3
[3] => 2
)
)
getMetric renvoie directement la valeur du metric demandé. Exemple :
require_once('GoogleAnalyticsAPI.class.php');
$ga = new GoogleAnalyticsAPI('mon_adresse@gmail.com', 'mon_password', 'mon_id', date('Y-m-d', time()));
$page_views = $ga->getMetric('pageviews');
renvoie directement
127
On peut alors mettre au point des récupérations de données plus complexe :
require_once('GoogleAnalyticsAPI.class.php');
$ga = new GoogleAnalyticsAPI('mon_adresse@gmail.com', 'mon_password', 'mon_id', date('Y-m-d', time()));
// Stats de la journée en cours
$navigateurs = $ga->getDimensionByMetric('pageviews', 'browser');
$countries = $ga->getDimensionByMetric('pageviews', 'country');
$keywords = $ga->getDimensionByMetric('pageviews', 'keyword');
$source = $ga->getDimensionByMetric('pageviews', 'source');
$pagePath = $ga->getDimensionByMetric('pageviews', 'pagePath');
$visits = $ga->getMetric('visits');
$unique_visits = $ga->getMetric('visitors');
$page_views = $ga->getMetric('pageviews');
$page_views_cv = $ga->getDimensionByMetric('pageviews','pagePath','pagePath%3D%3D/cv/');
echo '<pre>';
print_r($navigateurs);
print_r($page_views);
echo '</pre>';
echo '<h2>Pour le '.date('Y-m-d', time()).'</h2>';
echo '<strong>Pages vues par navigateurs :</strong>'.'<br />';
foreach ($navigateurs['labels'] as $label) {
echo $label.'<br />';
}
echo '<br />';
echo '<strong>Pages vues par mots clefs :</strong>'.'<br />';
foreach ($keywords['labels'] as $label) {
echo $label.'<br />';
}
echo '<br />';
echo '<strong>Pages vues par source :</strong>'.'<br />';
foreach ($source['labels'] as $label) {
echo $label.'<br />';
}
echo '<br />';
echo '<strong>Pages vues par pagePath :</strong>'.'<br />';
foreach ($pagePath['labels'] as $label) {
echo $label.'<br />';
}
echo '<br />';
echo '<strong>Pages vues par pays :</strong>'.'<br />';
foreach ($countries['labels'] as $label) {
echo $label.'<br />';
}
echo '<br />';
echo '<strong>Nombre de visite(s) :</strong>'.$visits.'<br />';
echo '<strong>Nombre de visite(s) unique(s) :</strong>'.$unique_visits.'<br />';
echo '<strong>Page(s) vue(s) :</strong>'.$page_views.'<br />';
echo '<strong>Page(s) vue(s) pour CV :</strong>'.$page_views_cv.'<br />';
Enfin, dernier petit exemple avec une mise en forme basée sur Google Charts (qui fera l’objet d’une classe très bientôt) :
require_once('GoogleAnalyticsAPI.class.php');
$ga = new GoogleAnalyticsAPI('mon_adresse@gmail.com', 'mon_password', 'mon_id', date('Y-m-d', time()));
$navigateurs = $ga->getDimensionByMetric('pageviews', 'browser');
echo '<strong>Graphique des pages vues par navigateurs :</strong>'.'<br />';
foreach ($navigateurs['labels'] as $label) {
echo $label.'<br />';
}
echo '<img src="http://chart.apis.google.com/chart?cht=p3&chd=t:'.implode(',',$navigateurs['datas']).'&chs=550x100&chl='.implode('|',$navigateurs['labels']).'" />';
Ce qui donne comme résultat :

Cette classe est documentée et toutes les variables sont décrites dans le code, n’ayez donc pas peur de la télécharger et de la tester
.
Libre à vous de mettre en forme et d’exploiter les données proposées par les méthodes.
Note : Merci à William DURAND pour les posts qu’il à put faire sur Google Analytics et surtout pour la manipulation des dimensions et des metrics.
Attention : Google envoie toutes les données dans un flux xml en UTF8, si votre site est en UTF8, aucun problème, sinon, pensez à utf8_decode().
GoogleAnalyticsAPI.class.php (6,5 KiB, 2 870 hits)
Changelog
[30/04/2011]
- Ajout d’un paramètre $filters permettant de filtrer n’importe quelle requête sur un paramètre précis ($ga->getDimensionByMetric(‘pageviews’,'pagePath’,'pagePath%3D%3D/cv/’);)
[05/08/2009]
- Correction du bug sur $date_end
- Ajout des méthodes setSortByMetrics et setSortByDimensions pour trier par metrics ou dimensions
[04/08/2009]
- Release initiale



5 août 2009 - 10 h 30 min
Très beau travail, simple et efficace
Cependant j’ai juste deux remarques :
‘ permettrai de retrouver l’erreur dans les logs.
– Un petit trigger_error E_USER_WARNING au lieu du echo ‘Authentication problem
– Tu devrais préciser que l’extension curl doit être installée (si je me rappelle bien elle ne l’est pas par defaut) histoire de prévenir d’éventuels problèmes du genre : « Ça marche pas chez moi »
Encore merci pour ton taf
5 août 2009 - 10 h 50 min
@petitchevalroux ces deux points ont été traités
5 août 2009 - 20 h 47 min
Salut,
Pour moi tu as un petit bug sur $end_date dans ta classe, le code :
if (!$date_end) {$this->date_end = $date_begin;}
Pour que cela soit fonctionnel, et ainsi travaillé sur un intervale de date, j’ai du le remplacer par :
if ( !empty($date_end) )$this->date_end = $date_end;
else $this->date_end = $date_begin;
En tout cas, bon boulot, qui va m’être bien utile.
5 août 2009 - 20 h 56 min
Bien sur
Une erreur c’était glissée. J’ai corrigé cela.
Par contre, vu que $date_end est null tu n’est pas obligé d’utiliser empty.
5 août 2009 - 22 h 12 min
Autre chose, pour arriver au graph nombre de visites par jour sur le dernier mois, il m’a fallu modifier le sort de l’url de getDimensionByMetric pour ainsi passer de :
« &sort= » . $this->sort . « ga: ».$metrics;
à
« &sort= » . $this->sort . « ga: ».$dimensions;
Vu que c’est un cas d’utilisation tout de même très fréquent, il en va de même pour les pages vues ect, je pense qu’une modification par exemple de ta fonction sort() pourrait être intéressante pour permettre ce résultat.
Si tu veux tester, le graph s’obtient via :
$visitsByDay = $ga->getDimensionByMetric(‘visits’, ‘date’);
5 août 2009 - 22 h 39 min
C’est fait :
[05/08/2009]
- Correction du bug sur $date_end
- Ajout des méthodes setSortByMetrics et setSortByDimensions pour trier par metrics ou dimensions
Encore merci pour tes retours, on pense jamais à tout du premier coup
6 août 2009 - 13 h 38 min
Hello,
Voici ma première intégration de ta classe, un widget UWA pour netvibes et consorts :
http://www.atlza.com/s29/a411/un-widget-google-analytics-pour-netvibes-et-les-autres-plateformes-uwa-gavibes.htm
Très basique pour l’instant, je vais l’étendre et permettre la personnalisation dans le futur. De même je vais surement intégrer ta classe à mon CMS, si j’ai d’autres retours à faire je n’hésiterai pas.
6 août 2009 - 13 h 49 min
@Le Zla : Beau boulot. Je vais suivre ton projet de près
Et encore merci d’avoir pris soin de me faire des retours sur mon implémentation de l’API.
12 août 2009 - 2 h 54 min
Bonjour, joli travail
Penses (comme c’est similaire à mon implémentation) à rendre la méthode login() publique afin de pouvoir utiliser différents profils. Il faudra changer un peu ton implémentation ou du moins ajouter les accesseurs qui vont bien.
Merci pour la note au passage.
12 août 2009 - 9 h 02 min
Bonjour.
Sans problème, pour la note c’est normal, c’est la bas que j’ai lu les premiers articles sur GA
Le login unique est un choix de ma part, je ne préfère pas autoriser le multicompte ou alors en 2 instanciations différentes.
Bonne continuation.
29 août 2009 - 11 h 08 min
Bonjour,
Je voudrais créer une page Statistique sur mon blog. Mais je ne vois pas comment intégrer ton script dedans.
Merci pour ton aide.
Guillaume
31 août 2009 - 23 h 20 min
Connait-tu le PHP ? Le tutoriel aborde pourtant les fondamentaux à utiliser et l’exemple montre plutôt bien le genre de rendu que l’on peut avoir.
Peut-tu être plus précis sur tes difficultés. De quel coté bloque tu ?
7 septembre 2009 - 21 h 26 min
Bonjour,
J’utilise le blog WordPress. Celui-ci à des templates définies comme page.php pour les pages. Je ne peux pas rajouter ton code PHP dans cette page car ça la rajouterais sur toutes mes pages utilisant le template.
Ma question comment faire appel à ces fonctions graphique dans une page WordPress ?
Et non je ne connais pas bien PHP.
Merci pour ton aide.
8 septembre 2009 - 16 h 27 min
Tu as un plugin PHP qui se nomme « exec-php » qui te permet d’écrire du code PHP à l’intérieur d’un zone de texte. Cela peut être une solution envisageable.
Une autre, serait simplement de créer une page totalement délocalisée de wordpress sur le même serveur où tu coderas en PHP comme tu en a l’habitude avec ma classe.
9 septembre 2009 - 19 h 09 min
Merci, je vais essayer et je te tiens au courant.
@+
30 septembre 2009 - 22 h 53 min
Bonjour en testant le code j ‘ ai cette erreur :
Warning: GoogleAnalyticsAPI::getMetric() [googleanalyticsapi.getmetric]: Node no longer exists in /web/htdocs/www.diginess-milano.com/home/GoogleAnalyticsAPI.class.php on line 283
Fatal error: Call to a member function attributes() on a non-object in /web/htdocs/www.diginess-milano.com/home/GoogleAnalyticsAPI.class.php on line 283
Suis-je le seul ?
Merci
1 octobre 2009 - 9 h 06 min
Tu peux montrer un peu le genre de code que tu as mis en place ? (sans mettre ton compte gmail ^^)
7 octobre 2009 - 11 h 37 min
Bonjour,
Tout d’abord, bravo pour ce tutoriel clair et intuitif…
J’ai moi aussi le problème : Node no longer exists comme Orel
J’ai cette erreur en ayant utilisé la meme class google analytics que toi et en ayant copié collé le script de récupérations de données plus complexe que tu nous a proposé…
As tu une solution ?
Merci beaucoup
Alexandre
7 octobre 2009 - 13 h 43 min
Avec un exemple plus simple comme celui la :
require_once(‘GoogleAnalyticsAPI.class.php’);
$ga = new GoogleAnalyticsAPI(‘mon_adresse@gmail.com’, ‘mon_password’, ‘mon_id’, date(‘Y-m-d’, time()));
$page_views = $ga->getMetric(‘pageviews’);
Ça passe ?
Tu es bien en PHP5 pour utiliser SimpleXML ?
Essais de debuguer vers la ligne 283 pour voir s’il ne te manque pas un prérequis.
7 octobre 2009 - 14 h 40 min
Avec l’exemple que tu m’as donné, ça fonctionne…
J’utilise bien php5 et l’extension de cURL est bien activé sur mon hébergement !
7 octobre 2009 - 15 h 34 min
Essais de faire ligne par ligne pour voir si ce n’est pas un metric qui ne fonctionne pas.
Exemple : $keywords = $ga->getDimensionByMetric(‘pageviews’, ‘keyword’); en 1er puis les autres…
Vérifier si cela viens de getDimensionByMetric().
7 octobre 2009 - 16 h 02 min
En debuggant ligne par ligne, je me suis aperçu que l’erreur provenait de la ligne suivante :
$page_views_cv = $ga->getMetric(‘pageviews’,'/cv/’);
J’ai essayé d’enlevé les slash, ça ne chnage pas…
En tout cas merci de ta patience
7 octobre 2009 - 16 h 28 min
Tu a bien une page /cv/ sur ton site ? Le deuxième paramètre est censé etre une URL de TON site (si tu n’a pas http://www.monsite.fr/cv/ cela ne marchera pas). Voir le commentaire de la fonction :
* @param string $metrics the metrics
* @param string $uri the url of the website page (ex : /myurl/)
public function getMetric($metric,$uri=null)
Pour connaitre tes différentes URI tu peux aller dans le backend de google analytics et regarder les différentes URL.
15 octobre 2009 - 22 h 44 min
Bon, pas de réponses, cela devait être ca pour @Tbow et @Orel, faut bien lire les commentaires de fonctions
Dommage qu’il n’y ai pas de confirmation.
19 octobre 2009 - 18 h 16 min
Salut !
Super pour cette classe que j’aimerai bien exploiter.
Mais déjà un problème dès le début :
require_once(‘GoogleAnalyticsAPI.class.php’);
$ga = new GoogleAnalyticsAPI(‘email@gmail.com’, ‘XXXXXXXX’, ’19581780′, date(‘Y-m-d’, time()));
$page_views = $ga->getMetric(‘pageviews’);
J’ai le même problème que « Orel » à la ligne 283.
Je suis en PHP5.2.6 et libcurl/7.18.2 enabled
Une idée Yohann ?
Merci d’avance pour ton aide.
19 octobre 2009 - 18 h 26 min
Bon bah en fait, voilà le problème :
- Avec l’ID d’un site où il y a eu des visites, ça fonctionne nikel ! merci
- Avec l’ID d’un site où il n’y a pas eu de visite (le jour même par exemple), ça bug >> erreur à la ligne 283.
Y a peut-être une petite modification à faire à ce niveau là.
Je vais me pencher sur ta class pour faire des jolies graph.
@+ tard
19 octobre 2009 - 19 h 00 min
Serait-il possible de rentrer en contact Yohann ?
20 octobre 2009 - 11 h 45 min
Je suis en congés à l’étranger donc la semaine prochaine
21 octobre 2009 - 11 h 47 min
Hello,
Très envie de tester tout ca, bon boulot !
Par contre j’ai cette erreur : Fatal error: Call to undefined function curl_init() in /data/web/reporting.ipsopresto.net/www/arnaud/GoogleAnalyticsAPI.class.php on line 161
Alors que j’ai activé curl il y a 10minutes…?
Merci
21 octobre 2009 - 21 h 21 min
Tu as bien activé curl ? Verifie dans un phpinfo(); et pense a rebooter ton serveur
22 octobre 2009 - 8 h 44 min
Arf merci pour la réponse, oui c’était bien activé par contre le reboot serveur pas fait ! lol
Je peux pas pour le moment, donc en attendant je le fait en local avec wamp ^^
Merci encore pour la réponse, et au passage rebravo pour l’article.
23 octobre 2009 - 17 h 12 min
Tiens une petite question, j’ai fait quelques tests mais en vain : J’aimerais obtenir le taux de rebond par canal (le global c’est easy)
c’est a dire le taux de rebond des visiteurs provenant de google organic, celui de adwords, celui des sites référents fin voila l’idée.
ga:bounces/ga:entrances = Bounce rate by browser or dimension other than page
Je pensais que ga:bounces/ga:medium était me donnerai le résultat voulu.
Mais je crois que je n’ai pas bien compris comment utiliser cette méthode car même pour ga:bounces/ga:entrances, je n’affiche pas ce que je voudrais.
Si tu pouvais me préciser un peu tout ça, ca serait super cool.
merci
23 octobre 2009 - 17 h 23 min
Pour revenir sur ma première question :
Quand je fais
$medium2 = $ga->getDimensionByMetric(‘bounces’, ‘medium’);
J’obtiens le nombre de rebonds mais pas le taux. J’ai essayer de mettre à la place de ‘bounces’ ma variable contenant le taux de rebond (obtenu par un calcul) mais ca ne fonctionne pas…?
Tant que j’y suis, j’ai une dernière question un peu plus en rapport avec ton exemple je pense :
$medium = $ga->getDimensionByMetric(‘visits’, ‘medium’);
me retourne un tableau avec les visites par canal, exemple : cpc (1986)
Je voulais savoir s’il était possible d’avoir le chiffre séparé de son canal c’est à dire ressortir simplement 1986 ici. (c’est pour l’inclure dans une BDD).
Merci beaucoup
Web
25 octobre 2009 - 21 h 34 min
@web Pour la première question, je ne sais pas comment tu pourrais obtenir le taux de rebond par canal, déjà la première question à se poser est « est ce possible dans l’interface de GA ? ». Si oui, il y a forcément une solution pour la fonctionnalité. Je n’ai pas creusé de ce coté. Sinon, on peut en discuter,
Pour la seconde question sur le formatage de la méthode getDimensionByMetric(), tu peux t’en sortir par le biais d’une petite expression régulière (la chaine est toujours formatée de la même manière) du style : preg_match(‘/(\w*)\s\((\d*)\)/’,$visits,$matches). Puis tu traite ensuite matches pour insérer en base.
25 octobre 2009 - 22 h 08 min
@TitBen j’ai modifié un peu le code pour prendre en compte cette problématique.
26 octobre 2009 - 10 h 37 min
Hello,
Merci pour la réponse.
est ce possible dans l’interface de GA ? Oui bien sûr.
=> Dans source de trafic, tu mets afficher le rapport complet et tu à le taux de rebond.
Si jamais je trouve la solution, je passerai pour vous la poster. ET je passerai aussi si je galère pour voir si quelqu’un a trouvé de son coté ^^.
Ok merci pour l’idée de l’expression régulière, j’y avait pensé mais je croyais et surtout j’espérais (les expressions régulières c’est pas mon fort!) qu’il était possible d’obtenir ca différemment :p
Bonne journée
26 octobre 2009 - 10 h 51 min
En fait en faisant : $ga->getDimensionByMetric(‘bounces’, ‘medium’);
Je peux avoir le nombre de rebond mais pas le taux…
7 novembre 2009 - 16 h 35 min
J’attendais cela depuis des mois…bravo !
Mais je ne suis pas expert en code, pouvez-vous m’indiquez comment récupérer des données sur une période (entre deux dates donc) plutôt que sur la date du jour ?
Merci d’avance !
7 novembre 2009 - 19 h 06 min
La méthode GoogleAnalyticsAPI prend en 4eme et 5eme paramètre des dates formatées de la manière suivante : 2009-11-07.
A toi de mettre les 2 bonnes dates
Exemple :
$ga = new GoogleAnalyticsAPI(‘mon_adresse@gmail.com’, ‘mon_password’, ‘mon_id’, ’2009-11-05′, ’2009-11-06′);
7 novembre 2009 - 21 h 17 min
Merci, pour cette réponse rapide c’est génial !
?
Je gère des stats Analytics pour des dizaines de sites et je vais pouvoir enfin me faire un tableau de bord sur mesure synthétisant l’ensemble des sites, voire croiser des données…
En tout cas je met ta page direct en favoris.
Tu n’aurais pas une classe Adsense dans les cartons