III. Pour aller plus loin▲
III-A. Un jeton à usage multiple▲
Le jeton que vous avez obtenu n'est valable qu'une fois, c'est-à-dire qu'à chaque requête, Google va vous demander de vous reconnecter (si vous essayez sans, vous recevrez à la place du flux une erreur 301 "Invalid Token" dans le corps de la réponse).
Il va falloir rendre ce jeton à usage unique permanent (nous parlerons de jeton à usage multiple). Pour cela, effectuer une requête à l'adresse "http://www.google.com/accounts/AuthSubSessionToken", en passant notre jeton actuel en en-tête. Nous recevrons une réponse du type : Token=xxxxxxx
où xxxxxxx est le jeton à usage multiple que vous devrez désormais utiliser :
/**
* transformer un jeton à usage unique en un jeton à usage multiple
*
@param
string
jeton à usage unique
*
@return
string
jet à usage multiple
*/
function google_get_permanent_token($token
) {
$url
=
'
http://www.google.com/accounts/AuthSubSessionToken
'
;
$new_token
=
google_call($url
,
$token
);
//
// extraire le token du résultat
$new_token
=
str_ireplace('
Token=
'
,
''
,
$new_token
);
return $new_token
;
}
III-B. Un flux XML c'est bien, des données organisées c'est mieux▲
Vous me direz : j'ai eu un flux XML, super, mais qu'est-ce que j'en fait. Je n'arrive même pas à le parser correctement avec SimpleXML ?
Pas de souci, je vous propose une petite fonction bien pratique, que j'ai trouvée sur Alex Curelea's Dev Log
/**
* parser les comptes utilisateur
* trouvé sur Alex Curelea's Dev Log
* http://www.alexc.me/using-the-google-analytics-api-getting-total-number-
of-page-views/
74
/
*
@param
string
xml
*
@return
array
*/
function google_parse_account_list($xml
)
{
$doc
=
new DOMDocument();
$doc
->
loadXML($xml
);
$entries
=
$doc
->
getElementsByTagName('
entry
'
);
$i
=
0
;
$profiles
=
array();
foreach($entries
as $entry
)
{
$profiles
[
$i
]
=
array();
$title
=
$entry
->
getElementsByTagName('
title
'
);
$profiles
[
$i
][
"
title
"
]
=
$title
->
item(0
)->
nodeValue;
$entryid
=
$entry
->
getElementsByTagName('
id
'
);
$profiles
[
$i
][
"
entryid
"
]
=
$entryid
->
item(0
)->
nodeValue;
$properties
=
$entry
->
getElementsByTagName('
property
'
);
foreach($properties
as $property
)
{
if (strcmp($property
->
getAttribute('
name
'
),
'
ga:accountId
'
) ==
0
)
$profiles
[
$i
][
"
accountId
"
]
=
$property
->
getAttribute('
value
'
);
if (strcmp($property
->
getAttribute('
name
'
),
'
ga:accountName
'
) ==
0
)
$profiles
[
$i
][
"
accountName
"
]
=
$property
->
getAttribute('
value
'
);
if (strcmp($property
->
getAttribute('
name
'
),
'
ga:profileId
'
) ==
0
)
$profiles
[
$i
][
"
profileId
"
]
=
$property
->
getAttribute('
value
'
);
if (strcmp($property
->
getAttribute('
name
'
),
'
ga:webPropertyId
'
) ==
0
)
$profiles
[
$i
][
"
webPropertyId
"
]
=
$property
->
getAttribute('
value
'
);
}
$tableId
=
$entry
->
getElementsByTagName('
tableId
'
);
$profiles
[
$i
][
"
tableId
"
]
=
$tableId
->
item(0
)->
nodeValue;
$i
++;
}
return $profiles
;
}
III-C. Exemple : lister tous les profils du compte▲
Nous avons donc désormais une page complète, qui va nous permettre de lister les comptes liés à notre profil.
//
// appel du fichier qui contient toutes les fonctions que nous avons créées.
// Vous pouvez télécharger ce fichier dans la partie "Ressources & Fichiers" de ce tutoriel
require_once '
inc/google_functions.php
'
;
//
// configuration
$profil_id
=
'
123456789
'
;
$urlRetour
=
'
www.monsite.fr/mapage.php
'
;
// url de la page vers laquelle sera redirigé l'utilisateur une fois connecté
//
// Récupérer le token
$single_use_token
=
google_get_token();
//
// Etablir la connexion à Google Analytics si pas encore de token
if(!
$single_use_token
) {
google_login( $urlRetour
);
}
//
// obtenir un token à usage multiple
$token
=
google_get_permanent_token( $single_use_token
);
//
// effectuer une requete : on va lister tous les comptes du profil
$accountxml
=
google_call("
https://www.google.com/analytics/feeds/accounts/default
"
);
//
// parser cette requete et afficher les résultats
$tProfiles
=
google_parse_account_list($accountxml
);
echo '
<pre>
'
;
print_r( $tProfiles
);