PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Jaussoin Timothée : Jouons un peu avec l'API interne de Google+

jeudi 4 décembre 2014 à 15:10

Comme toute grande plateforme web qui se respecte, le réseau social Google+ possède une API publique. Tout développeur souhaitant ainsi puiser dans l'énorme base de données offerte par le géant américain de la recherche peut, suite à une authentification, avoir accès à une multitudes d'URLs offrants des informations aussi diverses que les profils des utilisateurs, leurs liens, leurs galeries photo mais aussi, plus simplement, de la liste des billets publiés sur le réseau. Vous pouvez retrouver toutes les informations relatives à l'API officielle à cette adresse.

jeu.png

L'utilisation de cette API se fait suivant de nombreuses contraintes. Tout d'abord une authentification OAuth est nécessaire pour que Google puisse connaitre qui interroge son API, récupère quelles données et dans quel volume. Le quota fixé lorsque vous n'êtes pas authentifié est également volontairement bas (10 000 requêtes/jour) pour vous forcer à renseigner vos informations, suite à ça il passe à 20 000 000 requêtes/jour.

Dans ce billet je ne m'étendrais pas particulièrement sur cette API officielle, mais prendrait plutôt un autre chemin en exploitant l'API interne du projet.

Architecture de fonctionnement du site

Avant de rentrer dans les détails, il est toujours bon de comprendre le fonctionnement général et de savoir comment les pages Google+ sont chargées au sein de votre navigateur. Depuis quelques années déjà Google a tendance à effectuer une partie des calculs de rendu des pages web grâce aux navigateurs des utilisateurs, la génération du HTML étant alors faite en Javascript et non plus coté serveur.

Pour parvenir à ses fins Google charge un ensemble de scripts ayant un rôle similaire au framework AngularJS (framework qui est aujourd'hui également porté par Google). Le navigateur de l'usager va alors interroger le serveur grâce à des requêtes de type Ajax (ou, de façon moins courante, via un WebSocket) afin de recevoir les informations brutes qui seront ensuite analysées par ces scripts. Ceux-ci vont finalement générer le HTML grâce à l'utilisation de modèles prédéfinis.

Ce qui va nous intéresser ici, c'est de comprendre quelles types d'informations sont échangées entre ce script et le serveur, dans notre cas ce sera entre une page d'un utilisateur Google+ et le serveur officiel de Google. La console de développement du navigateur nous permet d'avoir toutes ces informations très facilement.

googleplus.png

Interrogation du SocialGraph interne

Parmi la multitude de requêtes envoyées l'une d'entre elles nous permet de récupérer la liste de contacts du profile interrogé. Ce qui est intéressant ici c'est qu'en récupérant les informations par ce biais nous outrepassons totalement le système de vérification imposé par Google en nous faisant directement passer pour l'application officielle. Nous n'avons également plus de problème de quota. Mais ce qui est aussi bien plus intéressant c'est qu'une très grande partie des informations que nous récupérons par cette API interne ne sont pas directement disponibles par l'API officielle, même après une authentification OAuth. Prenons un petit exemple avec la récupération de la liste de contact d'un utilisateur.

Via l'API officielle, sans authentification

La documentation de l'API nous indique que nous devons interroger l'URL suivante pour avoir la liste des personnes visibles publiquement :

https://www.googleapis.com/plus/v1/people//people/visible

Sans grand succès le serveur nous demande de nous authentifier.

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "dailyLimitExceededUnreg",
    "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "extendedHelp": "https://code.google.com/apis/console"
   }
  ],
  "code": 403,
  "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
 }
}

Via l'API officielle, avec authentification

Si nous nous authentifions, nous apprenons qu'une requête particulière devra être envoyée à l'utilisateur à qui nous souhaitons récupérer sa liste de contact. On comprend alors rapidement que ce type d'autorisation, au cas par cas, va rapidement être extrêmement limitante, malgré le quota de 2 millions de requêtes autorisées par jour.

Via l'API interne

L'analyse des journaux des requêtes faites par le navigateur sur les serveurs de Google+ nous apprend que la récupération de la liste de contact se fait via l'URL suivante.

https://plus.google.com/_/socialgraph/lookup/visible/?o=[null%2Cnull%2C""]

En interrogeant directement cette URL dans votre navigateur celui-ci va vous retourner un fichier response.txt contenant des données ayant une curieuse syntaxe.

)]}'

