monrer.fr : autocomplétion et reverse-engineering

Il y a environ deux semaines, j'ai décidé de bouger le site monrer.fr sur un jail FreeBSD (merci KissCool pour ce jail, d'ailleurs). En effet, comme ce site tournait sur le même serveur que x0r.fr et qu'il s'agit d'une machine hébergée derrière une Freebox, un déménagement imminent signifierait au moins 72 heures de downtime, et étant donné la (modeste) fréquentation du site, je ne pouvais plus me permettre cela.

Je vais parler un peu des principales évolutions que j'ai faites ou qui sont en cours de développement.

Balbutiements de mécanisme d'autocomplétion

J'en ai aussi profité pour mettre en place un système d'autocomplétion pour remplacer le menu déroulant de sélection de gare. Il permet de taper aussi bien les premières lettres d'un nom de gare qu'un code TR3 :

Autocomplétion sur monrer.fr

Je suis assez mitigé là-dessus cependant. Je pensais pouvoir faire en sorte de conserver le menu déroulant sur des appareils mobiles et utiliser le champ de texte avec autocomplétion sur les navigateurs « desktop », mais je n'ai pas eu le temps de faire quelque chose de propre qui ne fasse pas déconner certains moteurs JavaScript mobiles (bonjour Opera Mini !).

Néanmoins, le tutoriel autocomplétion en AJAX de Denis Cabasson que j'ai suivi pour en ajouter une sur le site m'a été très utile et est très bien fait. Je trouve que c'est beaucoup plus éducatif d'essayer de le faire soi-même, plutôt que de prendre une random bibliothèque qui le fait déjà.

Une nouvelle source de données

La source de données trafic dont je parlais dans mon premier article à propos de monrer.fr est de moins en moins fiable, et je souhaitais pouvoir le remplacer avec autre chose pour plusieurs raisons :

  • les horaires du RER A et B sont les horaires théoriques et reflètent donc mal la réalité ;
  • il manquait les gares de certaines branches du RER A ;
  • il n'y a pas la possibilité de récupérer les messages qui défilent dans le bandeau en bas des écrans Infogare (donc pas d'infos trafic étendues ni d'infos travaux) ;
  • enfin, le serveur me balance une erreur 500 trois fois sur quatre lorsque je l'interroge.

C'est pourquoi je me suis mis en tête de reverse engineerer l'application Android officielle de Transilien afin de voir comment il fonctionne, et voir si celui-ci utiliserait une autre API en ligne non documentée.

Le temps que la SNCF mette en place une API accessible à tous, qui permette d'obtenir les horaires de toutes les lignes à raison de plus de dix fois par minute et sans authentification HTTP, j'ai constaté la chose suivante :

% dig api.transilien.com

; (snip)

;; ANSWER SECTION:
api.transilien.com.     600     IN      CNAME   api.ode.tn.ocito.com.
api.ode.tn.ocito.com.   86400   IN      A       85.233.209.218

Manifestement, le développement de l'API proposée par la SNCF a été déléguée par un sous-traitant, OCITO, ce qu'on retrouve assez facilement dans le nom des classes Java une fois le .apk de l'application Android officielle téléchargé, dézippé et décompilé avec dexdump. Assez étrange, dans le sens où l'entreprise se présente plus comme une entreprise de marketing mobile plutôt qu'une boîte qui aurait tout plein de datacenters capables de gérer tous les appels d'API d'usagers qui se demanderaient où diable se trouve leur RER, mais là n'est pas la question.

Passage supprimé à la demande de la SNCF.

Dissection de l'API OCITO

Passage supprimé à la demande de la SNCF.

Obtenir les prochains trains

Passage supprimé à la demande de la SNCF.

Le serveur renvoie [...], en JSON, la liste des prochains trains avec leur code mission, leur numéro, le terminus et l'heure de passage. Il ne donne cependant pas la liste des gares desservies, que je dois obtenir séparément et individuellement pour chaque train. Cependant, l'API fournit également cette information. Dans la même réponse figure une liste de chaînes de caractères correspondant aux informations affichées en bas des écrans Infogare.

Obtenir la desserte d'un seul train

Passage supprimé à la demande de la SNCF.

Le serveur renvoie alors la liste des gares ainsi que l'heure de passage, ce qui me permet d'obtenir à nouveau les informations de trafic "live" que j'obtenais jadis de sncf.mobi.

Conclusion

Avant monrer.fr, j'avais codé un plug-in pour un bot IRC qui récupérait le même genre d'informations que ce que je fais maintenant. Ma toute première approche consistait à parser le code HTML du site Transilien à l'aide de la page qui affichait toutes ces informations. Il s'agit donc maintenant de la troisième fois que je recherche une méthode pour obtenir ces horaires en temps réel, et le temps que la SNCF mette au point une API pour les obtenir qui me soit accessible, j'espère que ma méthode fera l'affaire.

En tout cas, des mises à jour sont à prévoir sur monrer.fr, même si je risque d'être assez occupé avec un déménagement imminent.

J'en profite aussi pour remercier tous ceux qui ont utilisé ce site et qui le trouvent utile, et plus particulièrement ceux qui envoient des bugreports.

Commentaires

Poster un commentaire

#1 — A

Alors, ça revient monrer.fr ou pas ?

#2 — x0r

Oui, j'y travaille. J'ai encore quelques bugs à enlever et je croise les doigts pour que la SNCF me file un accès plus large à ses données.

Je pourrais rouvrir bientôt, mais je ne pourrai pas prendre plus de 2 users simultanés et je serai limité aux gares des lignes C et L. En attendant que la SNCF ouvre son API pour toutes les lignes Transilien...

#3 — A

Pas de souci, je suis juste impatient, c'est un service que je trouvais bien utile.

Pour ce qui est des utilisateurs simultanés, en hébergeant soit-même l'application et en étant le seul à l'utiliser, ça résout le problème ?

Ou il y aura une clef/token en commun sur toutes les installations rer-web ?

#5 — kookix

Est il possible ou pourrais tu proposer la même chose pour les lignes de métro ? =)

Poster un commentaire