V. Pour ceux qui ne peuvent pas utiliser le Zend Framework : alternative POO▲
V-A. Présentation▲
Cette partie est entièrement facultative pour la compréhension de l'API. Si vous avez la possibilité d'utiliser Zend Framework, vous pouvez directement passer à la conclusion :-)
Pour ceux qui sont intéressés, je vous propose de une petite classe, qui nous permettra de gérer l'API Google Analytics sans le Zend Framework, ce de manière plus efficace qu'en utilisant de simples fonctions. Nous appelerons cette classe Google_Analytics, et elle sera située dans le fichier class/Google_Analytics.php
Pour plus de simplicité, j'ai utilisé des raccourcis, notamment l'utilisation d'un tableau pour stocker l'ensemble des informations de la classe, ce qui n'est pas forcément à faire en production.
Cette classe reprend l'ensemble des fonctions que nous avons vu plus haut, je vous la présente donc globalement sans m'arrêter dans le détail.
L'authentification est gérée par la méthode authentificate(), qui regarde si un jeton permanent existe, et effectue les opérations d'identification si besoin (appel des méthodes login() et setPermanentToken() ).
La fonction google_call est remplacée par la méthode call().
Enfin, pour éviter d'avoir à redemander à chaque nouvelle page un nouveau token, ce token est conservé en session.
abstract class Google_Analytics {
private
static
$_var
=
array
();
// espace de stockage pour les variables.
/**
* authentifier l'utilisateur
* la méthode va chercher si il y a un token défini
* sinon, elle va tenter d'en déterminer un :
* soit il y a un token dans la session
* soit il n'y a aucun token => redirection vers la page de login de Google
* soit il y a déjà un token à usage unique => transormation du token en token à usage multiple
*/
public
static
function
authentificate() {
if
( !
self
::
get('token'
)) {
//
// rechercher dans session
if
( isset($_SESSION
[
'token'
]
) ) {
self
::
set('token'
,
$_SESSION
[
'token'
]
);
return
;
}
//
// premier affichage :
if
( !
self
::
get('single_use_token'
) ) {
//
// pas de token en GET, le demander
if
( !
isset($_GET
[
'token'
]
) ) {
self
::
login( self
::
get('base_url'
) );
}
else
{
//
// token en GET, le rendre permanent
self
::
set( 'single_use_token'
,
strip_tags($_GET
[
'token'
]
) );
self
::
setPermanentToken();
}
}
}
}
/**
* appeler la page de connexion
* l'utilisateur sera redirigé vers le site Google, puis redirigé vers la page indiquée
*/
public
static
function
login() {
$url
=
'https://www.google.com/accounts/AuthSubRequest?'
.
'&next='
.
$urlRetour
.
'&scope=https://www.google.com/analytics/feeds/'
.
'&secure=0'
.
'&session=1'
;
header("Location:
$url
"
);
exit;
}
/**
* transformer un jeton à usage unique en un jeton à usage multiple
*/
public
static
function
setPermanentToken() {
$url
=
'http://www.google.com/accounts/AuthSubSessionToken'
;
$token
=
self
::
call($url
);
//
// extraire le token
$token
=
str_ireplace('Token='
,
''
,
$token
);
self
::
set('token'
,
$token
);
//
// stocker en session
if
(isset($_SESSION
)) {
$_SESSION
[
'token'
]
=
$token
;
}
}
/**
* effectuer une requete cUrl chez google
*
@param
string
requete
*
@return
xml / génère une erreur
*/
public
static
function
call($url
) {
//
// choix du token à utiliser
$token
=
self
::
get('token'
);
if
(!
$token
) $token
=
self
::
get('single_use_token'
);
//
// entête à envoyer
$headers
=
array
(
sprintf("Authorization: AuthSub token=
\"
%s
\"
/n"
,
$token
),
//sprintf("X-Google-Key: key=\"%s\"/n", self::get('key') ) // au cas où, utilisez ici votre developer key Google
);
//
// Requete cUrl
$ch
=
curl_init($url
);
$options
=
array
(
CURLOPT_RETURNTRANSFER =>
true
,
// renvoie une page web
CURLOPT_HEADER =>
false
,
// ne renvoie pas d'en-tête
CURLOPT_HTTPHEADER =>
$headers
,
// en-têtes à envoyer
CURLOPT_FOLLOWLOCATION =>
true
,
// suivre les redirections
CURLOPT_ENCODING =>
""
,
// tout encodage possible
CURLOPT_USERAGENT =>
"demo-dvp"
,
// nom de l'agent
CURLOPT_AUTOREFERER =>
true
,
// set referer on redirect
CURLOPT_CONNECTTIMEOUT =>
120
,
// timeout on connect
CURLOPT_TIMEOUT =>
120
,
// timeout on response
CURLOPT_MAXREDIRS =>
10
,
// stop after 10 redirects
CURLOPT_SSL_VERIFYHOST =>
0
,
// ne pas vérifier le SSL
CURLOPT_SSL_VERIFYPEER =>
false
,
// ne pas vérifier le SSL
CURLOPT_VERBOSE =>
1
);
curl_setopt_array($ch
,
$options
);
//
// Reponse cUrl
$content
=
curl_exec($ch
);
$err
=
curl_errno($ch
);
$errmsg
=
curl_error($ch
) ;
$resp
=
curl_getinfo($ch
);
curl_close($ch
);
//
// Erreur : le code 200 n'est pas envoyé
if
($resp
[
'http_code'
]
!=
'200'
) {
echo '<strong>Impossible d
\'
effectuer la requete : '
.
$content
.
'</strong><p><pre>'
;
print_r($resp
);
print_r($headers
);
echo '</pre></p>'
;
exit;
}
//
// renvoyer le contenu
return
$content
;
}
/**
* getters and setters
*/
public
function
set($var
,
$value
) {
self
::
$_var
[
$var
]
=
$value
;
}
public
function
get($var
) {
if
(!
isset(self
::
$_var
[
$var
]
)) return
false
;
return
self
::
$_var
[
$var
];
}
}
Ce code est simple, je vous laisse le consulter en vous référant aux remarques précédentes.
Cette classe est loin d'être complète, mais j'espère qu'elle sera vous aider à mieux comprendre comment utiliser l'API Google Analytics.
V-B. Exemple : lister tous les profils du compte▲
Nous pouvons maintenant terminer notre application, qui sera cette fois totalement orientée Objet :
session_start();
require_once '
class/Google_Analytics.php
'
;
require_once '
inc/google_functions.php
'
;
//
// configuration
Google_Analytics::
set('
profil_id
'
,
'
123456
'
);
Google_Analytics::
set('
base_url
'
,
'
http://monsite.fr/mapage.php
'
);
//
// Etablir la connexion à Google Analytics
Google_Analytics::
authentificate();
//
// lister les comptes
$accountxml
=
Google_Analytics::
call("
https://www.google.com/analytics/feeds/accounts/default
"
);
$tProfiles
=
parse_account_list($accountxml
);
echo '
<pre>
'
;
print_r($tProfiles
);
V-C. Afficher le nombre de pages vues▲
Il est possible d'accéder à une large gamme de données (dont voici la liste complète).
Il suffit d'effectuer une requête à l'adresse https://www.google.com/analytics/feeds/data, en précisant :
- ids : l'id du profil
- metrics : les données demandées
Il y a d'autres paramètres, mais ceux-là suffisent à notre exemple.
//
// profil id du premier compte trouvé:
$profilId
=
$tProfiles
[
0
][
"
tableId
"
];
//
// requete : nombre de pages vues (ga:pageviews) du 01 avril 2009 à aujourd'hui
$requrl
=
sprintf("
https://www.google.com/analytics/feeds/data?ids=%s&metrics=ga:pageviews&start-date=
2009-04-01&end-date=
"
.
date('
Y-m-d
'
),
);
$pagecountxml
=
Google_Analytics::
call($requrl
);
//
// analyse du résultat
$doc
=
new DOMDocument();
$doc
->
loadXML($pagecountxml
);
$metrics
=
$doc
->
getElementsByTagName("
metric
"
);
$views
=
$metrics
->
item(0
)->
getAttribute('
value
'
);
echo '
il y a
'
.
$views
.
'
pages vues pour la période
'
;