[["tsg.lac",[]
,[[[,,"110661163553027975344"]
,[]
,["Faisan Mezico",,,,"4e52150f806a1","BmZtIH_2033lLnZhGF-","FI4QDHp402BdDJodFk-",1,"//lh6.googleusercontent.com/-tpAJoURnuw0/AAAAAAAAAAI/AAAAAAAAAFQ/TDfgcRNxObM/photo.jpg",,1,,,,,0,,[]
,,,0,,[]
,,,[]
,[]
,,4,0,,[]
,,[]
,,,,,[]
]
,[]
]
,[[,,"101912980608854649615"]
,[]
,["WebUpd8",,,,"50960cba225a9","KI3fJJRj8-F8","1FGKBHhGGmwZ",1,"//lh4.googleusercontent.com/--zW_IOVlngs/AAAAAAAAAAI/AAAAAAAAHzY/-HFDg2zIa1c/photo.jpg",,1,,,,,0,,[]
,[,"http://www.webupd8.org",,,7]
,,1,"Daily Ubuntu / Linux news and application reviews.",[]
,,,[]
,[]
,,3,0,,[]
,,[]
,,,,,[]
]
,[]

Cette syntaxe semble d'approcher curieusement du JSON, au format tableau avec quelques petits changements.

Avec quelques lignes de PHP nous pouvons très facilement reconstituer une chaîne JSON valide.

Une fois les informations passées à la moulinette nous avons enfin une structure sur laquelle travailler.

array (size=2)
 0 => 
   array (size=3)
     0 => string 'tsg.lac' (length=7)
     1 => 
       array (size=1)
         0 => null
     2 => 
       array (size=66)
         0 => 
           array (size=4)
             ...
         1 => 
           array (size=4)
             ...
         2 => 
           array (size=4)
             ...
         3 => 
           array (size=4)

Je n'ai pas réussit à trouver la signification de l'ensemble des valeurs null mais j'ai réussit à déduire certaines d'entre elles. Nous observons la liste des contacts dans la structure renvoyée (avec mon jeu de donnée le profile interrogé avait ici 66 contacts). En tâtonnant un peu j'ai réussit à récupérer l'identifiant unique, le nom, l'avatar et la description.

 $c[0][2],
            'name' => substr($c[2][0], 0, 63),
            'avatar' => 'http://'. $c[2][8],
            'description' => htmlentities($c[2][21])
        ));
}
?>

Voici le résultat.

array (size=66)
 0 => 
   array (size=4)
     'idfull' => string '110661163553027975344' (length=21)
     'name' => string 'Faisan Mezico' (length=13)
     'avatar' => string 'http:////lh6.googleusercontent.com/-tpAJoURnuw0/AAAAAAAAAAI/AAAAAAAAAFQ/TDfgcRNxObM/photo.jpg' (length=93)
     'description' => string '' (length=0)
 1 => 
   array (size=4)
     'idfull' => string '101912980608854649615' (length=21)
     'name' => string 'WebUpd8' (length=7)
     'avatar' => string 'http:////lh4.googleusercontent.com/--zW_IOVlngs/AAAAAAAAAAI/AAAAAAAAHzY/-HFDg2zIa1c/photo.jpg' (length=93)
     'description' => string 'Daily Ubuntu / Linux news and application reviews.' (length=50)
…

Comme vous pouvez le constater, en quelques lignes de code nous pouvons parfaitement récupérer des informations structurées et compréhensibles à partir de l'API interne du réseau Google+ et cela en outrepassant toutes les limites de quota et d'autorisation imposées par l'entreprise.

J'ai suite à ça complété le script en tentant d'explorer le "graphe" Google+ de façon automatique via un système de saut de profil en profil. J'ai très rapidement récupéré les identifiants et informations de millions de comptes sans que Google ne me dise la moindre chose :)

Le navigateur interroge de très nombreuses URLs lors du chargement d'un profil Google+ avec pour bon nombre d'entre elles des informations structurées de la même façon que notre liste de contact.

Petite précision tout de même, l'ensemble des informations que j'ai ici récupéré sont des informations initialement publiques, que vous pouvez parfaitement avoir en chargeant le profile de la personne depuis un navigateur quelconque. Pour accéder aux données privées des utilisateurs il n'y a pas d'autre moyens (pour le moment) que de passer par l'API officielle et de récupérer, au cas par cas, les données.

Amusez vous bien !

Gravatar de Jaussoin Timothée
Original post of Jaussoin Timothée.Votez pour ce billet sur Planet Libre.