Il est maintenant temps de rentrer le vif du sujet avec les requêtes de récupération des données en provenance du service Google Reader.
Ces requêtes se font dans VB.Net avec la classe intégrée au framework .Net nommée Net.WebRequest, qui revient sur le principe de fonctionnement à entrer une URL dans un navigateur web (avec quelques options avancées tout de même).
Dans la suite de ce billet est détaillée une première liste des requêtes avec leurs principales fonctions. Pour ce billet, seules les requêtes de récupération d’informations sont indiquées, celles, moins nombreuses, qui permettent de modifier une information relative aux flux RSS consultés (article marqué lu/non lu et mis ou retiré de la liste de suivis) feront l’objet d’un billet spécifique. D’autre part, une seconde liste suivra celle-ci pour alléger ce billet bien fourni.
1. Authentification
Dans un navigateur web, les informations d’identification relatives à la consultation d’un site web sont enregistrées dans des cookies, petits fichiers constitués dans le but d’éviter de s’identifier manuellement à chaque visite des sites web concernés.
Dans une application Windows, il n’y a pas de cookies, il faut donc utiliser un autre moyen pour effectuer l’identification. Dans Google Reader, cela se fait en lançant une requête web à l’adresse suivante :
https://www.google.com/accounts/ClientLogin "POST", "Email=" & mail & "&Passwd=" & password & "&service=reader
POST indique qu’on envoie au serveur web distant des informations, qui sont l’adresse mail et le mot de passe de l’utilisateur qui se connecte. Si l’authentification réussit, le service web renvoie un code d’identification qui va être utilisé dans toutes les requêtes à venir, celui-ci sera l’équivalent du cookie d’un navigateur web, avec un petit additif aux headers de chaque requête :
hwrequest.Headers.Add("Authorization:GoogleLogin auth=" & AuthCode)
AuthCode étant une variable contenant le fameux code d’identification.
2. Récupération des informations sur l’utilisateur connecté
Histoire de commencer avec quelque chose de simple, voici la requête qui permet de récupérer ces informations :
http://www.google.com/reader/api/0/user-info?output=xml
Et voici le code retourné :
<object> <string name="userId">06835093091654116767</string> <string name="userName">xxx</string> <string name="userProfileId">116581737623165453159</string> <string name="userEmail">xxx@xxx.xx</string> <boolean name="isBloggerUser">false</boolean> <number name="signupTimeSec">1310139564</number> <boolean name="isMultiLoginEnabled">true</boolean> </object>
Nous voilà avec premier document XML encore simple, qui nous permet par exemple de récupérer le nom d’utilisateur (userName) ou encore son adresse mail (userEmail) pour un traitement ultérieur dans le programme, par exemple une zone dans le programme pourrait afficher le pseudo ou l’adresse mail de l’utilisateur connecté.
3. Récupération des flux auxquels l’utilisateur est abonné
On commence pour cela par récupérer les libellés auxquels les abonnements sont associés avec la requête suivante :
https://www.google.com/reader/api/0/tag/list
Ce qui nous donne ce type de résultat :
<object> <list name="tags"> <object> <string name="id">user/06835093091654116767/state/com.google/starred</string> <string name="sortid">6419B88F</string> </object> <object> <string name="id">user/06835093091654116767/label/Actu</string> <string name="sortid">34A2D73F</string> </object> </list> </object>
C’est une liste des tags, ou encore catégories, dans lesquels les éléments de la liste de lecture de l’utilisateur sont rangés. Certains tags sont définis manuellement, ce sont les libellés créés par l’utilisateur (dans l’exemple nous avons le libellé « Actu »). D’autres sont prédéfinis par Google Reader, l’exemple montre le tag « com.google/starred » qui correspond aux articles mis dans la liste des éléments suivis. Il en existe d’autres qui apparaitront dans les requêtes à venir. Le service indique également une propriété « sortid » qui ne sera pas utilisée dans le programme.
Ensuite, on récupère tous les abonnements au moyen de cette requête :
https://www.google.com/reader/api/0/subscription/list
Cette requête renvoie toute une série d’éléments structurés de la manière suivante :
<object> <string name="id">feed/http://blog.edelzone.fr/feed/</string> <string name="title">Edel Blog</string> <list name="categories"> <object> <string name="id">user/06835093091654116767/label/Actu</string> <string name="label">Actu</string> </object> </list> <string name="sortid">FB84010A</string> <number name="firstitemmsec">1245109329329</number> <string name="htmlUrl">http://blog.edelzone.fr</string> </object>
Les informations importantes pour la suite sont :
- l’id, qui donne l’URL du flux RSS de l’abonnement
- le title, qui donne le titre du flux RSS
- l’id et le label de la catégorie associée
- le champs htmlUrl qui donne l’adresse du site associé à ce flux RSS
Il y a autant d’entrées de ce genre que de flux auxquels l’utilisateur est abonné.
4. Récupération du nombre d’articles non lus par abonnement
La requête donnant cette information est la suivante :
https://www.google.com/reader/api/0/unread-count
Voici le type de résultat retourné :
<object> <number name="max">1000</number> <list name="unreadcounts"> <object> <string name="id">feed/http://www.mac4ever.com/syndication/news.rss</string> <number name="count">1</number> <number name="newestItemTimestampUsec">1334842452940458</number> </object> <object> <string name="id">user/06835093091654116767/state/com.google/reading-list</string> <number name="count">3</number> <number name="newestItemTimestampUsec">1334842637048543</number> </object> </list> </object>
J’ai retenu 2 éléments parmi ceux retournés par la liste. En premier, un élément de la liste des abonnements qui contient des articles non lus (lorsqu’un abonnement ne contient aucun article non lu, l’abonnement n’apparait pas dans cette liste). On y retrouve l’URL du flux RSS (« id ») et le nombre d’éléments non lus (« count »).
Le deuxième élément de cette liste contient le nombre total d’éléments non lus, lesquels sont tous placés dans la catégorie prédéfinie « com.google/reading-list ». Dans cet exemple, il y a donc 3 éléments non lus dans l’ensemble des abonnements de l’utilisateur.
Et normalement cette requête devrait suffire à couvrir toutes les listes de lecture, mais malheureusement elle ne donne aucune information sur la liste des éléments suivis, qui doivent donc faire l’objet d’une requête spécifique que voici :
http://www.google.com/reader/atom/user/-/state/com.google/starred
Je ne rentre pas dans ce billet en détail sur ce que retourne cette requête car le format de la réponse est différent des précédentes, il s’agit du format ATOM, une variante du XML. Quoiqu’il en soit ce qui nous intéresse ici est le nombre d’éléments que contient la liste, que l’on obtient en comptant le nombre d’entrées que contient la réponse.
Voilà pour cette première partie déjà bien riche, dans la seconde et dernière en ce qui concerne la récupération des données de Google Reader je reviendrai sur le traitement spécifique de l’affichage des articles contenus dans les flux RSS auxquels l’utilisateur est abonné. On y retrouvera le format ATOM évoqué à l’instant et on verra comment le transformer au format RSS pour le traiter de la même manière que les requêtes indiquées dans ce billet.