Weboob (Web Outside Of Browsers) est une bibliothèque et un ensemble d'applications interagissant avec des sites web. Plus de quatre ans après le premier commit, nous avons le plaisir d'annoncer la sortie de la première version stable de Weboob !

En plus de présenter les nouveautés, cette dépêche profite de cette version pour faire un rapide retour sur l'historique et l'évolution du projet.

Sommaire

Le nouveau browser

Comme nous l'expliquions dans la dépêche précédente, cette annonce de première version majeure est l'aboutissement de notre projet de refactorisation de code. Afin de rendre plus aisé le support de sites web par Weboob, le projet fournit de nombreux outils, dont une bibliothèque qui simule le fonctionnement d'un navigateur. Depuis quelques versions, cette bibliothèque a été réécrite sous le nom de "Browser2" puis tout simplement "le nouveau browser" (navigateur). Celui-ci est prêt à l'utilisation, et suffisamment abouti pour que son API reste stable durant la durée de vie de la branche 1.x. Nous nous autorisons des ajouts, mais l'existant ne sera pas modifié.

Ce nouveau Browser et les outils associés sont l'une des forces du projet : le scraping (extraction de contenu) est souvent une tâche répétitive, mais Weboob fait tout pour atténuer ce problème. Nous pensons que le projet a maintenant atteint un niveau de maturité lui permettant d'honorer cette promesse. Avec tous les outils du browser (ListElement, filtres, pagination, formulaires, etc.), un module peut ne prendre que quelques lignes de code.

Retour sur l'origine du projet

En 2008, un petit script Python utilisant mechanize et html5lib a vu le jour, écrit par un utilisateur d'un site de rencontres français bien connu, et dont l'objet était de remplacer l'interface web sur fond rose par son MUA pour échanger avec ses contacts. Très vite, il renouvela l'expérience avec un autre script pour récupérer automatiquement son solde et ses relevés depuis le site de sa banque.

Lorsque, début 2010, il lança le projet dlfp2mail, il se rendit compte de la possibilité d'appliquer la méthode à bon nombre d'autres sites web, et chercha à factoriser le code au sein d'un même et unique projet. Weboob était né.

Ainsi que ceux qui jasent sur le nom l'ignorent, il était initialement prévu de l'appeler woob. Ce n'est que lorsqu'on constata qu'il existait déjà un autre logiciel portait déjà ce nom qu'il fut décidé de le renommer weboob.

Les concepts fondateurs furent rapidement posés :

  • séparation entre les modules interagissant avec les sites et les applications ;
  • système de capacités que chaque module peut implémenter ;
  • bibliothèque utilisable par des applications tierces.

Le projet s'est depuis enrichi d'un navigateur puissant (remplaçant mechanize par requests) pour le parcours et l'analyse lexicale des pages, d'un système de dépôts pour les modules, de classes helper pour résoudre les claviers virtuels, etc.

37 capacités

Les capacités sont des interfaces permettant aux applications d'interagir avec les sites Web, de façon unifiée. Par exemple, la capacité bancaire offre la possibilité de lister les comptes, obtenir l'historique des transactions, faire des virements, etc. De leur côté, les modules implémentent une ou plusieurs de ces capacités (parfois partiellement uniquement, notamment si le site n'a pas la fonctionnalité). Les applications ont donc des interfaces unifiées et stables pour interagir avec tous les sites d'une catégorie, et non pas avec un seul site bien particulier.

C'est une grande différence avec les nombreux scripts d'extraction de contenu individuels pouvant se trouver sur Internet : on accède à tous les sites permettant de télécharger des vidéos d'une manière unique, à tous les sites bancaires en une seule requête, etc. La diversité des fonctionnalités des sites Web se retrouve en partie chez Weboob : nous proposons actuellement 37 capacités différentes, à comparer avec les 172 sites dont Weboob permet l'accès.

Utilisations tierces

Le projet Weboob fournit des applications basiques pour interagir avec les sites. Ces applications permettent d'effectuer des requêtes complexes (avec notamment un système de filtres sur les résultats), et permettent déjà de nombreuses interactions. Notre objectif n'est cependant pas de remplacer les applications existantes : nous n'allons pas créer un nouveau gestionnaire financier personnel dans Weboob. De très bons logiciels libres existent déjà pour celà. De même pour les lecteurs vidéos.

Nous mettons donc l'accent sur l'export des données en formats utilisables par tous, ainsi que sur l'utilisation de Weboob en tant que bibliothèque dans les projets. Cette méthode a particulièrement bien fonctionné pour les applications bancaires, mais aussi pour des usages plus inattendus. On peut citer à la fois des entreprises (Cozycloud, Budget Insight, Winancial) que des projets communautaires : Skrooge, Kmymoney (nous essayons de faire intégrer un patch upstream), GTranslate, Gnome Shell, un plugin pour XMBC/Kodi

Nouveautés depuis la 0.j

Pour revenir sur les actualités de la 1.0, le temps de développement de cette version a été assez court. Notre objectif (réussi) étant une migration de la version 1.0 dans Debian testing avant le gel. Il n'y a donc eu que six (intensives) semaines entre la 0.j et la version 1.0.

On peut cependant noter que la capacité permettant de consulter des annonces immobilières (CapHousing) a été améliorée. Les annonces immobilières du site Leboncoin ont notamment été ajoutées.

Du côté des applications, une nouvelle option de filtre (LIMIT) est disponible en ligne de commande. Elle permet de limiter la profondeur des recherches des requêtes utilisant le moteur de condition.

Concernant les modules, on peut noter un second module pour une banque américaine (Citibank). Du côté plus francophone, des modules pour suivre l'agenda du libre, pour suivre les marées et une nouvelle application de rencontres.

Enfin, sous le capot, nous avons profondément changé les API et les noms internes des objets. Nous voulions le faire pour présenter une interface cohérente pour la version 1.0. Dans ce cadre, l'utilisation de l'ancien Browser est désormais signalée comme obsolète. Un nouveau niveau de debug fait son apparition pour le nouveau Browser, permettant un suivi fin des appels sur les filtres.

Communauté

Depuis quatre ans, ce sont pas moins de 88 contributeurs qui ont participé à Weboob :

Adrien Kunysz, Ahmed Boussadia, Alexandre Bonhomme, Alexandre Flament, Alexandre Franke, Alexandre Lissy, Antoine, Arno Renevier, Benjamin Carton, Benjamin Drieu, BohwaZ, Camille Baldock, Camille Dehecq, Cedric Defortis, Christophe Benz, Christophe Gouiran, Christophe Lampin, Clément Schreiner, Clément Calmels, Damien Cassou, David Jeanneteau, Erwan Jahier, Etienne Carriere, Fabien Grumelard, Florent Fourcot, François D., François Revol, Gabriel Serme, Gabriel Kerneis, Gilles Quenot, Grmbl Frechneu, Hervé Werner, Jean-Benoist Leger, Jean-Christophe Dubacq, Jean-Philippe Dutrève, Jerem, Jeremy Monnet, Jérôme Poisson, Jocelyn Jaubert, Johann Broudin, John Morrow, Julia Leven, Julien Hebert, Julien Veyssier, Juliette Stehlé, Kevin Pouget, Laurent Bachelier, Laurent Dufréchou, Laurent George, Loic Bontonou, Luc Didry, Lucas Nussbaum, Lucien Loiseau, Mathieu Jourdan, Mathieu Lordon, Matthieu Rakotojaona, Michael Scherer, Nicolas Duhamel, Noé Rubinstein, Oleg Plakhotniuk, Olivier, Olivier Schwander, Philippe Fremy, Pierre Mazière, Raphaël Rigo, Richard Genoud, Roger Philibert, Romain Bignon, Romain Garbage, Ryan Nowakowski, Samuel Loury, Sébastien Monel, Simon Murail, Stefano Zacchiroli, Tanguy Ortolo, Tens San, Thomas Lecavelier, Vicnet, Vincent A, Vincent Paredes, Vincent Texier, Willy Villard, Xavier Guerrin, Yann Rouillard, ianux, leto, theocrite

Nous remercions également pour cette version les étudiants de l'Université de Lille 1, qui ont ajouté des tests dans le cadre d'un projet d'étude.

Weboob est un projet qui grossit et qui vit grâce à ses contributeurs. Si vous souhaitez l’améliorer, que vous connaissiez le Python ou pas, n’hésitez pas à contribuer.

Lire les commentaires

Weboob (Web Outside Of Browsers) est un ensemble d'applications interagissant avec des sites web.

En ces temps de rentrée, une nouvelle version de Weboob arrive pour vous accompagner. Weboob 0.j enjoue le Web depuis hier.

Cette nouvelle version est assez calme, avec environ 300 commits provenant de 13 contributeurs. Elle inclut cependant de nombreuses corrections de bugs, et peut être vue comme la version bêta de la 1.0 à venir.

Les nouveautés sont détaillées en seconde partie de la dépêche. Weboob compte désormais 165 modules, gérant davantage de sites (certains modules pouvant concerner plusieurs sites Web).

Sommaire

Export à l'international avec Wells Fargo et Twitter

Les fondateurs et la grande majorité des développeurs du projet sont francophones, ce qui introduit un biais sur la sélection des modules. Ainsi, tous les sites bancaires étaient jusqu'à présent des sites de banques françaises. On avait été parfois approché par des développeurs pour des banques à l'étranger, mais sans que cela n'aboutisse à des contributions concrètes. C'est désormais fait ! Cette version inclut en effet le module pour la banque Wells Fargo.

Dans la même veine, même si il a été développé par un francophone, un module Twitter a fait son apparition, amenant définitivement Weboob à la pointe des technologies de communication modernes.

Plugin XBMC/Kodi

L'intégration de Weboob dans des applications spécialisées est toujours un objectif. Cela permet une bien meilleure expérience utilisateur, et nous permet de rester concentrés sur les sites web plutôt que de développer des applications compliquées.
Nous sommes donc très heureux de présenter un plugin pour le lecteur XBMC/Kodi. Il permet de rechercher et visionner des vidéos en provenance de tous les sites gérés par Videoob:

Plugin xbmc

Plugin xbmc2

Le plugiciel est disponible dans le dossier contrib.

Browser2 et les opérateurs binaires

Nous présentions lors de la dernière dépêche le nouveau navigateur, permettant de simplifier l'extraction des données des sites Web. Cette simplification passe notamment par des filtres spécialisés, recherchant facilement les éléments du DOM, effectuant des traitements dessus et convertissant automatiquement les données au bon format (que ce soit un entier, une date, etc.). Ces filtres évitent d'écrire une conversion de texte en date dans chaque module. On peut imbriquer les filtres, afin d'obtenir un enchaînement assez puissant sans beaucoup de code :

    obj_duration = Duration(CleanText('//div[@id="video_text"]'))

Comme le code semble l'indiquer, on extrait d'abord le texte que l'on convertit ensuite en durée.

Cette encapsulation entre les différents filtres se fait parfois avec plusieurs niveaux, rendant le code un peu moins lisible. Pour résoudre cela, cette version introduit deux nouveautés basées sur les opérateurs binaires. Le premier est le &, qui permet d'enchaîner deux filtres dans le sens naturel. On pourra ainsi réécrire la ligne par :

    obj_duration = CleanText('//div[@id="video_text"]') & Duration

Le second, |, est utilisé pour définir une valeur par défaut, dans le cas où les filtres n'arrivent pas à convertir les données (notamment parce que la donnée n'est pas disponible sur le site lui-même ou qu'elle n'a pas le format attendu). Petit exemple de code réel :

    obj_duration = CSS('span.thumbtime span') & CleanText & Duration | NotAvailable

Ces opérateurs, optionnels, augmentent la palette des outils à disposition des développeurs de modules, rendant l'écriture de ceux-ci beaucoup plus aisée.

Pour plus d'informations sur le nouveau navigateur et son système de filtres, vous pouvez retrouver une série d'articles publiée (en français) sur le Planet Weboob.

En route vers la 1.0

Cette version sonne la dernière étape vers une stabilisation de Weboob et une sortie prochaine de la 1.0. Un travail d'uniformisation de l'API de développement a ainsi été effectué afin de pouvoir rentrer sereinement dans un cycle permettant la conservation de la rétro-compatibilité.

Cette uniformisation a cependant un coût temporaire : les outils externes utilisant Weboob comme bibliothèque doivent être mis à jour. Dans la même veine, le paquet Debian a été un peu nettoyé et rangé, et l'emplacement des plugins munin a notamment été modifié.

Nous sommes pour le moment dans les temps par rapport à notre planning prévisionnel pour la sortie de la version 1.0, prévue avant le gel de la distribution Debian.

La documentation développeur fait peau neuve

Un effort particulier a été réalisé durant ce cycle de développement pour améliorer la documentation. Nous avons ainsi refait la page d'accueil du site pour développeur, actualisé les guides et réorganisé la structure. Ce qui était parfois divisé entre le Wiki et la documentation est désormais intégralement sur le site dédié. Accessoirement, nous avons changé l'adresse du site, en passant de docs.weboob.org à dev.weboob.org.

Petites nouvelles

Les imports Python ont été réorganisés, pour réduire sensiblement le temps de chargement des applications simples (division par deux pour la plus simple des applications).
À la manière de l'utilitaire ip il est possible, pour économiser quelques lettres lors de l'écriture des commandes, de réduire les noms des modules (arte peut ainsi être écrit ar, voir a). Cela s'ajoute au nom des commandes déjà réduites.

Enfin, deux autres modules font leur apparition. Ils permettent d'accéder aux sites Feedly et Oney Banque

La prise en charge de Python 3 a été améliorée. Le projet reste en Python 2, mais certaines parties du core, et les modules compatibles, sont déjà utilisables avec Python 3.

L'application radioob gère maintenant les albums et les playlists :

$ radioob -b grooveshark search album sixsixsixteen
album.8163226@grooveshark — Blood Duster (Blood Duster)

$ radioob -b grooveshark play album.8163226@grooveshark

Le module arte prend en charge les podcasts.

Contributeurs

Merci aux contributeurs qui ont participé à cette version :

  • Benjamin Carton
  • Florent Fourcot
  • Jean-Philippe Dutreve
  • Julien Hebert
  • Laurent Bachelier
  • Oleg Plakhotniuk
  • Romain Bignon
  • Simon Murail
  • Tanguy Ortolo
  • Tens San
  • Vincent A
  • Vincent Paredes
  • Vincent Texier

Weboob est un projet qui grossit et qui vit grâce à ses contributeurs. Si vous souhaitez l’améliorer, que vous connaissiez le Python ou pas, n’hésitez pas à contribuer.

Lire les commentaires

Weboob (Web Outside Of Browsers) est un ensemble d'applications interagissant avec des sites web.

Et pour profiter du printemps, voici une nouvelle version de Weboob ! Weboob 0.i a en effet été acceptée sur le Web lundi dernier.

Cette version bat de nouveaux records de changements, avec 628 commits provenant de 19 contributeurs. Elle apporte la révolution du projet Browser2 (nouveau navigateur pour simplifier l'extraction des données), ainsi que de nombreux nouveaux modules.

Les nouveautés sont détaillées en seconde partie de la dépêche. Weboob compte désormais 161 modules, gérant au total encore plus de sites (certains modules pouvant concerner plusieurs sites Web).

Sommaire

Browser2 : un nouveau navigateur

Puisque le but est d'extraire des données sur le Web, le navigateur est une composante essentielle du projet. Il permet de simplifier les requêtes HTTP, de gérer les sessions, les cookies, de remplir les formulaires, etc.

Le premier navigateur développé (toujours en service) est basé sur la bibliothèque mechanize, avec toute une couche d'abstraction rajoutée par Weboob pour en simplifier l'utilisation. Nous étions cependant limités par cette bibliothèque : la gestion des formulaires est affreuse, le SSL ne vérifie pas les certificats, le debug des entêtes HTTP était compliqué, etc.

Un projet de nouveau navigateur était donc lancé depuis un certain temps, en se basant cette fois sur la bibliothèque python-requests. Le projet a été retardé plusieurs fois, notamment du fait des nombreux changements d'API de la bibliothèque, empêchant de développer quelque chose de stable. Cette période de maturation de la bibliothèque semble terminée, et le travail a donc pu reprendre.

Cette bibliothèque tenant toutes ses promesses, le nouveau navigateur (Browser2) de Weboob est bien plus performant que le précédent. Nous avons pu partir de bases solides pour reconstruire un navigateur. Les formulaires sont ainsi très simples à remplir, les URL sont bien mieux gérées, les entêtes HTTP (envoyées et reçues) sont sauvegardées en mode Debug, et la gestion de la pagination est enfantine. Enfin, le SSL est pleinement fonctionnel.

ListItem : factorisons le code

Ce n'est pas lié au changement de bibliothèque, mais cela vient également avec le projet Browser2. En examinant nos expériences de plusieurs années sur le parsing de pages, et le code des modules, il était évident pour nous que ce dernier était très (trop) répétitif. Nous voulions limiter la duplication du code, et simplifier l'écriture de module.

C'est cette réflexion qui a conduit à l'écriture des classes ListElement et ItemElement, permettant d'obtenir un code très déclaratif. L'extraction des données se base sur des filtres, dont la composition permet de presque tout faire. Les modules ont la possibilité de déclarer des filtres personnalisés, mais l'objectif est bien de les centraliser dans le cœur pour les réutiliser au maximum.

Il nous reste encore des choses que nous voulons améliorer pour le projet Browser2, mais nous le pensons déjà pleinement utilisable et 24 modules sont maintenant basés dessus. Nous sommes très satisfaits du résultat, notamment quand on observe que la conversion d'un module permet très souvent de diviser le nombre de lignes de code par deux. La documentation est prête, et nous sommes preneurs de tout retour concernant ce navigateur.

Pour plus d'informations sur ce sujet, le Planet du projet contient de nombreux articles détaillés.

Des mots de passe protégés

La protection des mots de passe était souvent un sujet de discussion à l'intérieur et autour du projet. En effet, il n'existait que deux alternatives : stocker le mot de passe dans un fichier en clair, ou bien laisser le champ vide et taper le mot de passe à chaque utilisation.

Plutôt que de réinventer la roue avec un gestionnaire de mot de passe propre au projet, il est désormais possible de configurer un appel à une application externe pour obtenir les identifiants d'un compte. La syntaxe rappelle celle d'un script bash, avec l'utilisation des symboles ` pour délimiter la commande.

Un exemple d'utilisation est ainsi de remplacer dans le fichier de configuration backends une ligne :

password = 123456

par :

password = `pass banques/ing`

Les utilisateurs peuvent également utiliser l'outil de configuration weboob-config pour mettre à jour ce champ, et les nouveaux utilisateurs auront l'option d'utiliser cette méthode dès la configuration d'un module.

Les reprises de Weboob

Si Weboob fournit de (nombreuses) applications, elles n'ont pas vocation à remplacer les applications spécialisées (et bien plus efficaces) existantes. Dans l'idéal, les applications Weboob ne seraient utilisées que pour exporter vers un format standard, et les données traitées par des applications existantes.

C'est pourquoi nous sommes toujours heureux de voir des projets intégrant des appels directs à Weboob. C'est courant dans le monde des applications bancaires (Budgea pour du propriétaire, CozyCloud et son gestionnaire financier, skrooge pour importer les données bancaires ainsi que les factures, etc), mais moins pour les autres applications.

Nous profitons donc de cette dépêche pour parler d'un plugin pour la recherche de vidéos pour Grilo, et d'un plugin pour la recherche dans Gnome Shell. Plus d'informations sur le blog de l'auteur, avec notamment des vidéos de démonstrations.

Les petites nouvelles

Dans les petites nouvelles, la conversion de Weboob vers Python 3 a commencé. Nous prévoyons de rendre progressivement compatible le cœur, les applications, et les modules basés sur Browser2.

Chaque version de Weboob s'accompagne toujours de nouveaux modules, celle-ci n'est pas en reste avec de nombreux modules permettant d'envoyer/recevoir des images. Un module pour le site La Centrale fait également son apparition, ainsi que pour le site de rencontre de plus en plus populaire Tinder. Cela pourrait sauver une génération.

Enfin, on entend parfois sur ce site que le nom du projet est incompatible avec une utilisation professionnelle. La réalité prouve le contraire, avec une prochaine utilisation de Weboob par la Banque Accord (via l'entreprise Budget Insight). On peut même trouver des offres d'emploi mentionnant Weboob.

Association

L'association Weboob continue son rôle de pilotage et protection du projet. Elle tiendra son assemblée générale le 12 Juin dans un lieu qui reste à définir. Si vous êtes intéressés, une annonce est à venir sur la liste de diffusion du projet, et le bas de la page de l'association sera mis à jour.

Contributeurs

Merci aux contributeurs qui ont participé à cette version :

  • Adrien Kunysz ;
  • Ahmed Boussadia ;
  • Benjamin Carton ;
  • Florent Fourcot ;
  • François Revol ;
  • Gabriel Kerneis ;
  • Johann Broudin ;
  • Laurent Bachelier ;
  • Matthieu Rakotojaona ;
  • Noé Rubinstein ;
  • Pierre Mazière ;
  • Raphaël Rigo ;
  • Roger Philibert ;
  • Romain Bignon ;
  • Vincent Osele ;
  • Vincent A. ;
  • Vincent Paredes ;
  • Vincent Texier ;
  • Yann Rouillard.

Weboob est un projet qui vit grâce à ses contributeurs. Si vous souhaitez l’améliorer et que vous connaissez le Python, n’hésitez pas à contribuer.

Lire les commentaires

Weboob (Web Outside Of Browsers) est un ensemble d'applications interagissant avec des sites web.

Quatre mois après la dernière dépêche, Weboob 0.g est paru samedi dernier, profitant des chaleurs rendant d'autres activités moins agréables.

Cette version bat la précédente (déjà exceptionnelle) en terme de commits, en dépassant le nombre symbolique des 500. Ils apportent des nouveautés comme la recherche sur des sites d'annonces d'emplois et le suivi de vos colis. Les améliorations de fonctionnalités existantes ne sont pas en reste, avec la résolution de demandes parfois très anciennes.

Ces nouveautés seront détaillées en seconde partie de la dépêche. Avec 19 nouveaux sites boobisés, Weboob atteint désormais le nombre de 125 modules !

Sommaire

Recherche d'emploi

Weboob se lance une fois de plus dans l'aide contre la crise économique. Grâce aux modules Adecco, Apec, Lolix et Pôle Emploi vous pouvez accéder à de nombreuses annonces en un rien de temps. Pour lire ces annonces, vous pouvez soit le faire en console avec handjoob ou en version graphique avec qhandjoob.

qhandjoob

Les applications n'offrent pour l'instant pas d'intéractions très complexes, mais ont déjà les avantages habituels de Weboob : l'agrégation de résultats de sources différentes en une seule application. Il ne fait aucun doute que la courbe du chômage devrait s'en ressentir.

Suivi de colis

Signe des temps de notre société, le suivi de colis est parfois synonyme de stress, d'énervement, et de frustration lors de l'appui sur la touche F5. C'est désormais terminé grâce à parceloob, permettant déjà le suivi des colis Chronopost et UPS. Vous pouvez désormais suivre vos colis dans votre terminal.

parceloob

Histoires de cœur

Vous avez peut-être remarqué les couleurs sur la capture d'écran précédente : eh oui, Weboob 0.g introduit de la couleur dans les applications consoles. Pour en profiter, il faut installer le paquet python-termcolor, actuellement dans la file d'attente NEW de Debian. Boobank profite également de ces couleurs pour améliorer la lisibilité de vos comptes :

boobank_couleurs

Autre grande nouveauté de cette version, il n'y a plus de limitation par défaut du nombre de résultats dans les applications. Il existait auparavant une limitation de 10 résultats, qui frustrait beaucoup de nouveaux utilisateurs n'ayant pas connaissance de l'option -n. Ce problème n'était cependant pas simple à corriger de façon élégante. C'est désormais fait, et en bonus, les commandes qui sont toujours limitées affichent un message si d'autres résultats sont disponibles mais non affichés.

Sous le capot, cela ne changera rien pour de nombreux utilisateurs, mais nous avons introduit un cache pour les requêtes DNS. Ce n'était pas de gaité de cœur, mais le site de la BNP nous y a forcé. En effet, ce site renvoie des adresses différentes à chaque requête. Ces changements d'adresse provoquent des déconnexions et des difficultés d'accès aux comptes, la solution temporaire étant alors de rajouter une entrée dans le /etc/hosts pour être tranquille. Avec ce cache, cela fonctionnera pour tous les utilisateurs.

Dans les dépendances externes, Weboob est désormais compatible avec Pillow. Nous avons au passage découvert que la « couche de compatiblité » introduite par Ubuntu et Debian (en paquet expérimental pour cette dernière) n'était pas parfaite. L'upstream de Pillow ne fournit pas de compatibilité, Ubuntu le fait mais de manière incomplète, ce qui rendait les rapports de bugs de nos utilisateurs incompréhensibles. Les utilisateurs de rancid peuvent donc installer cette nouvelle version pour corriger les bugs de certains modules.

Enfin, toute trace du support de python 2.5 est désormais supprimée. Cela a permis un peu de nettoyage de code.

Petites nouvelles

Si vous êtes fans d'archivages de factures et de documents administratifs, boobill a désormais accès à trois nouveaux modules. Vous pouvez maintenant récupérer les factures de GDF SUEZ DolceVita, d'Ameli et d'Amelipro.

Du côté des modules bancaires, on peut signaler l'ajout des banques Delubac, Hello Bank et Citélis. Pour les comptes professionnels, beaucoup de modules permettent désormais d'accéder à ces comptes grâce à une simple configuration des modules habituels (BNP, Société Générale, LCL, etc).
Enfin, pour les plus capitalistes d'entre nous, on peut désormais suivre l'évolution des investissements boursiers (sur le module ING uniquement pour le moment) avec boobank. Une confirmation des ordres des virements a également été ajoutée en mode interactif suite à une demande lors de la sortie de la version 0.f.

Si vous avez apprécié la version 0.f, vous serez d'ailleurs heureux d'apprendre l'ajout de nouveaux modules de recettes de cuisine, les sites Allrecipes et Supertoinette font leur apparition. Suite aux nombreux retours que nous avons reçu, les applications qcookboob et qcineoob ont été améliorées.

Comme tout détailler serait trop long, notons simplement l'apparition des modules V'Lille, Paroles.net, podnapisi, Arrêt sur Images et Grooveshark.

Communication

Une partie de l'équipe Weboob était présente aux RMLL, avec une conférence de présentation générale et une conférence plus spécifique sur le monde des sites Webs bancaires. Malheureusement ces conférences étaient programmées en parallèle, mais il est possible de les revoir.

Contributeurs

Merci aux contributeurs qui ont participé à cette version :

  • Benjamin Carton
  • Christophe Lampin
  • Florent Fourcot
  • François D.
  • François Revol
  • Gabriel Kerneis
  • Johann Broudin
  • Julien Veyssier
  • Juliette Stehlé
  • Laurent Bachelier
  • Lucas Nussbaum
  • Mathieu Jourdan
  • Nicolas Duhamel
  • Noé Rubinstein
  • Romain Bignon
  • Sébastien Monel
  • Stefano Zacchiroli
  • Willy Villard

Weboob est un projet qui vit grâce à ses contributeurs. Si vous souhaitez l’améliorer et que vous connaissez le Python, n’hésitez pas à contribuer.

Lire les commentaires

Avant-propos : cet entretien peut sembler être une entorse à la série « vivre du logiciel libre » dans la mesure où la société Budget Insight ne « vit » pas du logiciel libre. C'est la raison pour laquelle cette dépêche n'est pas intitulée « Vivre du logiciel libre […] » mais « Création d'entreprise et logiciel libre […] »


La série d'entretiens sur le logiciel libre et la création d'entreprise continue. Mi-décembre, vous aviez pu lire les échanges avec Daniel Castronovo au sujet de la création et de la cessation d'activité de son entreprise Ikux. Cet entretien présentait la particularité de faire suite à un entretien 3 ans auparavant.

Pour démarrer l'année 2015, voici Romain Bignon, cofondateur de Budget Insight, un éditeur de logiciels. Bien que ne commercialisant pas une offre « open-source », Budget Insight est acteur du logiciel libre notamment à travers le controversé Weboob. Budget Insight était d'ailleurs cité dans la dépêche "Ces startups qui contribuent au libre" fin 2012.

Vous pourrez découvrir l'entretien avec Romain Bignon en deuxième partie de dépêche, suite à quoi vous êtes vivement invités à commenter et questionner :)

Nom et prénom Romain Bignon
Société Budget Insight
Activité de l'entreprise Éditeur de logiciels
Démarrage de l'activité Février 2012
Localisation de la clientèle France
Nombre de collaborateurs 6
Sites web https://www.budget-insight.com
https://www.budgea.com/

Sommaire

La création d'entreprise

Bonjour Romain, peux-tu présenter en quelques lignes qui tu es et ce que tu fais ?

Bonjour, je suis un développeur autodidacte de 26 ans, auteur de plusieurs logiciels libres, les plus connus étant minbif et weboob. J'ai travaillé plusieurs années dans deux entreprises du libre : INL/Edenwall, malheureusement aujourd'hui fermée, et Avencall.

Comment t'es venue l'idée de créer Budget Insight ?

Weboob est née en 2010 de l'union d'un « scraper » pour un site de rencontre, et d'un autre pour le site de la banque BNP Paribas. L'augmentation du nombre de contributeurs a apporté toute une palette de nouveaux modules bancaires, ainsi que des modules de récupération de factures (EDF, etc.).

Courant 2011, alors que j'étais à Avencall, j'ai eu l'envie avec un ami de monter une boite. Ayant fait une rupture conventionnelle pour glander sur mon canapé m'assurer un revenu le temps de monter le projet, nous avons cherché diverses idées et modèles économiques. L'une d'elle m'est venue à la lecture d'un article du Canard Enchaîné parlant de dématérialisation et de coffre-forts électroniques, en utilisant weboob pour l'automatisation de la récupération des factures. Très rapidement, s'est rajoutée l'idée de les associer aux données bancaires, et de fournir des indicateurs (camemberts, catégorisation automatique, etc.).

Malheureusement, l'absence de soutien de mes proches, et le fait que l'on avait tous deux des profils techniques menant à beaucoup d'incertitudes au niveau business, nous ont conduit à abandonner le projet.

Et alors que j'étais sur le point de rechercher du boulot, un centralien avec un projet d'entreprise similaire ayant entendu parler de weboob m'a proposé de picoler avec lui, et ça a débouché sur la création de Budget Insight.

Quelle a été votre démarche pour cette création ? Avez-vous été aidés ?

En février 2012, nous avons donc déposé les statuts de la SAS, puis nous avons été rapidement incubés à l'École Centrale Paris. Cette incubation nous a donné le privilège d'être suivi par un coach, fondateur d'Incwo (aujourd'hui client à nous), qui nous a énormément aidé tout au long de notre évolution.

Nous étions au départ trois associés, Clément (le centralien, qui s'occupe du business), Mathieu (développeur frontend) et moi (développeur backend).

Mathieu a fini par nous quitter, étant beaucoup moins investi que nous, travaillant à distance (il habite Lyon et nous sommes à Paris), et n'étant pas aligné sur l'évolution de la stratégie de la boite.

Avez-vous eu besoin de financements ? Où les avez-vous trouvés ?

Outre l'apport initial, nous avons effectivement sollicité deux types de financements. D'une part, des aides sous forme de subvention ou de prêts à taux zéro, publiques (PIA 1 et 2, AIMA) et privées (Réseau Entreprendre 92). D'autre part, nous avons également ouvert notre capital à un Business Angel.

Aujourd'hui, après 3 années d'activité, vous êtes 6 collaborateurs. Quelle a été la chronologie et la stratégie de vos recrutements ?

Nous avons embauché notre premier salarié (un contributeur weboob) début 2013 lorsque nous avons commencé à faire du service, qui a malheureusement dû nous quitter six mois plus tard pour des raisons de santé. Nous l'avons alors remplacé par quelqu'un d'autre sur cette partie, puis nous avons pris une seconde personne pour travailler sur l'intégration de Budgea en marque blanche, puis sur Budgea Pro.

Maintenant, puisque nous avons arrêté de faire du service, les deux développeurs sont sur Budgea Pro qui reste notre principal axe d'évolution.

Nous avons également fait appel par le passé à quelques amis pour des prestations ponctuelles (notamment sur les applications mobiles), et nous avons un étudiant de l'école 42 en stage chez nous dont nous sommes très contents (nous espérons l'embaucher à terme).

Côté commercial, nous avons assez peu investi (à tort, rétrospectivement), mon associé s'en occupant principalement. Nous avons eu quelques stagiaires (dont une qui a été géniale), mais cela devrait constituer notre première embauche en 2015 dès que nous aurons le budget pour ça.

Du B2C vers le B2B

Il me semble que votre activité originale était basée sur le service Budgea, ciblant le grand public via deux formules : une gratuite et une premium à 2,5€/mois. Cette stratégie impose l'acquisition de nombreux utilisateurs et clients. 3 ans après le lancement, où en êtes vous ?

Effectivement, notre positionnement initial était un service web et mobile pour les particuliers avec deux axes pour gagner de l'argent :

  • Une version Premium, donnant accès à des fonctionnalités avancées tels que le prévisionnel ;
  • Des recommandations personnalisées de produits bancaires et d'assurances via des partenaires.

Comme tu le dis, pour valider le modèle, il faut de nombreux utilisateurs, et cela a un coût. Nous avons fait plusieurs campagnes, nous ayant permis d'atteindre aujourd'hui plusieurs dizaines de milliers d'utilisateurs. Néanmoins, nous avions déjà des concurrents bien installés (Bankin et Linxo) ayant levé des fonds, et donc ayant une force de frappe plus importante.

Nous avons tenté de nous démarquer d'eux par la fonctionnalité du prévisionnel, basée sur des algorithmes statistiques pour détecter automatiquement les dépenses récurrentes et variables, et projetant l'évolution du solde à venir sur un mois. Mais nous avons constaté que cette « killer-feature » n'était pas suffisante pour faire la différence.

Enfin, faire du B2C impose d'avoir une approche marketing importante, or cette caractéristique ne fait pas partie de notre ADN, contrairement à Bankin qui sont très bons dans ce domaine.

Budgea est donc une jolie vitrine de nos technologies, mais nous n'investissons plus dans l'acquisition d'utilisateurs car elle nous rapporte aujourd'hui moins d'un millier d'euros par mois.

Du coup, comment gagnez vous de l'argent ?

Après avoir été lauréats du Réseau Entreprendre 92, nous y avons rencontré le patron d'une autre société qui, impressionné par Budgea, nous a proposé de faire du service pour lui. L'idée était de lui développer son outil interne de production, en utilisant notre agrégation bancaire, puisque son cœur d'activité est de produire des indicateurs aux PME.

Nous avons par la suite été également approchés par d'autres sociétés, notamment des cabinets d'expertise comptable. Cela a été un véritable tournant dans notre réflexion, puisque nous nous sommes rendus compte qu'il y avait un réel besoin sur le marché professionnel d'outils de gestion de trésorerie.

Ça a débouché sur le lancement de Budgea Pro fin 2014, adressé aux TPE et aux experts comptables, en tant que plateforme collaborative, et qui constitue notre principal axe de développement sur 2015.

En parallèle, nous avons également répondu à divers appels d'offres de banques.

Qui sont vos clients ?

Aujourd'hui, nous avons trois typologies de clients :

  • des grands comptes (tels la Banque Accord et l'Express) qui intègrent Budgea en marque blanche pour le proposer à leurs clients ;
  • les éditeurs de logiciels (ERP, trésorerie, notes de frais, etc.) qui utilisent la Budgea API pour faire de l'agrégation bancaire ;
  • les experts-comptables et les TPE pour Budgea Pro.

Comptant des banques parmi vos clients, peux-tu nous en dire un peu plus sur la perception du logiciel libre dans ce domaine ?

Très mauvaise en général :). Cela dépend évidement de l'interlocuteur, mais les « décideurs » associent le logiciel libre à cheap, amateur, qui ne gère pas la montée en charge, etc.

Nous avons abandonné l'idée de les convaincre, nous préférons minimiser cet aspect lors des échanges commerciaux, insistant sur le fait que notre solution peut très bien fonctionner avec Oracle, par exemple.

Cela dit, Linux et Apache font exception, car eux sont relativement bien acceptés.

En revanche, un autre souci que nous avons rencontré, est la sécurité perçue.

Lorsque nous avons intégré Budgea en marque blanche pour une banque, un audit a été commandé par celle-ci auprès d'un prestataire, qui s'est contenté de fournir un rapport de scan automatisé, bourré de faux positifs (il était indiqué notamment qu'il y avait une version de mediawiki vulnérable, alors qu'on ne l'utilise évidemment pas). Ce rapport a été remonté tel quel par la DSI à la direction de la banque, ce qui nous a valu de batailler.

Il nous a été également demandé de mettre à jour Apache de 2.2 à 2.4, car la version utilisée serait vulnérable ! Ce ne fut pas simple de faire comprendre que le système d'exploitation utilisé (Debian) propose des mises à jour de sécurité, et qu'installer une version séparée, non seulement n'améliorait pas la sécurité, mais pire augmentait le risque, puisqu'on se passait du support sécurité de Debian !

Enfin, un scan réalisé avec ssllabs a donné une note de A-, ce qui a crispé, alors que le site de cette banque est lui-même noté… F.

Et le fait que vos solutions reposent sur Weboob (qui est déjà très controversé sur LinuxFR ;) ?

Dans la même logique, nous ne parlons pas (ou peu) de weboob, car outre le nom qui peut faire mauvaise impression, nous vendons un package complet et non pas un ensemble de briques.

Cela dit, ça nous a apporté des opportunités, une grosse banque nous ayant contacté pour un appel d'offre après nous avoir connu via weboob !

En tout cas, le fait qu'il y ait beaucoup d'éditeurs de logiciels qui sont clients de la Budgea API, l'offre commerciale d'agrégation bancaire autour de weboob, montrent que ce dernier répond à une véritable problématique professionnelle, contrairement à ce que peuvent penser quelques trolleurs sur linuxfr :).

J'ai constaté que pas mal de banques proposent des solutions de gestion intégrée à leur portail. Ces solutions reposent-elles sur vos technologies ?

Nous équipons la Banque Accord et avons travaillé avec le Crédit Agricole. Nous avons des concurrents qui ont fourni des parties de leurs technologies (agrégation ou catégorisation automatique) à certaines banques, et d'autres (à l'instar de la Société Générale) développent leurs solutions de gestion en interne.

Je me souviens avoir découvert ces fonctionnalités sur les portails des banques après que Budgea se soit lancé. Est-ce votre service qui a poussé les banques à proposer ces fonctionnalités ?

Ce sont les services similaires au nôtre qui ont effectivement incité les banques à se mettre à la page, car elles se sont rendu compte que nous captions leurs utilisateurs. C'est grâce à l'agrégation bancaire avec des outils tels que weboob que les PFM ont pu émerger, les banques étant très frileuses à l'idée d'ouvrir leurs données à des éditeurs tiers.

Plusieurs d'entre elles, dont la « Direction de l'innovation » est représentée par le stéréotype du banquier du troisième âge, ont tenté (sans succès) de mettre en place des mesures pour empêcher le scraping. Heureusement, d'autres (tels le Crédit Agricole ou AXA Banque) sont plus innovantes et proposent des APIs.

Ceci est en tout cas la preuve que l'ouverture est le meilleur moyen de favoriser l'innovation.

Contribution au libre

Budgea est parfois présenté comme la version "graphique" des modules bancaires de Weboob. Il n'en est néanmoins pas pour autant libre. Puisque vous ne gagnez pas d'argent avec, pourquoi ne pas le libérer ?

C'est une option à laquelle nous avons plusieurs fois réfléchi et qui nous tente bien. Cela permettrait potentiellement de fédérer une communauté de développeurs autour de l'application, qui serait du coup profitable à notre déclinaison professionnelle.

Néanmoins, cela nécessite un certain travail, puisqu'il faut d'une part mettre en place la logistique (packaging, documentation d'installation, documentation développeur, bug tracker public, etc.) et d'autre part soigner la communication pour favoriser la création de cet écosystème. La quantité de travail que nous avons aujourd'hui ne nous permet pas d'investir du temps là-dedans à court terme, mais j'espère qu'on pourra faire ça d'ici fin 2015, car je pense que ça pourrait réellement être bénéfique si nous faisons les choses correctement.

À suivre donc, DLFP sera le premier informé :).

Tu cumules les rôles de directeur général de Budget Insight, président de l'association Weboob et lead développeur Weboob. N'y a-t-il pas un conflit d'intérêts entre ces différentes casquettes ?

L'Association Weboob a justement été créée dans l'optique de limiter le conflit d'intérêt. Il a été décidé à sa constitution de me nommer président car j'étais alors le plus actif contributeur (non seulement en code mais dans la communauté), mais dans l'optique de laisser ma place une fois que la machine sera lancée.

Nous atteignons bientôt ce but puisque lors de la prochaine AG je devrais laisser ma place à Florent Fourcot.

Note que je ne suis déjà plus Release Manager, Florent occupant ce poste depuis plus d'un an.

D'ailleurs la société Budget Insight finance-t-elle des contributions à Weboob ? À d'autres logiciels ou technos libres ?

Budget Insight est bien sûr le premier contributeur sur la partie bancaire, et apporte de nombreuses améliorations au core. Nous avons créé plus d'une quinzaine de modules et assurons une maintenance quasi quotidienne de l'ensemble des modules bancaires, via le buildbot humain que représentent les utilisateurs de Budgea.

La plupart des collaborateurs actuels ou passés de Budget Insight ont payé leur patch (Simon Muraïl, Vincent Paredes, Laurent Bachelier, Noé Rubinstein).

Conclusion

Des projets dans les cartons ? Des innovations à venir ?

Comme tu l'auras compris, le gros de notre activité en 2015 concernera avant tout les professionnels.

Les prochaines innovations qui devraient arriver très vite, sont l'intégration d'un système d'OCR pour la reconnaissance des méta-données des factures, et le lettrage automatisé entre celles-ci et les mouvements bancaires.

Nous allons également mettre en place une interface de gestion de budgets de trésorerie, basée sur le système de prévisionnel de Budgea, adaptée pour les pros.

Un dernier mot ? Un retour d'expérience à partager ?

Je ne regrette absolument pas de m'être lancé, car outre la satisfaction personnelle qu'il y a à gérer une activité et le plaisir que j'ai d'arriver le matin au bureau et de voir l'équipe et l'ambiance qui s'est créée, et même si c'est pas facile tous les jours, c'est extrêmement formateur sur un large panel de sujets : le business, la comptabilité, la gestion de projets clients (qui est au final très différente de la gestion d'un logiciel libre), le management, les RH, la relation client, la gestion des merdes, etc.

Ma courte expérience m'a également appris l'importance du réseau et son entretien, ainsi que le fait qu'il faut être en permanence à l'écoute du marché pour être prêt à pivoter (comme on l'a fait), car il est facile d'aller dans le mur en étant persuadé de détenir une idée révolutionnaire qui n'est pas adaptée.

Enfin, il ne faut pas avoir peur de faire des erreurs, car on en fait de toute façon, et ce qui compte est d'arriver à en tirer le meilleur pour avancer.

Merci Romain pour le temps que tu as pris pour répondre à ces questions (et pour le temps que tu vas prendre pour répondre aux commentaires;) Bonne continuation.

Lire les commentaires

Un reproche qui est fait régulièrement à Budgea est qu'il est nécessaire d'y enregistrer ses identifiants bancaires pour utiliser le service.

En effet, pour des raisons évidentes de convivialité, nous préférons stocker (de manière sécurisée¹) les credentials et effectuer la synchronisation quotidiennement (via weboob) pour générer des alertes, et éviter que l'utilisateur ait un agent sur son poste qui doit être régulièrement mis à jour.

Néanmoins, grâce à l'API fournie par Budgea, il est possible de charger les nouvelles transactions depuis une application cliente. J'ai donc rajouté une commande à l'application boobank pour effectuer la synchronisation depuis sa propre machine.

Pour cela, une fois votre compte créé sur Budgea, vous pouvez charger vos comptes et transactions bancaires en une seule commande :

$ boobank budgea USERNAME PASSWORD

Par exemple :

$ boobank budgea romain@weboob.org mypassword
- C/C Eurocompte Confort M Machin (678.00€): 27 new transactions
- Compte Courant M Machin (0.00€): 9 new transactions

Les comptes apparaissent maintenant dans Budgea avec l'ensemble des transactions disponibles. Il est dès lors possible d'ajouter cette commande dans un cron pour que cela soit fait régulièrement.

¹ le chiffrement est réalisée de manière asymétrique, ce qui fait que seuls les backends, non accessibles depuis Internet, peuvent lire les identifiants bancaires pour les envoyer aux sites des banques.

L'inconvénient de la première approche c'est que la recherche bloquait l'interface. Du coup, j'ai révisé l'approche pour une version asynchrone.

Lire la suite… (Il reste encore 1 min. de lecture)

Histoire de découvrir JavaScript et d'avoir une interface graphique à videoob j'ai créé une extension Gnome-Shell : https://github.com/guyou/videoob-search-provider

Lire la suite… (Il reste encore 1 min. de lecture)

Cet article fait partie d'une série sur le Browser2.

Beaucoup de méthodes de modules weboob retournent des listes d'éléments itérés sur des pages paginées. C'est le cas des résultats de recherches notamment.

Voici l'exemple typique de code avec l'ancien browser permettant de gérer cette pagination :

class ResultsPage(BasePage):
    def iter_results(self):
        # ...

    def get_next_url(self):
        link = self.document.xpath('//a[text()="Next »"]')

        if not link:
            return None

        return link[0].attrib["href"]

class Browser(BaseBrowser):
    # ...
    def search_pattern(self, pattern):
        self.location('/search/%s' % urllib.quote(pattern))

        while True:
            assert self.is_on_page(ResultsPage)

            for video in self.page.iter_results():
                yield video

            next_url = self.page.get_next_url()
            if next_url is None:
                return

            self.location(next_url)

Plus verbeux, on ne fait pas.

Le Browser2 introduit un mécanisme qui permet de gérer beaucoup plus simplement la pagination, dont le fonctionnement interne est simple :

  • La méthode de la page, une fois qu'elle a fini d'envoyer les éléments de la page, doit envoyer une exception NextPage avec le lien ou la requête à exécuter ;
  • Un mécanisme au dessus de la page se charge de capturer cette exception, joue la requête, et appelle de nouveau la méthode sur la nouvelle page.

Bien camouflé dans ListElement et le décorateur pagination, cela donne :

class ResultsPage(HTMLPage):
    @pagination
    @method
    class iter_results(ListElement):
        item_xpath = '//span[@id="miniatura"]'

        next_page = Link(u'//a[text()="Next »"]')

        class item(ItemElement):
            # ...

class Browser(PagesBrowser):
    # ...
    def search_pattern(self, pattern):
        self.search.go(pattern=pattern)
        assert self.search.is_here(pattern=pattern)

        return self.page.iter_results()

Définir l'attribut next_page fait que si le lien est présent, ListElement lance l'exception NextPage. Ensuite, le décorateur pagination se charge de la traiter lorsqu'elle est capturée.

Note : une autre façon de gérer la pagination existe avec la méthode PagesBrowser.pagination().

Cet article fait partie d'une série sur le Browser2.

On a vu la classe ListElement qui itère sur les éléments d'une liste du HTML pour en sortir des objets weboob, je vais maintenant introduire la classe TableElement dont l'objet est de simplifier le traitement des tableaux

Prenons le code suivant :

class HistoryPage(HTMLPage):
    @method
    class get_history(ListElement):
        item_xpath = '//table[@class="liste"]/tbody/tr'

        class item(ItemElement):
            klass = Transaction
            condition = lambda self: len(self.el.xpath('./td')) >= 3

            obj_date = Transaction.Date('./td[1]')
            obj_raw = Transaction.Raw('./td[2]')
            obj_amount = Transaction.Amount('./td[last()]')

Grâce aux filtres, c'est parfaitement lisible, néanmoins ça souffre d'un problème. Si, comme le site du Crédit Mutuel, l'ordre des colonnes change ou des colonnes supplémentaires sont présentes (en fonction des clients), il est difficile de savoir où se trouve l'information.

Pour ce cas, la classe TableElement a été rajoutée afin de faire la sélection de la cellule non pas à partir de son index, mais à partir de son titre.

class HistoryPage(HTMLPage):
    @method
    class get_history(TableElement):
        head_xpath = '//table[@class="liste"]//thead//tr/th/text()'
        item_xpath = '//table[@class="liste"]//tbody/tr'

        col_date = u"Date de l'annonce"
        col_raw = u"Opération"
        col_amount = u"Montant"

        class item(ItemElement):
            klass = Transaction
            condition = lambda self: len(self.el.xpath('./td')) >= 3

            obj_date = Transaction.Date(TableCell('date'))
            obj_raw = Transaction.Raw(TableCell('raw'))
            obj_amount = Transaction.Amount(TableCell('amount'))

Comme on peut le voir, il suffit pour cela de fournir le xpath vers les différents titres de colonnes, ainsi que les titres associés à des identifiants. Ceux-ci peuvent alors être réutilisés dans ItemElement pour sélectionner cette cellule et la traiter dans les filtres suivants.

Le navigateur (ou Browser) est dans Weboob une classe pour faciliter l'écriture de modules. Comme son nom l'indique, il est là pour contenir les fonctions habituelles d'un navigateur Web, évitant au module de devoir gérer les requêtes de bas niveau.

Browser1 est le navigateur historique, basé sur mechanize, et ajoutant des fonctionnalités propres à Weboob. Malheureusement, il est apparu au cours du temps que mechanize avait de nombreuses limitations, et que son architecture rendait certaines choses (comme la gestion des formulaires) très laborieuses.

Browser2 est le nom de code pour le remplacement de ce navigateur. C'est un projet qui dure depuis quelques versions de Weboob, mais est arrivé cette fois dans la branche de développement. Il est cette fois basé sur requests. Cette bibliothèque est plus bas niveau que mechanize, et de nombreuses fonctions sont donc cette fois directement intégrées dans Weboob. Et ça permet de simplifier beaucoup de choses.

Romain a déjà beaucoup écrit sur Browser2, mais je complète par mon opinion. J'ai récrit quelques modules avec, et on peut dire que c'est vraiment de grand changements. En effet, non seulement Browser2 est plus simple, mais l'ajout de fonctions pour simplifier l'extraction de données dans les pages est un vrai plaisir. Cela aurait certes pu être découplé de Browser2, mais le changement de navigateur était une bonne occasion pour remettre les choses à plat et profiter de l'expérience accumulée en écriture de modules.

J'aime donc beaucoup les filtres, un ensemble d'outils pour extraire les données d'une page Web. Ils sont construits d'une manière qui me rappelle un peu la programmation fonctionnelle, on applique des compositions de fonctions pour arriver au résultat désiré. Prenons l'exemple du module pour Poivy. Le code ressemble maintenant à ça :


class HistoryPage(LoggedPage, HTMLPage):
    @method
    class get_calls(ListElement):
        item_xpath = '//table/tbody/tr'
        class item(ItemElement):
            klass = Detail
            obj_datetime = Date(CleanText('td[1] | td[2]'))
            obj_price = CleanDecimal('td[7]', replace_dots=False, default=0)
            obj_currency = u'EUR'
            obj_label = Format(u"%s from %s to %s - %s",
                               CleanText('td[3]'), CleanText('td[4]'),
                               CleanText('td[5]'), CleanText('td[6]'))

Avec ce code, on itère automagiquement sur toutes les lignes de l'historique de la page. On signale par l'héritage de LoggedPage que l'on est certain que le login a réussi si on atteint cette page. Il est inutile de créer et de renvoyer l'objet Detail à chaque itération, la ligne klass suffit Et on parse vraiment très facilement les éléments. On transforme ainsi la septième colonne des lignes du tableau en décimal, c'est le prix de la ligne. On spécifie de ne pas remplacer les points (souvent utilisés comme séparateur pour les milliers en France), et le default=0 est une option magique pour dire que si ce n'est pas un décimal, c'est gratuit (cas des appels inclus dans le forfait). Il fallait autrement vérifier à la main le contenu et gérer si nécessaire les exceptions.

Les fonctions DateTime, Time et Date sont également assez magiques, transformant du texte pas toujours bien ordonné en un objet correspondant python. Par rapport au code précédent, c'est une division par deux du nombre de lignes. Et par beaucoup plus de la lisibilité. Les filtres définis sont très nombreux, permettant l'utilisation d'expression rationnelle, de formater des chaînes, de récupérer très facilement les attributs d'une balise html, etc. Comme ils se combinent, on applique ce dont on a besoin en une seule fois.
Il y a beaucoup d'autres fonctionnalités magie dans Browser2, dont notamment la pagination. Je n'avais jamais ajouté la pagination de l'historique au module poivy, car la pagination n'était pas toujours très pratique sur l'ancien navigateur. À présent, c'est fait en quelques lignes. En ajoutant à la classe get_calls ces quelques lignes :


    next_page = Link("//div[@class='date-navigator center']/span/a[contains(text(), 'Previous')]",
                     default=None)

On va donc chercher le lien vers la page suivante, et on rend un objet Link s'il faut itérer, None si on ne trouve rien. Le navigateur se charge ensuite d'aller sur les pages au fur et à mesure si c'est nécessaire.

En bilan chiffré, la partie navigateur et extraction des données du module Poivy est passé de 125 à 85 lignes (sans copyright, commentaires et lignes vides). En gagnant au passage à la fois en fonctionnalité et en lisibilité du code. Browser2 est vraiment une étape importante pour la simplicité des modules Weboob.

 
 
 
 

Avant

class IndexPage(BasePage):
    def iter_videos(self):
        span_list = self.parser.select(self.document.getroot(), 'span#miniatura')
        for span in span_list:
            a = self.parser.select(span, 'a', 1)
            url = a.attrib['href']
            _id = re.sub(r'/videos/(.+)\.html', r'', url)

            video = YoujizzVideo(_id)

            video.thumbnail = BaseImage(span.find('.//img').attrib['data-original'])
            video.thumbnail.url = video.thumbnail.id

            title_el = self.parser.select(span, 'span#title1', 1)
            video.title = to_unicode(title_el.text.strip())

            time_span = self.parser.select(span, 'span.thumbtime span', 1)
            time_txt = time_span.text.strip().replace(';', ':')
            hours, minutes, seconds = 0, 0, 0
            if ':' in time_txt:
                t = time_txt.split(':')
                t.reverse()
                seconds = int(t[0])
                minutes = int(t[1])
                if len(t) == 3:
                    hours = int(t[2])
            elif time_txt != 'N/A':
                raise BrokenPageError('Unable to parse the video duration: %s' % time_txt)

            video.duration = datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds)

            yield video

Après

class IndexPage(HTMLPage):
    @method
    class iter_videos(ListElement):
        item_xpath = '//span[@id="miniatura"]'
        next_page = Link(u'//a[text()="Next »"]')

        class item(ItemElement):
            klass = BaseVideo

            obj_id = Regexp(Link('.//a'), r'/videos/(.+)\.html')
            obj_title = CleanText('.//span[@id="title1"]')
            obj_duration = Duration(CleanText('.//span[@class="thumbtime"]//span'), default=NotAvailable)
            obj_nsfw = True

            def obj_thumbnail(self):
                thumbnail = BaseImage(Attr('.//img', 'data-original')(self))
                thumbnail.url = thumbnail.id
                return thumbnail

Browser2

Lire les commentaires

Cet article fait partie d'une série sur le Browser2.

Le parsing des pages est un élément important de weboob car il s'agit du cœur de la problématique à laquelle répond le logiciel, mais aussi la partie la plus sensible et la plus complexe car c'est ici que l'on a affaire aux webmasters incompétents.

Ainsi qu'on l'a vu dans un un post précédent, à chaque url est associée une classe dérivée de BasePage qui est instanciée et qui traite la page pour en sortir des données structurées.

L'ancien régime

Voici à quoi ressemble l'implémentation d'une BasePage avec le browser actuel :

class IndexPage(BasePage):
    def iter_videos(self):
        span_list = self.parser.select(self.document.getroot(), 'span#miniatura')
        for span in span_list:
            a = self.parser.select(span, 'a', 1)
            url = a.attrib['href']
            _id = re.sub(r'/videos/(.+)\.html', r'\1', url)

            video = YoujizzVideo(_id)

            video.thumbnail = BaseImage(span.find('.//img').attrib['data-original'])
            video.thumbnail.url = video.thumbnail.id

            title_el = self.parser.select(span, 'span#title1', 1)
            video.title = to_unicode(title_el.text.strip())

            time_span = self.parser.select(span, 'span.thumbtime span', 1)
            time_txt = time_span.text.strip().replace(';', ':')
            hours, minutes, seconds = 0, 0, 0
            if ':' in time_txt:
                t = time_txt.split(':')
                t.reverse()
                seconds = int(t[0])
                minutes = int(t[1])
                if len(t) == 3:
                    hours = int(t[2])
            elif time_txt != 'N/A':
                raise BrokenPageError('Unable to parse the video duration: %s' % time_txt)

            video.duration = datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds)

            yield video

La révolution

class IndexPage(HTMLPage):
    @method
    class iter_videos(ListElement):
        item_xpath = '//span[@id="miniatura"]'

        next_page = Link(u'//a[text()="Next »"]')

        class item(ItemElement):
            klass = BaseVideo

            obj_id = Regexp(Link('.//a'), r'/videos/(.+)\.html')
            obj_title = CleanText('.//span[@id="title1"]')
            obj_duration = Duration(CleanText('.//span[@class="thumbtime"]//span'), default=NotAvailable)
            obj_nsfw = True

            def obj_thumbnail(self):
                thumbnail = BaseImage(Attr('.//img', 'data-original')(self))
                thumbnail.url = thumbnail.id
                return thumbnail

On le voit facilement, outre la diminution du nombre de lignes, c'est vraiment beaucoup plus lisible. Ceci s'explique par le fait que si la première implémentation est très procédurale, le nouveau style introduit et permis par le browser2 se veut descriptif.

Certes, il y a beaucoup de magie. Je me propose d'expliquer et de détailler chaque partie afin d'en comprendre les concepts.

HTMLPage

class IndexPage(HTMLPage):

La classe dont hérite IndexPage est HTMLPage. En effet, maintenant ce n'est plus au niveau du browser que s'effectue la désérialisation du document, mais au niveau de la page elle-même, ce qui est plus logique. On aura donc également JSonPage, CSVPage, etc.

ListElement

@method
class iter_videos(ListElement):

Une classe majeure qui a été introduite est ListElement. Elle est censée permettre, grâce à ses attributs, d'automatiser la découverte et l'itération de membres d'une liste dans la page. Le principe est que coder doit rester l'exception, parser les pages doit au maximum être du paramétrage.

Puisqu'on appelle iter_videos comme une méthode à partir du browser, le décorateur @method a été rajouté afin que ce soit fait de façon transparente et analogue à la première implémentation.

L'attribut obligatoire pour ListElement est item_xpath :

item_xpath = '//span[@id="miniatura"]'

On y précise la chaîne xpath qui sera utilisée pour itérer sur les éléments.

next_page = Link(u'//a[text()="Next »"]')

Cet attribut est utile pour traiter la pagination. On verra dans un prochain article comment cela fonctionne.

ItemElement

class item(ItemElement):

Il s'agit de la classe assurant le parsing d'un item de la liste, en instanciant un objet hérité de CapBaseObject et remplissant ses champs.

klass = BaseVideo

Le concept est le suivant : on définit quelle classe on utilise, et pour chaque champ, on crée un attribut obj_<NAME> qui peut être soit un filtre, soit une constante, soit une méthode retournant la valeur.

Un filtre est un objet dont on appelle la méthode __call__ sur l'item et qui a la particularité de pouvoir être chainé avec un ou plusieurs autres filtres.

Le browser2 propose un certain nombre de filtres par défaut, qui sont utilisés dans notre exemple. Le développeur du module peut également définir ses propres filtres.

obj_id = Regexp(Link('.//a'), r'/videos/(.+)\.html')

On utilise le filtre Link pour récupérer le lien de la balise dont on a fournit le xpath, puis on chaîne avec le filtre Regexp pour en extraire l'identifiant de la vidéo qui est contenu dans l'url.

obj_title = CleanText('.//span[@id="title1"]')

Le filtre CleanText est utilisé pour récupérer tout le texte contenu dans l'élément sélectionné et ses fils, et le nettoyer (suppression des multiples espaces, des tabulations, etc.)

obj_duration = Duration(CleanText('.//span[@class="thumbtime"]//span'), default=NotAvailable)

On utilise le filtre CleanText pour retourner le texte purgé de l'élément sélectionné, puis le filtre Duration le parse et renvoie un objet datetime.timedelta.

L'argument default précise que si la durée n'a pas pu être récupérée, la valeur NotAvailabe sera prise. Sans cet argument, une exception est lancée.

obj_nsfw = True

Le champ nsfw se verra tout le temps attribuer la constante True.

def obj_thumbnail(self):
    thumbnail = BaseImage(Attr('.//img', 'data-original')(self))
    thumbnail.url = thumbnail.id
    return thumbnail

Ici, obj_thumbnail est une méthode qui est appelée et qui retourne la valeur que l'on souhaite mettre dans le champ thumbnail.

À noter l'utilisation du filtre Attr qui sélectionne une image pour en extraire la valeur de l'attrib data-original.

Liens vers la documentation

Cet article fait partie d'une série sur le Browser2.

Mechanize offre la possibilité de remplir et de soumettre le formulaire d'une page assez facilement, mais souffre de nombreux problèmes. Prenons par exemple ce code issu du module ING :

def login(self, password):
    # ...
    self.browser.select_form('mrc')
    self.browser.set_all_readonly(False)
    self.browser.controls.append(ClientForm.TextControl('text', 'mrc:mrg', {'value': ''}))
    self.browser.controls.append(ClientForm.TextControl('text', 'AJAXREQUEST', {'value': ''}))
    self.browser['AJAXREQUEST'] = '_viewRoot'
    self.browser['mrc:mrldisplayLogin'] = vk.get_string_code(realpasswd)
    self.browser['mrc:mrg'] = 'mrc:mrg'
    self.browser['sens'] = ['1']
    self.browser.submit()

On peut noter les choses suivantes :

  • La sélection se fait par le browser (à partir du nom du formulaire)
  • Ce système est stateful, c'est à dire qu'on sélectionne un formulaire, puis on change des attributs du browser pour définir les valeurs
  • Par défaut, mechanize respecte les contraintes de la page, empêchant par exemple de modifier les champs désactivés ou les <input type="hidden">. Il est nécessaire d'appeler set_all_readyonly(False) pour contourner ça
  • Le parsing des pages est mal foutu, ce qui fait qu'il loupe parfois des champs. On est alors obligé de les rajouter nous-mêmes
  • Lorsque le champ est à valeurs multiples (un <select> par exemple), on doit passer une liste plutôt qu'une chaîne, et il gueule si il n'y a pas de champ <option> ayant cette valeur

Enfin, si le formulaire n'a pas de nom, il n'est possible que de passer un prédicat de ce genre :

self.browser.select_form(predicate=lambda x: x.attrs.get('id','')=='setInfosCGS')

Browser2 à la rescousse

L'approche du nouveau système est un peu différente. On décorrèle les formulaires du browser en rajoutant une méthode get_form() à la page, qui retourne un objet Form sur lequel on peut modifier et rajouter des champs sans restriction. On réécrirait le code ci-dessus comme suit :

def login(self, password):
    # ...
    form = self.get_form(name='mrc')
    form['AJAXREQUEST'] = '_viewRoot'
    form['mrc:mrldisplayLogin'] = vk.get_string_code(realpasswd)
    form['mrc:mrg'] = 'mrc:mrg'
    form['sens'] = '1'
    form.submit()

La méthode get_form accepte également un paramètre xpath qui, comme son nom l'indique, est une chaîne xpath :

form = self.get_form(xpath='//form[@id="setInfosCGS"]')

Liens vers la documentation

Cet article fait partie d'une série sur le Browser2.

Le browser est séparé en deux niveaux : les pages, qui sont représentées chacune par des classes dérivées de BasePage contenant le code nécessaire au parsing du contenu des pages, et le Browser lui-même qui sert de contrôleur pour la navigation.

L'ancien système

Voici ce à quoi ressemble le système de pages de la première version du browser :

class CreditMutuelBrowser(BaseBrowser):
    PROTOCOL = 'https'
    DOMAIN = 'www.creditmutuel.fr'
    PAGES = {'https://www.creditmutuel.fr/.*/fr/banque/situation_financiere.cgi': AccountsPage,
             'https://www.creditmutuel.fr/.*/fr/banque/mouvements.cgi.*': OperationsPage,
             'https://www.creditmutuel.fr/.*/fr/banque/nr/nr_devbooster.aspx.*': OperationsPage,
            }

    def get_accounts_list(self):
        if not self.is_on_page(AccountsPage):
            self.location('https://www.creditmutuel.fr/%s/fr/banque/situation_financiere.cgi' % self.currentSubBank)
        return self.page.get_list()

Un dictionnaire fait la correspondance entre une expression régulière d'url et la classe d'une page (dérivée de BasePage), et lorsque l'on fait un appel à la méthode location() il tente de retrouver la page à instancier en fonction de l'url. On peut donc ainsi savoir sur quelle page on se trouve avec la méthode is_on_page(klass), qui est un alias à isinstance(self.page, klass).

La classe URL

Voici maintenant comment on décrit les pages dans le browser2 :

class CreditMutuelBrowser(PagesBrowser):
    BASEURL = 'https://www.creditmutuel.fr'

    accounts =   URL('/(?P<subbank>.*)/fr/banque/situation_financiere.cgi',
                     AccountsPage)
    operations = URL('/(?P<subbank>.*)/fr/banque/mouvements.cgi.*',
                     '/(?P<subbank>.*)/fr/banque/nr/nr_devbooster.aspx.*',
                     OperationsPage)

Plutôt que d'avoir un dictionnaire, on décrit des attributs à la classe avec associé d'une part une liste de chemins, et d'autre part la classe à instancier. L'attribut BASEURL permet de préciser le chemin plutôt que des urls complètes.

En outre, la résolution se fait maintenant dans l'ordre de déclaration, ce qui est très utile dans le cas de conflits.

Reverse

Vous avez sans doutes constaté le fait que dans nos expressions régulières ont été précisés des noms pour le pattern subbank. Ceci permet d'une part de récupérer les valeurs dans l'instance de BasePage, mais surtout d'utiliser URL comme un moyen d'accéder directement aux pages avec des paramètres variables.

En effet, URL fournit deux méthodes très sympathiques, URL.go() et URL.stay_or_go(), ce qui nous permet de réécrire la méthode get_accounts_list comme ceci :

    def get_accounts_list(self):
        return self.accounts.stay_or_go(subbank=self.currentSubBank).get_accounts()

L'avantage majeur de ce système est donc d'éviter, comme dans l'exemple du browser1, d'avoir une redondance entre les URLs à associer aux BasePage et les appels à location() où l'on doit à nouveau spécifier l'url.

Liens vers la documentation

Weboob existe depuis plus de quatre ans, et est issu de deux projets, aum (2008) et bnporc (2009). Une composante assez importante est le Browser, une classe accompagnée d'un ensemble d'outils simulant le comportement d'un navigateur et aidant au scrapping des sites web.

Toujours présente aujourd'hui dans weboob, elle tire ses racines d'aum et n'a fait qu'évoluer petit à petit, en gardant la retro-compatibilité de l'API. Autant dire que depuis ses six années d'existence, c'est une usine à gaz sans cohérence qui s'est construite.

Un autre soucis majeur du Browser est qu'il dépend de mechanize, une bibliothèque Python rajoutant une surcouche à urllib2, et qui multiplie les inconvénients (API catastrophique, support limité du SSL, quasiment plus maintenu, etc.).

Mais fort de l'expérience en scrapping qui a été acquise par l'équipe depuis toutes ces années, et grâce à l'apparition de python-requests, une bibliothèque capable de remplacer avantageusement mechanize, nous avons décidé de procéder à l'écriture d'un Browser2.

Le projet a été démarré en novembre 2012 par Laurent Bachelier, mais à cette époque requests était encore assez peu mature et l'API évoluait sans cesses. Cela a conduit à mettre de côté les développements.

Mais la semaine dernière, pris d'un sursaut de motivation, j'ai repris en main le projet afin de supporter la version 2.0 de requests et de dessiner les nouveaux concepts du Browser2 pour aboutir à une première implémentation qui est maintenant mergée dans le dépôt de développement. Plusieurs modules (Crédit Mutuel, Youjizz et Hybride) ont déjà été portés.

Même si l'API est amenée à évoluer, je me propose de rédiger quelques articles durant les prochaines semaines se focalisant sur les nouveaux concepts introduits par le Browser2, notamment :

Un des paradoxe du projet Weboob, c'est la création de ticket qui passe surtout par l'interface Web du gestionnaire de tickets Redmine. Bien entendu, il existe un module Redmine, bien pratique pour les développeurs. Mais pour les utilisateurs, configurer le module juste pour ouvrir un rapport de bug était un peu compliqué, alors que cela devrait être une action simple.
Cependant, tout était déjà presque là pour faire un système agréable. Nous avons le module capable de créer des tickets, et une application pour utiliser le module. Afin de pouvoir facilement importer/exporter des bugs, cette application a été améliorée dans la branche de développement pour être capable de lire un ticket à partir d'un pipe reçu. Concrètement, un simple cat ticket.txt | boobtracker post weboob suffit à envoyer un ticket. De la même façon, un bug peut-être transformé en format texte.
Améliorons encore l'idée. On veut fournir un service simple pour les utilisateurs afin d'ouvrir un bug. Un moyen standard de transférer du texte, c'est l'email. On peut donc un peu modifier la configuration de postfix pour y ajouter un truc comme ça dans le fichier master.cf
weboobreport     unix -        n       n       -       -       
pipeflags=FR user=toto
argv=/usr/local/bin/boobtracker post weboob

Et hop, à la réception d'un mail, on envoie un ticket sur le gestionnaire de tickets. C'est ainsi que les utilisateurs de Weboob peuvent désormais ouvrir des bugs très simplement en envoyant un mail à nomdumodule@issues.weboob.org. Cela évite également de publier les adresses mails des mainteneurs des paquets lors d'un crash, et évitera de perdre des rapports de bugs envoyés directement aux mainteneurs (qui peuvent avoir délaissés le projet depuis). Cette fonctionnalité sera mise en avant dans la prochaine version publiée.

There are often good-willed people around open-source software that while they do not know programming or the specific technologies used, can greatly help the project.

So, what are we looking for? We do not have any translation support for now, so that is out. However, there are a few things you can already do:

  • Provide new website support ideas. To be helpful, you can provide us with everything you know like available APIs and workarounds, existing tools (Python preferred), etc.
  • Provide better logos. Many logos have been hastily done and could be better; the only requirement is that it has to have a parodic or humorous aspect, for legal reasons. I would consider replacing logos that are vulgar a priority.
  • Write packages for your distribution of choice, or simply lobby them to package Weboob and keep it up to date. Since websites break all the time, old versions can become useless quickly.

The simplest way to do that is to create new issues on our tracker. Accepted contributions will get mentioned, unless of course you do not want to.

Pour différentes raisons, je suis « Release Manager » du projet Weboob. Derrière ce nom pompeux, je suis surtout en charge d'écrire les nouvelles concernant les sorties de versions, notamment sur LinuxFR.

Et depuis quelques versions, je m'inquiète des commentaires et me pose la question de l'utilité même (pour les développeurs) de continuer à venir en parler ici. Tout tourner en rond (anecdote personnelle : j'ai appris la signification du mot "Boob" après avoir contribué la première fois au projet). Pour expliquer un peu mon sentiment sur cette lente évolution, voici un petit historique, avec un petit rapport approximatif Technique/Troll par dépêche.

Version 0.b

Dans les commentaires, on propose des nouveaux modules (voyages-sncf, crédit coopératif), de calculette empêchant l'accès aux sites en Belgique, de localisation des fichiers de configurations (avec les spécifications XGD). En gros ça parle du projet, et ça troll un peu à côté sur l'inclusion dans Debian. Mais les développeurs ont un retour des utilisateurs, des propositions, etc.

Rapport Te/Tr : 0,5

Version 0.d

On saute la version 0.c, qui n'a pas eu le droit à sa dépêche (c'est pourtant la version supportée à long terme, du fait de son inclusion dans Wheezy). Sur cette dépêche, on reparle du crédit coopératif et de sa calculette. On a des retours utilisateurs sur de nombreux modules. Ça parle de mise à jour de paquets. De la sécurité des accès bancaires. Et le troll de Barret Michel prend à peine.

Rapport Te/Tr : 0,8

Version 0.e

Le projet continue son petit chemin, on parle dans les commentaires de munin, de l'export en QIF, de l'installation dans Mageia 3, et d'exécution de JavaScript pour scrapper les sites Web. Les trolls sont absents.

Rapport Te/Tr : 16

Version 0.f

Les commentaires commencent par l'utilité et la pertinence du projet (ou est l'esprit du libre : si quelqu'un code, c'est que ça doit lui servir ?). Quelques retours de bug, une idée de module. J'ai commencé à me poser des questions.

Rapport Te/Tr : 0,2

Version 0.g

Ça parle un peu de paquet (une fois de plus, et c'est probablement justifié). Un développeur qui a fait le même genre d'application qu'une des nouveautés. Un peu de sécurité. Et un méga-troll qui écrase tout le reste. Pierre vient parler du projet avec des vraies questions (merci à lui), mais il aurait pu le faire sur IRC qu'on aurait peut-être gagné du temps.

Rapport Te/Tr : 0,1

Version 0.h

C'est celle de cette semaine. On était pourtant pas vendredi, mais les commentaires commencent par "La nostalgie du Minitel". Puis du "NSFW". La seule (courte) discussion technique et retour utile pour un développeur, c'est pour parler de l'installateur Windows.
En fin de page, on attaque la vie personnelle d'un contributeur. Ça me donne envie de vomir, et pas que dans les bars (et le commentaire reste considéré comme pertinent par les lecteurs).

Rapport Te/Tr : 0,01

Du coup, je me pose la question : la technique disparaît-elle progressivement des préoccupations de la communauté DLFP ? Je n'ai rien contre les trolls, ils seront de toute façon toujours présents. Mais la disparition des discussions intéressantes est de mon point de vue préoccupante. C'est le premier objectif (pour moi) des dépêches LinuxFR, et ce qui fait la qualité du site par rapport à d'autres.

Lire les commentaires

Weboob (Web Outside Of Browsers) est un ensemble d'applications interagissant avec des sites web.

Nouvelle année, nouvelle version de Weboob ! Weboob 0.h irradie le Web depuis jeudi dernier.

Cette version atteint le nombre explosif de 25 contributeurs, totalisant 442 commits. Elle apporte de très nombreux modules (permettant l'interaction avec de nouveaux sites Web), ainsi qu'une nouvelle application permettant de remplir votre calendrier d'évènements culturels. Le très demandé module voyages-sncf est également de la partie.

Pour une vision plus atomique des changements, les nouveautés sont détaillées en seconde partie de la dépêche. Malgré la disparition de deux modules, Weboob atteint désormais le nombre de 148 sites gérés !

Sommaire

Boobcoming

boobcoming est une application dédiée à la recherche et l'export d'évènements (qui peuvent être culturels ou d'une autre nature). La recherche simple permet de trouver des évènements sur des dates précises, une recherche complexe permet d'affiner les résultats si nécessaires.

L'utilisateur peut ensuite exporter les évènements qu'il souhaite en format CalDav, pour l'intégrer dans ses applications habituelles de calendrier. Déjà quatre modules sont disponibles.

Capture d'écran de boobcoming

Transports

Du côté des transports, l'un des site favoris du public de DLFP est désormais géré : voyages-sncf. Le module permet des recherches d'itinéraires, prend en compte les cartes de réductions, etc. Pour profiter de ce module, il faut utiliser l'application traveloob, qui a bénéficié au passage d'un léger lifting.

voyages-sncf

Avec la même application, les habitants du centre de la France peuvent utiliser le module jvmalin pour les calculs d'itinéraires et horaires.

Toujours pour le transport, les modules permettant de récupérer les données de capteurs ont désormais une application dédiée. Parmi ces modules, on trouve notamment jcvelaux (permettant d'accéder à tous les systèmes de vélo en libre service de JCDecaux) et vlille. Cela fait beaucoup de villes, et pas seulement en France. Ces modules étaient demandés depuis très longtemps dans le redmine du projet.

Capture d'écran de boobsize

Plus proche des noyaux

Pour les développeurs d'applications externes, l'utilisation de Weboob en tant que bibliothèque est facilitée par l'introduction d'une nouvelle classe Webnip (Web (in) Non Interactive Programs). Cela évite notamment d'importer toute la gestion des dépôts de modules habituellement présente dans Weboob. La classe Weboob est toujours présente pour ceux qui souhaitent en bénéficier.

Pour les utilisateurs, le moteur de conditions a été complètement réécrit. Ce moteur concerne toutes les applications en console, et permet de mettre des conditions très fines sur les résultats à obtenir. En plus des conditions sur des champs numériques (solde supérieur à 1000€ sur un compte, transactions qui dépassent un certain montant, etc), un nouvel opérateur '|' a été ajouté pour "greper" les champs textuels. Il est également désormais possible de mettre des conditions sur des dates (jour précis, avant une date, après une date).
Les conditions peuvent être combinées grâce aux opérateurs AND et OR, permettant des expressions logiques très complexes. Toutes ces informations sont documentées dans le man de chaque application.

Petites nouvelles

La gestion des modules multimédias a été revue en interne de Weboob. Pour l'utilisateur, cela permet une séparation plus claire entre ce qui ne gère que du son (en utilisant l'application radioob) et ce qui est vidéo (via l'application videoob. Pour le son, de nombreuses radios apparaissent avec les modules Audioaddict, Nectarine et Nihon no Oto. En lecture par morceau, le module Grooveshark permet l'accès à de très nombreux groupes.

Autrement, nous perdons deux modules dans cette nouvelle version. Le site ecrans.fr n'a en effet plus de flux RSS et de site spécifique, et son module disparaît donc. Il peut être cependant remplacé par le nouveau module liberation, en le configurant pour ne prendre que les nouvelles ecrans. Autre site disparu : isohunt.

Cette version est remarquable par son nombre de nouveaux modules. Pour les amateurs de factures, on trouve notamment le module EDF et le module Poivy. Pour la recherche d'emploi, quatre nouveaux modules apparaissent. Le module GitHub permet quand à lui de suivre les bugs de projets. Comme toujours, quelques nouveaux modules bancaires avec Apivie (assurances vie) et Banqueaccord.

Autre nouveauté de cette version, un installateur Windows officiellement distribué. Bien que testés avec succès sur plusieurs ordinateurs, il peut encore contenir des bugs. Le fonctionnement complet de Weboob n'est pas non plus assuré sur cette plateforme, car aucun développeur ne l'utilise en système principal.

Communication

Nous n'avons rien fait pour, mais Weboob était en une du Linux Pratique de septembre/octobre. Si nous aurions probablement pu aider/compléter les informations de l'auteur, l'article est assez fidèle et est probablement à ce jour la meilleure documentation dans la catégorie « Weboob, premiers pas ».

Nous avons également indirectement bénéficié de la couverture médiatique du Personnal Financial Manager intégré à CozyCloud. À l'intérieur, c'est du vrai Weboob qui tourne (et CozyCloud semble permettre d'appeler Weboob via une API Web).

Contributeurs

Merci aux contributeurs qui ont participé à cette version :

  • Alexandre Bonhomme
  • Alexandre Lissy
  • Benjamin Carton
  • Clément Calmels
  • Christophe Gouiran
  • Christophe Lampin
  • Etienne Carriere
  • Florent Fourcot
  • François Revol
  • Hervé Werner
  • Jean-Benoist Leger
  • Jean-Philippe Dutrève
  • Jerem
  • John Morrow
  • Julien Veyssier
  • Laurent Bachelier
  • Mathieu Lordon
  • Pierre Mazière
  • Ryan Nowakowski
  • Roger Philibert
  • Romain Bignon
  • Simon Murail
  • Thomas Lecavelier
  • Vincent A.
  • Vincent Texier

Weboob est un projet qui vit grâce à ses contributeurs. Si vous souhaitez l’améliorer et que vous connaissez le Python, n’hésitez pas à contribuer.

Lire les commentaires

We often get complaints around Weboob‘s name, and the various application names.

There’s no denying they’re childish. What they are not, however, is sexist.

There is “boob” in the main name, and “boob” is a friendly name referring to (mostly female) breasts. We would, for example, avoid using “tits” or “cunt”, because they are often demeaning1. Though it is a happy accident (our earlier ideas like “woob” and “webob” were taken), we certainly like playing with that.

The idea is the same with application names; it’s all about friendly jokes (like wetboobs the weather tool, which manages to be related to weather and boobs).

If you’re offended, just ask yourself “how is it sexist?”.

As it appears, Weboob is a formidable tool to detect people that are part of the “be offended first, think later” crowd. Interestingly, the crusaders2 are to date all male, and often assert that women can’t like jokes about breasts or sex in general3. How fucked up is that?

They will always make a scene4 on how they’re never going to use Weboob because of names. Guys, here’s the thing: we don’t need you and we certainly don’t want you. I for one am glad we created an Asshole Detector, albeit by accident.

  1. We however are mostly not native English speakers. Mistakes can happen.
  2. This is not an euphemism. They act like they are fighting for a good cause, but it’s only pretend.
  3. And who the hell are they to talk in place of others? That is actual sexism.
  4. So that it is abundantly clear, this is purely about making a scene; I do not care about their opinions or how many penises they may have. All our contributors do not and do not have to like the branding.

J'ai remarqué un projet qui parle de weboob dans sa présentation.

Fortunately, I discovered an awesome FOSS project called Weboob (WeB Outside Of Browser) that allows you to scrap data from the web and most importantly from bank websites. What makes it wonderful is that bank connectors are easy to build and are maintained by their community.

I convinced the Cozy team to integrate weboob in the core stack. That's what they did it and I was able to make big progress from there.
Mikolaj Pawlikowski - seeker89

Le projet : Cozy Personal Finance Manager, qu'on raccourcira en cozy-pfm tend à développer un gestionnaire de finance open source à héberger soi même. Cela reprend donc la formule de cozy cloud (après tout, ce sont les mêmes personnes). Soit l'idée d'une application serveur à installer chez soi, open source et avec une interface web.

Pour ceux qui ne connaîtrait pas cozy cloud, c'est assez simple également, c'est une plate-forme en tant que service (Paas). Donc des applications web à installer soi même sur un serveur pour ses propres besoins.

weboob

cozy-cloud
cozy-cloud : démo

cozy-pfm
cozy-pfm : demo
cozy-pfm : le code sur github

Lire les commentaires

Weboob fait la une du magazine Linux Pratique (même si ce n'est pas précisé, c'est bien de ça dont parle l'encart Web). À l'intérieur, 6 pages parlant du logiciel, ainsi qu'une mention dans l'édito.

Hormis une étape bizarre dans la description de l'installation, le contenu est bon. On regrettera cependant que l'auteur n'ait pas pris contact avec les développeurs, on aurait peut-être pu aider (ou au moins ne pas le découvrir par hasard).

Pour cette 14e édition des Rencontres Mondiales du Logiciel Libre, une partie de l'équipe de weboob était présente pour partager autour du projet.

Bilan : deux conférences, programmées exactement au même moment par le plus grand des hasards, ainsi qu'une interview radio.

Radio RMLL

Noé et theo ont été interviewé par Radio RMLL en introduction à leur conférence.

Écouter l'interview

Weboob - Le Web en dehors du navigateur

Weboob (Web Outside Of Browsers) est un ensemble d'applications interagissant avec des sites Web. Seulement deux mois après la dernière dépêche, Weboob 0.f est parue mardi dernier.

C'est une version très riche en nouveautés et dont l'activité de développement a été remarquable. Cette nouvelle version est ainsi constituée de plus de 450 commits, représentant l'ajout de plus de 15 000 lignes dans les sources.

Weboob est maintenant capable de rechercher des recettes de cuisine, d'obtenir des informations sur le monde du cinéma, de télécharger des sous-titres pour des vidéos ainsi que de récupérer des textes de chansons. Les anciennes fonctionnalités ne sont pas oubliées, avec notamment l'ajout de modules pour de nouveaux sites bancaires.

Ces nouveautés seront détaillées en seconde partie de la dépêche. Avec 16 nouveaux sites boobisés, Weboob atteint désormais le nombre de 106 modules !

Sommaire

Recherche de recettes de cuisine

C'est pas moins de trois sites de recettes de cuisines qui sont maintenant accessibles (marmiton, 750g, cuisineaz). Deux applications sont dédiées à cet effet, QCookboob pour la version graphique et Cookboob pour son équivalent en console.

Les deux ont les mêmes fonctionnalités : la recherche, l'affichage d'informations sur la recette (bien entendu la recette, mais aussi les commentaires et les photos qui vont avec), et l'export. Cette dernière fonctionnalité permet pour le moment d'exporter vers le format KRecipesML, importable dans les logiciels Krecipes et gourmet.

En résumé en images, le processus est donc très simple. On lance tout d'abord une recherche :

Recherche avec QCookboob

On sélectionne la recette choisie :

Informations détaillées QCookboob

On l'importe dans Krecipes :

Import dans Krecipes

Cet exemple est typique de la philosophie de Weboob. On agrège les résultats de nombreux sites pour trouver rapidement le meilleur choix, et on utilise ensuite ses logiciels habituels grâce à l'export de donnée dans de multiples formats.

Tout sur le cinéma

Après un bon repas, une activité courante pour briller en société est de tout connaître sur le cinéma. Weboob peut désormais vous aider à devenir imbattable au Time's Up, grâce aux applications QCineoob et cineoob. Ces applications permettent des recherches sur des films, des acteurs, ainsi que des recherches un peu plus complexes (trouver les films en communs de deux acteurs par exemple). Bien entendu, il est possible d'afficher toutes les informations détaillées à propos de ces films et acteurs. Les modules permettant ces recherches sont pour le moment le très populaire imdb et le site français allociné.

Un petit exemple en image :

Star Wars dadns QCineoob

Comme on peut le voir sur la gauche de la capture, d'autres fonctionnalités sont directement intégrées dans l'application. La première est la recherche de sous-titres, nouvelle fonctionnalité de cette version, accessible également via l'application spécialisée suboob. Autre fonctionnalité intégrée, la recherche de torrents correspondant au film (libre), déjà accessible dans les versions précédentes via l'application weboorrents.

En résumé, QCineoob est une application spécialisée qui devrait ravir les amateurs de cinéma. En quelques clics, on peut interagir avec des sites aux fonctionnalités différentes mais étant finalement utilisées très souvent en même temps.

Petites nouvelles

Parmi les nouveaux modules, on peut citer l'accès à de nouvelles banques. Le module Crédit du Nord permet ainsi d'accéder à la banque du même nom, mais aussi à la Banque Courtois, la Banque Kolb et la Banque Tarneaud qui partagent le même moteur de site Web. Ce ne sont pas complètement des banques, mais on peut noter l'ajout des module Paypal et American Express.

Pour les amateurs de Karaoké, l'application booblyrics permet de télécharger les paroles des chansons.

L'application pastoob permettant de poster et de récupérer des fichiers sur des sites comme Pastbin et Paste à la con a été améliorée. On peut notamment désormais choisir l'expiration du fichier.

Du côté du dossier contrib, contenant des scripts évoluant autour de Weboob mais pas assez développés pour être considérés comme des applications, on peut noter l'amélioration de downloadboob. Ce script permet d'automatiser le téléchargement de vidéos, l'exemple typique étant le téléchargement de l'émission Dessous des Cartes toutes les semaines, ou des Guignols de l'info. La configuration a été améliorée, permettant de filtrer sur une expression rationnelle sur l'identifiant d'une vidéo.

Pour les amateurs de graphiques, un script generic-munin est désormais disponible. Il permet de créer un plugin munin pour n'importe quelle valeur numérique obtenue par Weboob (température d'une ville, solde de votre forfait téléphonique, solde de votre compte bancaire, etc).

Enfin, pour l'export de données, un formateur JSON a été ajouté.

L'association

À l'occasion des trois ans du projet, les contributeurs et utilisateurs de Weboob étaient invités au Bouillon Belge le 13 février. Cette soirée fut l'occasion d'organiser l'assemblée constitutive de la naissante Association Weboob, décrite plus en détail sur le Wiki du projet. Suite à cette assemblée, les statuts ont été déposés en préfecture et l'association Weboob a désormais une existence légale.

Pour la petite histoire, nous utilisons Garradin pour le suivi des membres. Que nous n'avons pas encore boobisé

Contributeurs

Merci aux contributeurs qui ont participé à cette version :

  • Cyril Brulebois
  • Fabien Grumelard
  • Florent Fourcot
  • François Revol
  • Goffi
  • ianux
  • Julien Hebert
  • Julien Veyssier
  • Laurent Bachelier
  • Romain Bignon

Weboob est un projet qui vit grâce à ses contributeurs. Si vous souhaitez l’améliorer et que vous connaissez le Python, n’hésitez pas à contribuer.

Nous recherchons également un volontaire ayant des connaissances en paquet et dépôts Debian. Le dépôt Weboob n'est plus à jour, les clefs de signatures sont expirées, et nous n'avons pas forcément les compétences en interne pour le remettre sur pied rapidement. C'est pourtant une demande régulière de nos utilisateurs de pouvoir bénéficier d'un paquet plus récent que la version 0.c présente dans Debian.

Lire les commentaires

From the start, creating a new weboob module was a pain, as you had a lot of repetitive copy-paste-alter tasks to do.
Since I can’t stand anything repetitive, I created a tool to speed up module creation, which was inspired from the now retired tools/gen_comic_reader.sh.

Now, when I see code generation, I usually think something must be wrong. In our case, what we are really doing is filling automatically some fields like author, class name, etc. A lot of web frameworks also do that kind of base code generation with success.

It’s a very simple tool, which provides “recipes”, those recipes being a set of templates. Though you can override them, it tries to guess as much details as possible, like your name and e-mail.

Here is an example session:

$ ./tools/boilerplate.py
usage: boilerplate.py [-h] [-a AUTHOR] [-e EMAIL] {base,comic,comic.test} ...
boilerplate.py: error: too few arguments
 
$ ./tools/boilerplate.py base "foo bar"
Created modules/foobar/__init__.py
Created modules/foobar/backend.py
Created modules/foobar/browser.py
Created modules/foobar/pages.py

The backend.py should look like:

# -*- coding: utf-8 -*-
 
# Copyright(C) 2013      Laurent Bachelier
#
# [...]
 
from weboob.tools.backend import BaseBackend
 
from .browser import FooBarBrowser
 
 
__all__ = ['FooBarBackend']
 
 
class FooBarBackend(BaseBackend):
    NAME = 'foobar'
    DESCRIPTION = u'foobar website'
    MAINTAINER = u'Laurent Bachelier'
    EMAIL = 'laurent@bachelier.name'
    VERSION = '0.f'
 
    BROWSER = FooBarBrowser

You can jump into the code right now!

As of now, there is only a minimal “base” recipe and the two “comic” recipes taken from the previous tool; however as boilerplate.py is intended to be highly extensible and maintainable, I hope it will support more specialized recipes soon (for example, “newspaper” or “pastebin”). You know what to do.

I am now working for Budget Insight.

My work should be mostly Python, and for some part contributions to the weboob project.

Even though I’m not looking at all in that branch, I still get at least an e-mail a week for symfony-related work! I guess this is good for Symfony developers, though.

Weboob (Web Outside Of Browsers) est un ensemble d'applications interagissant avec des sites Web.

Trois mois après la dernière dépêche et peu de temps avant le troisième anniversaire du projet, Weboob 0.e est parue vendredi dernier.

Elle reste sur la lancée de la version précédente avec beaucoup de corrections de bugs et une amélioration des modules existants. On n'oublie pas les nouveautés qui seront détaillées en seconde partie de la dépêche. Avec sept nouveaux sites boobisés, Weboob atteint désormais le nombre de 90 modules !

Sommaire

Nouvelles options pour les applications

Avec l'introduction d'une vérification des certificats SSL dans la dernière version, cette nouvelle option était logique : on peut maintenant désactiver la vérification avec l'option -I. Autre flexibilité, il est possible pour un module de déclarer une liste de certificats, contre un unique choix auparavant (certains sites présentant différents certificats selon des critères difficiles à déterminer).

L'option -e améliore quant à elle le chargement des backends en permettant d'en exclure une liste. Cela évite de trouver par hasard une vidéo du parlement européen en recherchant un programme pour votre soirée.

Modules bancaires

Ils sont une fois de plus à l'honneur, avec l'ajout des modules pour le Crédit Coopératif, Axa Banque, la banque Barclays, la banque Carrefour, Gan Assurances et le Crédit Mutuel du Sud Ouest. C'est maintenant pas moins de 21 sites de banque qui peuvent être accédés grâce à l'application boobank. Autre nouveauté, les modules bancaires peuvent désormais gérer plusieurs monnaies et non plus seulement l'euro.

Pour utiliser toutes ces données, nous avons eu la bonne surprise de découvrir une intégration de Weboob dans le logiciel skrooge. L'équipe Weboob continue elle de proposer un module expérimental pour kmymoney.

Réécriture de l'API pour les sondes

Depuis environ un an, Weboob intégrait une capability de mesure de la hauteur et du débit de fleuves, permettant ce genre de suivis :

http://fourcot.fr/weboob/elbe_dresden-year.png

Cette capability était très spécialisée et a donc été récrite pour être plus générique et gérer tout type de sonde. La gestion des niveaux d'alerte a également été ajouté, ce qui permet d'envisager de gérer des sites comme les alertes au pollen ou le niveau de diverses pollutions.

Petites nouvelles

Une limitation historique sur les lecteurs vidéos a été supprimée, permettant de configurer simplement en indiquant un chemin vers un exécutable. Autre amélioration, on peut désormais passer des options à ce lecteur directement.

Du côté des modules permettant de gérer les factures et abonnements, la date de fin de période pour les abonnements périodiques est maintenant récupérable, permettant de savoir quand la consommation sera remise à zéro. Pour les contrats non-périodiques, la date de validité du crédit est récupérée. Les trois modules d'abonnements téléphoniques ont été mis à jour.

Avenir technique

Le plus grand projet technique de Weboob est probablement la réécriture de la classe Browser. Comme son nom l'indique, cette classe permet de simuler un navigateur et doit simplifier l'écriture de modules, en proposant de nombreux fonctions prêtes à l'emploi. Cet outil reste cependant optionnel, le module CMB, par exemple, ne l'utilise pas.

Actuellement, cette classe est basée sur la bibliothèque Mechanize. À l'usage, cette bibliothèque se relève cependant parfois contraignante, notamment sur la gestion des formulaires ou l'impossibilité de faire proprement du SSL. Nous souhaiterions donc nous en affranchir pour développer de nouvelles fonctionnalités.

C'est pourquoi le projet Browser2 est lancé depuis de nombreux mois. Cette fois-ci, le projet se base sur la bibliothèque Requests qui nous semble prometteuse et plus flexible que Mechanize. Malheureusement, cette bibliothèque ne semble pas toujours pensée pour avoir des utilisateurs sur le long terme. La sortie de la version 1.0 aurait ainsi pu se nommer « Oups, j'ai tout cassé, bon courage ». Sachant la variété de versions de la bibliothèque dans les distributions, il est assez démotivant de tenter de tout réécrire et d'envisager de maintenir toutes les versions pour que Weboob fonctionne partout.

Tout cela explique en partie le retard sur Browser2… Nous envisageons donc pour les prochaines versions de faire une fourchette de Requests, afin de maintenir une version stable correspondant à nos besoins.

Avenir administratif

Weboob grandit et a maintenant des débouchés professionnels. Cela nous impose de réfléchir à un cadre qui n'était pas forcément prévu au départ. C'est pourquoi nous sommes en cours de création d'une association, qui sera chargée de piloter le projet et de protéger la « marque » Weboob, notamment de gérer les sites Internet.

Le site web weboob.org ne changera pas et continuera de présenter le projet, ainsi que la documentation permettant de l'utiliser. En parallèle, le site Web weboob.com va être officiellement lancé et regroupera toutes les entreprises proposant des services autour de Weboob (notamment Budget Insight qui contribue fortement aux modules bancaires de Weboob et propose des services autour de Weboob en plus de l'utiliser en interne).

Avec cette association, le but est de maintenir l'indépendance du projet Weboob sur le long terme et d'éviter tout risque de conflits d'intérêts.

Évènements

Weboob étant un projet communautaire, on peut retrouver ses contributeurs à de nombreux évènements. Nous étions ainsi au 29C3 à Hambourg en fin d'année dernière. On a même pu nous voir à une présentation largement improvisée. Plusieurs d'entre nous serons également en fin de semaine à la FOSDEM, mais nous ne pourrons pas présenter le projet cette fois-ci.

Des soirées entre membres de la communauté sont régulièrement organisées, toujours sur Paris où vivent la plupart des principaux contributeurs. La prochaine sera le 13 février, journée anniversaire du projet. Pour plus d'informations, n'hésitez pas à passer sur le chan IRC #weboob sur le réseau freenode.

Contributeurs

Merci aux contributeurs qui ont participé à cette version :

  • Adrien Kunysz
  • Florent Fourcot
  • Gabriel Kerneis
  • Gilles-Alexandre Quenot
  • Grmbl Frechneu
  • Julien Hebert
  • Kevin Pouget
  • Laurent Bachelier
  • Noé Rubinstein
  • Roger Philibert
  • Romain Bignon
  • Theo
  • Xavier Guerrin

Nous remercions également le contributeur gérant le paquet Weboob pour la distribution Gentoo.

Weboob est un projet qui grossit et qui vit grâce à ses contributeurs. Si vous souhaitez l’améliorer et que vous connaissez le Python, n’hésitez pas à contribuer.

Lire les commentaires

Weboob était présent au 29C3 cette année à Hambourg, en Allemagne, le temps d'un bref lightning talk présenté par Olf, Phlogistique et theo :

Il est souvent évoqué les entreprises comme Facebook, Google, HP, Novell ou Red Hat qui contribuent au libre, avec plus ou moins de controverse ou de respect des pratiques communautaires. Mais on parle moins souvent des petites sociétés.

Dans cet article nous présenterons le retour d'expérience de trois jeunes start-ups françaises de moins de deux ans, comment elles utilisent des logiciels libres et quelles interactions elles ont avec la communauté.

Note : l'article est écrit collaborativement par trois membres des trois sociétés présentées.

    Sommaire

    Trois start-ups

    Budget Insight

    Budget Insight est une société créée début 2012 qui développe une application web de gestion des comptes bancaires pour les particuliers.

    Outre la centralisation automatisée des comptes, elle catégorise automatiquement les transactions, pour permettre la création de budgets personnalisés, et envoie des alertes sur les grosses transactions ou en risque de découvert. La spécificité de Budget Insight est d'avoir développé un modèle statistique, permettant de détecter les dépenses fixes et variables et, ainsi, d'anticiper l'évolution du solde sur un mois.

    Budget Insight repose sur le logiciel libre weboob.

    Bio Eco Forests

    Bio Eco Forests propose une solution de gestion environnementale optimisée pour la gestion des espaces arborés tant urbains que forestiers. La société a été créée en septembre 2011, il y a un peu plus d'an.

    Cozy Cloud

    Cozy Cloud est un cloud personnel privé, comprendre une plateforme libre & autohébergeable où l'utilisateur stocke toutes ses données et installe ses propres web apps aussi facilement que sur un smartphone. Cozy Cloud vise donc à être aux serveurs ce qu'iOs a été aux smartphones, l'aspect libre en plus.

    Le business modèle de Cozy Cloud étant basé sur l'hébergement de cette solution, Cozy peut rester transparent sur sa manière de faire des gains et établir une relation saine avec ses utilisateurs : « you will stay because you can leave ! » (« vous resterez car vous pouvez partir »).
    Sa force pour l'utilisateur : empowerment et no lock-in (autonomisation et pas de verrouillage).

    Présence du libre dans l'activité

    La totalité des infrastructures internes de Budget Insight et Bio Eco Forests sont gérées par du logiciel libre. Les serveurs sont sous Debian, le gestionnaire de versions est git, le serveur de courriel postfix. Les gestionnaires de projet sont respectivement Chiliproject et Redmine.

    L'application web de Budget Insight, qui elle n'est pas libre, dépend du framework yii via le serveur web Apache2, utilise la base de données MySQL, et donc intègre weboob pour la synchronisation des comptes bancaires.

    L'ERP Tryton est au cœur de la solution proposée par Bio Eco Forests. Les SIG (Systèmes d'Informations Géographiques) QGIS et GRASS viennent compléter la solution.

    Cozy Cloud utilise beaucoup de logiciels libres au quotidien, environnement Ubuntu par défaut, Piwik pour connaitre le nombre de visiteurs, Osqa pour les forums, Newebe pour le réseau social interne, Jenkins pour son intégration continue… Et bien sûr toutes ses stacks techniques sont basées sur des logiciels ouverts (Django, MongoDB, Redis, Railway, CouchDB…).

    Contributeurs actifs

    Budget Insight repose massivement sur weboob, ce qui en fait un contributeur majeur, pour ce qui concerne en tous cas les modules bancaires. La société a en effet rajouté le support pour les banques Banque Populaire, Bred, Caisse d'Épargne et CIC, ainsi que la gestion du débit différé pour d'autres banques.
    De par l'exigence de disponibilité de service, elle maintient également l'ensemble des autres modules bancaires, et est réactive dans la correction des bugs. Son nombre grandissant d'utilisateurs en font une sorte de buildbot géant, faisant de ces modules les plus stables de weboob.

    Bio Eco Forests a intégralement financé et supporte les développements suivants :

    Cozy Cloud publie sa plateforme entièrement sous forme de logiciels libres (licence encore à définir) et fournit toutes les instructions pour l'installer sur son propre serveur.
    À côté de ça, Cozy commence à produire des bibliothèques externes et contribue à certaines.

    Relations avec la communauté

    La société Budget Insight ayant été fondée (entre autres) par le créateur de weboob, il était important d'établir dès le départ le cadre de la collaboration entre les deux entités. C'est ce qui a été fait dans un mail envoyé à l'ensemble des contributeurs, afin notamment de préciser que weboob restera complètement indépendant de Budget Insight et que chaque contribution de la société se doit d'être dans l'intérêt premier du projet libre, en particulier les choix architecturaux qui doivent être soumis à discussion auprès des autres développeurs.

    En outre, la relation entre Budget Insight et les contributeurs est un cercle vertueux, puisque si la société bénéficie librement de la valeur ajoutée que constitue weboob, elle assure l'assurance qualité de tout ce qui concerne la gestion bancaire et y contribue activement. Enfin, elle accorde aux contributeurs du projet des accès premium gratuitement, et pourra prendre à sa charge l'organisation de soirées weboob ou de boobathons.

    Bio Eco Forests était présente aux rencontres des utilisateurs Tryton en 2011 et 2012. Récemment, le droit de commit sur les dépôts Tryton a été proposé à l'un des salariés de la société.

    Cozy Cloud a déjà une petite communauté, constituée principalement par d'anciens stagiaires. D'autre part, des actions récentes ont été entreprises pour faciliter le développement d'applications sur la plateforme. Ce qui a notamment permis à un des early adopters de créer la première application issue d'une contribution extérieure.
    Cozy a également sponsorisé les dernières JDLL et compte aider de la même manière des événements autour du langage Javascript (la plateforme tourne sur NodeJS).

    Difficultés liées au libre

    Outre le service indépendant, Budget Insight cherche à vendre sa solution aux banques en tant que marque blanche pour qu'elles le proposent à leurs clients. Les questions concernant les briques libres utilisées reviennent souvent, les interlocuteurs ayant la perception qu'il s'agit de solutions non professionnelles et non maintenues par des structures sérieuses.

    Heureusement, il est facile de les rassurer en expliquant les parts de marchés du libre en entreprise, les sociétés qui poussent celles-ci, les avantages que nous apporte le libre en opposition au logiciel propriétaire, notamment dans notre indépendance et notre capacité à résoudre les problèmes.
    Néanmoins, il s'agit d'un véritable travail d'éducation à faire, qui se rajoute au travail commercial, face à des établissements peu flexibles et frileux face à l'innovation.

    Le support des types géographiques dans Tryton par Bio Eco Forests a nécessité l'utilisation de la bibliothèque PPyGIS. Plusieurs patchs ont été développés et proposés au développeur PPyGIS, mais même si ils n'ont pas été rejetés ni commentés, ils n'ont pas été appliqués. Un fork doit donc être maintenu : le projet python-dbgis, est hébergé sur le redmine de Bio Eco Forests.

    En outre, bien que développés par une entreprise dont les salariés sont les principaux développeurs Tryton, les patchs ajoutant le support des types géographiques ne sont pas encore intégrés dans les dépôts du projet Tryton. Le projet Tryton étant indépendant de la société ayant réalisé les patchs, cette société ne peut donc garantir l'intégration upstream des développements réalisés.
    La difficulté est ici liée aux coûts de la maintenance du fork et des patchs, coûts qui n'avaient pas été estimés/prévus.

    Pour Cozy Cloud, la principale difficulté aujourd'hui est de choisir sa licence. En effet, même si la plateforme est entièrement libre, il ne faut pas qu'elle impose une licence particulière aux applications déposées dessus et développées par des tiers. De même, cela ne doit pas impacter l'infrastructure d'hébergement qui restera probablement propriétaire. Toutefois, nous souhaitons garder le côté transmission de la GPL pour s'assurer que tout le monde joue le jeu du libre. Tout ça pour dire que, sans avis exterieurs, il serait bien difficile de choisir la licence de Cozy Cloud.

    Conclusion

    Bien que le libre soit au cœur de l'activité de ces trois jeunes sociétés, Budget Insight a fait le choix de ne pas libérer pour l'instant l'application web, de par la sensibilité du secteur d'activité, là où Bio Eco Forest et Cozy Cloud ne produisent que du code libre.

    Cependant, chacune a le libre dans ses gènes et si elles peuvent rencontrer des difficultés qui n'existent pas dans le logiciel propriétaire, elles compensent grâce aux avantages que le logiciel libre leur procure, en jouant le jeu de façon transparente et bénéfique pour la communauté.

    Lire les commentaires

Depuis deux semaines, le site de la banque BNP Paribas se met parfois à s'arrêter brusquement de répondre à une requête HTTPS. Or ceci est bien fâcheux, car bien que weboob impose un timeout de 15 secondes à urllib2, il se trouve qu'en l'occurrence l'appel du module à la méthode urlopen() ne se termine jamais.

Armé de strace, j'ai pu constater que systématiquement il s'agit d'un appel à la fonction système read() qui n'obtient pas de réponse. Un peu plus d'investigation m'a révélé que cela se produit lors du handshake SSL.

Après avoir cherché en vain l'explication dans les sources du wrapper SSL de Python, j'ai trouvé un rapport de bug daté de 2007 et concernant la version 2.6. Il explique que le constructeur de la classe SSLSocket effectue le handshake directement, et ce avant qu'il ne soit possible d'interagir avec la socket pour la rendre non bloquante ou, ce qui m'intéresse davantage, de définir un timeout.

Le patch qui a été proposé et intégré introduit un paramètre do_handshake_on_connect, par défaut à True, ainsi que la méthode do_handshake(). Il s'agit d'une solution bas niveau, qui certes s'harmonise très bien à l'API de la lib SSL de Python qui ne brillait déjà pas par sa qualité.

Or le problème que j'ai avec weboob, est qu'on ne tape évidement pas directement dans ssl, mais qu'on passe par mechanize, qui utilise urllib2, qui utilise httplib, qui utilise ssl (ouf). Et aucune de ces bibliothèques ne supporte ce paramètre.

Malgré le fait que mechanize implémente tous les design patterns baveux existants, rendant son code complètement illisible, il ne semble pas possible de changer aisément le handler HTTPS, chose qui aurait pu permettre de surcharger la classe de httplib pour effectuer moi-même le handshake après avoir désactivé do_handshake_on_connect.

La solution crade que j'ai choisie m'a été inspirée d'un patch tout aussi crade envoyé dans un ticket pour contourner un bug de Debian Wheezy (toujours présent d'ailleurs) qui rend OpenSSL inopérant avec le site de la Banque Postale dès lors que l'on utilise le protocole par défaut (SSLv23).

Le code est le suivant, bien dissimulé au fond de weboob/tools/browser/browser.py :

import ssl

def mywrap_socket(sock, *args, **kwargs):
    kwargs['do_handshake_on_connect'] = False
    kwargs['ssl_version'] = kwargs.get('ssl_version', ssl.PROTOCOL_TLSv1)
    sock = ssl.wrap_socketold(sock, *args, **kwargs)
    sock.settimeout(StandardBrowser.DEFAULT_TIMEOUT)
    # check if we are already connected
    try:
        sock.getpeername()
    except:
        sock.do_handshake_on_connect = True
    else:
        sock.do_handshake()
    return sock

ssl.wrap_socketold=ssl.wrap_socket
ssl.wrap_socket=mywrap_socket

httplib utilise la fonction wrap_socket pour créer la socket SSL. En remplaçant cette méthode, en changeant les arguments et en effectuant le handshake nous-même dans le cas où nous sommes déjà connectés, ça peut enfin fonctionner.

Et dire que nous sommes en 2012.

Weboob — Web Outside Of Browsers — est un ensemble d’applications interagissant avec des sites Web.

Plus de sept mois après la dernière dépêche, Weboob 0.d est parue ce week‐end. Version marquante par sa stabilité, via un nombre incalculable de corrections de bogues, elle apporte aussi son lot de nouveautés, ainsi qu’on le verra en seconde partie de dépêches. Avec 18 modules rajoutés, Weboob en possède maintenant pas moins de 83 !

Sommaire

Modules bancaires

Grâce à la contribution active de la société Budget Insight au projet, de nombreuses améliorations ont été portées aux modules bancaires. Outre cinq nouveaux sites supportés (Banque Populaire, Bred, Caisse d’Épargne, CIC et Fortuneo), Weboob gère les débits différés de la plupart des banques. Les libellés sont maintenant analysés, afin d’extraire le type de transaction et la date d’opération (celle où vous avez sorti votre carte bleue, par exemple, en opposition à la date de débit qui est traditionnellement affichée par les banques). Cela permet également de n’afficher à l’utilisateur que la partie lisible du libellé.

De par la contribution de Budget Insight à Weboob, les modules bancaires atteignent une grande stabilité, et il est à en prévoir de nouveaux pour les mois à venir. En outre, un script a été intégré dans contrib/, report_accounts.sh, qui, lancé dans un cron, permet d’envoyer par courriel un rapport de l’état de ses comptes bancaires.

Traductions

L’application translaboob a été rajoutée. Elle permet d’effectuer des traductions en se basant sur les sites Ebonics, Google Translate ou WordReference.com :

$ translaboob translate fr en "Weboob est un ensemble d'applications interagissant avec des sites Web."
* googletranslate
        Weboob is a set of applications that interact with websites.

Téléchargement automatisé de vidéos

Un script a été rajouté dans contrib/, nommé downloadboob, qui est un gestionnaire de téléchargements automatisé de vidéos selon divers critères.

À lancer dans en tâche périodique via cron, le script prend une configuration ayant la forme suivante :

[main]
directory=~/download/podcasts

[zapping]
backend=canalplus
max_results=10
pattern=zapping
title_exclude=semaine
directory=Le zapping

[guignol]
backend=canalplus
max_results=10
pattern=les guignols de l'info
title_exclude=la semaine
directory=Les guignols de l'info

Dans cet exemple, le script va automatiquement télécharger le Zapping et la Semaine des Guignols de Canal+, chaque fois qu’une nouvelle vidéo est disponible.
Il sera peut‐être à terme intégré parmi les applications officielles de Weboob.

Nolife TV

Beaucoup ont constaté que le site Nolife TV est passé dans une nouvelle version il y a maintenant quelques mois. Une nouvelle mesure de protection avait été mise en place, mais l’équipe de Weboob a pu aisément en arriver à bout, permettant ainsi aux abonnés de la chaîne de pouvoir regarder les contenus, pour lesquels ils payent, sur un système entièrement libre.

Vous trouverez plus d’informations sur le contournement de cette mesure dans ce billet.

Et merci à ianux d’avoir prêté un abonnement Nolife pour la résolution de ce problème.

Debian

Nous en parlions dans la précédente dépêche, l’intégration de Weboob dans Debian s’était transformée en véritable odyssée. Petit rappel des épisodes précédents…

Après avoir été accepté par Debian, puis retiré en février dernier, de longs débats se sont enchaînés entre l’équipe de Weboob et les FTP masters. Refusant la moindre concession sur le nom du paquet, ou sur un éventuel avertissement à propos de soi‐disant contenus pornographiques présents dans Weboob, et avec le soutien de Stefano Zacchiroli, le Debian Project Leader, nous avons réussi à atteindre un compromis où le seul changement fut au sujet de l’application havesex renommée en havedate.

Et c’est le 13 juin que Weboob est enfin rentré définitivement dans Debian, dans sa version 0.c, et est maintenant en train d’attendre (très) patiemment la sortie de Debian Wheezy dans laquelle il sera présent !

Événements

Weboob étant un projet communautaire, de nombreux événements sont organisés. Comme il avait été annoncé, un boobathon a eu lieu le 17 mars dernier, à la Fondation pour le Progrès de l’Homme à Paris, dont l’objectif était de développer un maximum de modules. Malgré une quinzaine de participants, la journée ne fut pas la plus productive qui soit, de part les nombreux trolls qui l’ont ponctuée. L’événement s’est néanmoins achevé par une bonne bière avec des gens sympa.

En outre, pour la première fois, Weboob avait son stand lors des 13e Rencontres Mondiales du Logiciel Libre, du 7 au 12 juillet à Genève. Cet événement a été également l’occasion de donner une conférence sur le projet. Un petit compte‐rendu est disponible.

Enfin, de nombreuses soirées Weboob sont organisées dans des bars parisiens, telles que la prochaine, qui aura lieu le vendredi 2 novembre au Bouillon Belge. N’hésitez pas à passer sur le canal IRC #weboob@freenode, si vous souhaitez y participer.

Contributeurs

Merci aux contributeurs qui ont participé à cette version :

  • Alexandre Flament ;
  • Alexandre Franke ;
  • Arno Renevier ;
  • Benjamin Drieu ;
  • BohwaZ ;
  • Clément Schreiner ;
  • Damien Cassou ;
  • elfangor ;
  • Florent Fourcot ;
  • François Revol ;
  • Gabriel Kerneis ;
  • Gilles‐Alexandre Quenot ;
  • Jean‐Christophe Dubacq ;
  • Johann Broudin ;
  • Laurent Bachelier ;
  • leto ;
  • Luc Didry ;
  • Lucien Loiseau ;
  • Noé Rubinstein ;
  • Pierre Mazière ;
  • Richard Genoud ;
  • Roger Philibert ;
  • theo ;
  • Xavier Guerrin.

Weboob est un projet qui grossit et qui vit grâce à ses contributeurs. Si vous souhaitez l’améliorer et que vous connaissez le Python, n’hésitez pas à contribuer.

Lire les commentaires

Le site Nolife TV permet de visualiser les émissions de la chaîne de télévision du même nom via un player flash. Il existe un module Weboob pour se passer de logiciel propriétaire, mais comme on va le voir, ils ont mis en place un mécanisme afin d'empêcher le contournement. En vain.

Première version

Fin 2011 je suis tombé sur ce post de leur forum, qui inclus cette mention :

Merci de ne pas intégrer la lecture des vidéos de Nolife Online dans votre client NoAir sans passer par l'interface web de Nolife Online. De façon générale, ne développez pas de lecteur accédant directement aux vidéos de Nolife Online sans notre accord.

Y voyant une provocation au libriste que je suis, et bien que n'étant pas intéressé par les émissions de cette chaîne, je me suis mis en tête de pondre un module weboob. À des fins de recherche, évidemment.

L'analyse du site m'a permis de constater que le player flash faisait deux requêtes à /_newplayer/api/api_player.php :

skey=9fJhXtl%5D%7CFR%3FN%7D%5B%3A%5Fd%22%5F&connect=1&a=US

Celle-ci effectue un connect=1 pour s'annoncer, je ne sais pas trop pourquoi.

skey=9fJhXtl%5D%7CFR%3FN%7D%5B%3A%5Fd%22%5F&a=UEM%7CSEM&quality=0&id%5Fnlshow=1234

Cette requête renvoie entre autres l'URL du fichier vidéo. On constate dans les paramètres le champ id_nlshow qui contient l'ID de la vidéo. Rien de bien compliqué, donc, mis à part cette skey dont je n'arrivais pas à déterminer l'origine.

Après diverses recherches, j'ai fini par comprendre qu'il s'agissait d'une constante. Un peu déçu de ne pas y avoir pensé alors que c'est une « protection » commune, et sans comprendre comme d'habitude l'intérêt de faire ça, j'avais atteint une version fonctionnelle de mon module et savourais ma première victoire.

Seconde version

Il y a quelques mois, une nouvelle version du site de Nolife TV a été mise en ligne, cassant sans ménagement le module de weboob. N'ayant alors pas le courage de me replonger sur le code d'un module que je n'utilise pas, j'ai laissé les choses trainer… jusqu'à aujourd'hui.

Je n'ai pas été déçu du voyage. Après avoir corrigé l'authentification, la recherche et autres trivialités, je me suis alors penché sur la récupération de l'URL des vidéos.

Le player effectue maintenant non pas deux mais trois appels à /_nlfplayer/api/api_player.php :

skey=1b6cf46e6e484e03b370f528441357fd&a=MD5&timestamp=1351359574

Renvoie des paramètres qui ne semblent pas être utilisés par la suite, probablement l'équivalent du connect=1 de la précédente version.

a=EML&skey=893873357e374594eb6fac475846574b&id%5Fnlshow=30833&timestamp=1351359576

Récupère quelques méta-informations sur la vidéo.

quality=0&a=UEM%7CSEM%7CMEM%7CCH%7CSWQ&skey=005f9ae80d77db93b557cc14c404aa76&id%5Fnlshow=30833&timestamp=1351359579

Enfin, le graal, l'URL de la vidéo.

Facile me diriez-vous ? Ce n'est sans compter un petit détail : le paramètre skey change d'un appel à l'autre. On constate également la présence du paramètre timestamp, ce qui laisse immédiatement penser que la clef est calculée à partir de lui. Mais de quelle manière ?

C'est probablement un checksum MD5, et il y a fort à parier qu'une clef privée est utilisée comme salt. Et pour la retrouver, ça risque d'être coton.

Je me suis alors penché sur divers outils pour tenter d'analyser le player flash. swftools, flasm ou flare n'en sont pas venu à bout. J'ai juste été capable de décompresser le .swf, mais aucune information dans ce qui restait un binaire ne m'ont donné la solution.

C'est alors que je suis tombé sur ce site qui m'a sorti ce fichier parfaitement lisible.

On y découvre les lignes suivantes :

public function nl_dataloader(){
    this.loaded_data = new Object();
    super();
    salt = chaine([97, 53, 51, 98, 101, 49, 56, 53, 51, 55, 55, 48, 102, 48, 101, 98, 101, 48, 51, 49, 49, 100, 54, 57, 57, 51, 99, 55, 98, 99, 98, 101]);
}
public static function addKey(_arg1:URLVariables):URLVariables{
    _arg1.timestamp = new Date().time;
    _arg1.skey = getKey(_arg1.timestamp);
    return (_arg1);
}
public static function getKey(_arg1):String{
    return (MD5.encrypt((MD5.encrypt(String(_arg1)) + salt)));
}

À partir de là, la solution est évidente. Transposé en python dans le module weboob, ça donne le code suivant :

SALT = 'a53be1853770f0ebe0311d6993c7bcbe'
def genkey(self):
    timestamp = str(int(time.time()))
    skey = md5(md5(timestamp).hexdigest() + self.SALT).hexdigest()
    return skey, timestamp

Et ça marche. Le module NolifeTV fonctionne de nouveau. Le commit complet pour régler le problème est visible ici.

Conclusion

Comme toujours, les mesures de protection que tentent de mettre en place les sites de streaming video se contournent très facilement. Il n'est plus à démontrer que les seules personnes que ça emmerde, ce sont les utilisateurs honnêtes qui ne peuvent pas regarder leur contenu payant sur la plateforme de leur choix, ni de les voir offline.

Jusqu'alors, un problème dans la sécurité de Weboob est qu'il ne vérifie pas la validité du certificat envoyé par le serveur lorsqu'on établie une connexion SSL. Ceci est dû à l'utilisation de mechanize, la bibliothèque qui simule le comportement d'un navigateur, et qui n'offre pas de tel mécanisme.

L'écriture par Laurent du Browser 2 se passant de mechanize pour le remplacer astucieusement par requests devrait résoudre ce problème proprement dans une prochaine version de Weboob. Malheureusement, ce nouveau browser n'étant pas encore terminé, une solution alternative et provisoire a été proposée par Florent.

Comme mechanize a une gestion opaque du SSL (du fait des multiples couches le séparant de la bibliothèque openssl, et de la médiocrité du code), l'idée est d'établir une première connexion en utilisant directement openssl et de valider le certificat à partir du fingerprint préalablement renseigné dans le module, avant de poursuivre le déroulement normal via mechanize.

Cette mesure de protection peut facilement être contournée, puisqu'il suffit à l'attaquant, dans le cas d'un Man-in-the-middle, de relayer la première connexion, et de s'interposer pour les suivantes qui elles ne seront pas vérifiées par mechanize.

Néanmoins, ce mécanisme temporaire est efficace dans la plupart des cas.

Pour les développeurs de modules, il suffit de renseigner au BaseBrowser l'attribut de classe CERTHASH contenant le SHA-256 de la chaîne de certificats du serveur :

class BNPorc(BaseBrowser):
    DOMAIN = 'www.secure.bnpparibas.net'
    PROTOCOL = 'https'
    CERTHASH = '5511f0ff19c982b6351c17b901bfa7419f075edb13f2df41e446248beb7866bb'

Une autre façon de faire est d'appeler directement la méthode StandardBrowser.lowsslcheck :

browser.lowsslcheck('www.secure.bnpparibas.net', '5511f0ff19c982b6351c17b901bfa7419f075edb13f2df41e446248beb7866bb')

Afin de calculer ce fingerprint, vous pouvez aisément procéder de la manière suivante :

$ python
Python 2.7.3rc2 (default, Apr 22 2012, 22:30:17)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> from hashlib import sha256
>>> domain = 'www.secure.bnpparibas.net'
>>> sha256(ssl.get_server_certificate((domain,  443))).hexdigest()
'5511f0ff19c982b6351c17b901bfa7419f075edb13f2df41e446248beb7866bb'

Bien évidement, il vaut mieux être certain de ne pas soi-même être victime d'une attaque à ce moment là, car aucune vérification n'est effectuée.

Il ne s'agit que d'une mesure temporaire, en attendant mieux dans le Browser 2.

Dans l'utilisation quotidienne de Weboob, il peut parfois devenir lassant de taper des commandes, qui sont relativement longues. Quelques exemples, taper "subscriptions" dans boobill, "transfer" dans boobank, "forecasts" dans wetboobs. Bien sur on peut activer l'auto-complétion, mais ça reste relativement peu optimal.

Suite à des discussions sur IRC, une nouvelle méthode pour réduire la longueur des commandes a été ajoutée. Le principe est de ne taper que les premières lettres de la commande, comme peut le permettre la commande "ip" (une ou deux lettres sont habituellement suffisantes pour supprimer les ambiguïtés). Si plusieurs solutions existent, une erreur est renvoyée à l'utilisateur avec une liste de suggestions de commandes possibles commençant par le préfixe indiqué.

Du coup, on peut maintenant faire des choses comme :

$ boobill su
* (0177-XXXXXX@nettokom) 0177-XXXXXX - 27,33 € - 14.06.2013 - Einheitstarif
* (06XXXXXXXX@freemobile) 06XXXXXXXX - Forfait 60mn/60SMS à 2 euros

$ wetboobs fore dresde
* Aujourd'hui:    (27C - 27C) Nuit claire
* Mardi 24:       (29C - 29C) Soleil
* Mercredi 25:    (30C - 30C) Soleil
* Jeudi 26:       (23C - 23C) Soleil

$ boobill d
Unknown command: "d"
Do you mean: download, details?

Comme les alias peuvent changer lors d'ajouts de fonctions aux applications, il n'est pas recommandé de les utiliser dans les scripts. Mais au quotidien, ça permet d'utiliser plus rapidement Weboob.

Cela va d'ailleurs dans le même sens qu'une autre optimisation, cette fois-ci dans boobill uniquement, qui permet de ne pas taper l'identifiant de compte dans les commandes usuelles si le compte est unique. On peut ainsi taper :

$ boobill de

Plutôt que :

$ boobill details 0177-XYGHZF@nettokom

Cette année se sont déroulées les Rencontres Mondiales du Logiciel Libre à Genève.

Pour la première fois, Weboob avait son stand, conjointement à celui de Salut à Toi, ce qui permit non seulement de faire connaître le projet à de nombreuses personnes et d'avoir moult conversations intéressantes, mais aussi et surtout d'avoir un lieu pour poser mes fesses.

Comme il y a deux ans, j'ai donné une conférence au sujet de Weboob. Bien que je l'ai très peu préparée et qu'il y avait moins de monde que la dernière fois, ça s'est plutôt bien passé.

Sont disponibles la vidéo et les slides.

Enfin, concernant Genève même, tout est effectivement très cher, il n'y a pas particulièrement de spécialités culinaires, ce qui fait que j'ai mangé italien, chinois, français… Quant au critère discriminant pour moi, à savoir la bière, il faut savoir qu'il est juste impossible de trouver autre chose que de la pisse.

Sommaire

Le prix de l'essence suit depuis plusieurs années une progression incertaine qui tend à la hausse. Les raisons sont multiples : la main-mise de l'Iran sur les puits de pétrole, la guerre en Irak, la crise, les 35 heures ou la mort de Steve Jobs.

Quoi qu'il en soit, la victime directe se trouve être le consommateur qui a besoin de ce précieux méat pour alimenter son tracteur afin d'aller travailler plus pour gagner plus chaque jour, et ce en raison des prix des logements à la hausse au centre du monde que constitue la ville de Paris et qui oblige les français à s'installer en province où il n'y a pas de travail, faisant exploser le chômage.

En attendant la TIPP flottante promise par le favori des sondages présidentiels, et le blocage des prix de l'essence qui a fait pleurer notre président de la République, je vous propose de suivre ses recommandations et de faire jouer la concurrence.

Comment ?

Le gouvernement français a mis à disposition des pollueurs un site web permettant d'avoir accès, pour chaque département, aux prix au litre par carburant pour toutes les stations services recensées, permettant d'effectuer une comparaison et d'aller s'approvisionner chez le moins profiteur.

Or, comme vous le savez tous, le web c'est le mal et ce site est lourd à utiliser.

Heureusement pour vous, Weboob a la solution.

Comparoob

Paru hier dans sa version 0.c, Weboob dispose d'une nouvelle application, comparoob, dont l'objectif est d'interagir avec les comparateurs de prix en ligne, et un module prixcarburants a vu le jour.

Au lancement de l'application, vous serrez invité à rajouter le backend prixcarburants qui nécessite comme paramètre votre numéro de département :

$ comparoob
Warning: there is currently no configured backend for comparoob
Do you want to configure backends? (Y/n): y

Available modules:
1) [ ] prixcarburants    French governement website to compare fuel prices
a) --all--               install all backends
q) --stop--

Select a backend to create (q to stop): 1

Configuration of backend prixcarburants
[zipcode] Zipcode: 75
Backend "prixcarburants" successfully added.

Vous pouvez dès lors utiliser la commande prices pour comparer les prix liés à un produit. Par exemple, si je souhaite voir le prix du SP95 :

comparoob> prices SP95
* (1) 1.570€ - Total (Paris 12) (prixcarburants)
* (2) 1.600€ - Total (Paris 17) (prixcarburants)
* (3) 1.600€ - Total (Paris 19) (prixcarburants)
* (4) 1.640€ - Elan (Paris 14) (prixcarburants)
* (5) 1.669€ - Carrefour (Paris 16) (prixcarburants)
* (6) 1.699€ - Agip (Paris 19) (prixcarburants)
* (7) 1.702€ - Total (Paris 15) (prixcarburants)
* (8) 1.740€ - Total (Paris 18) (prixcarburants)
* (9) 1.743€ - Agip (Paris 16) (prixcarburants)
* (10) 1.750€ - Avia (Paris 15) (prixcarburants)

Les résultats sont triés par ordre croissants. Par défaut, seuls les 10 stations services les moins chères sont affichées, mais cela se change aisément via la commande count.

Les différentes valeurs possibles sont :

  • E10
  • E85
  • Gazole
  • GPL
  • SP95

Pour avoir l'information sur une station service, vous pouvez utiliser la commande info :

comparoob> info 1
Total (Paris 12)
ID: 2.75012002@prixcarburants
Product: SP95
Cost: 1.570€

Shop:
        Name: Total
        Location: Paris 12

        **RELAIS PARIS REUILLY**
        **Total**
        32 Rue de Reuilly

        75012 Paris

        **Horaires :**
        Ouvert de 06h00 à 22h00

        **Service(s) proposé(s) : **
        Boutique alimentaire, Boutique non alimentaire, Vente de gaz domestique,
        Carburant qualité supérieure, Station de gonflage, Lavage multi-programmes,
        Baie de service auto, Piste poids lourds

Vous pouvez profiter de l'étonnante souplesse de Weboob pour sortir en une commande la liste de tous les tarifs d'un carburant particulier :

$ comparoob prices Gazole -n -1

Intégration Debian

J'en profite pour donner quelques news sur l'intégration de Weboob à Debian. Comme le savent les lecteurs assidus de DLFP, nous vivons une véritable odyssée (pour ne pas employer le terme de cabale) quant à son acceptation par les ftpmasters allemands de la distribution communautariste, et ce depuis plusieurs mois.

Nous devrions être arrivés aujourd'hui à un terrain d'entente. Après avoir renommé havesex en havedate, divers échanges ont eu lieu et le lobby boobiste n'a cédé sur aucun point, à raison puisqu'il semblerait que Weboob sera malgré tout accepté dès qu'il viendra à l'idée des ftpmasters de flusher la queue de la centaine de paquets en attente dans NEW.

La suite au prochain épisode.

Lire les commentaires

Qui me fréquente un peu a déjà entendu parler d'un logiciel nommé Weboob, pour Web Out Of Browser. Il est donc naturel d'en parler un jour ou l'autre sur ce blog.

Concrètement, ce logiciel permet d'aller chercher des informations sur des sites Web sans utiliser un navigateur traditionnel. Dans un monde idéal, Weboob n'existerait pas et les données seraient facilement exportables sur tout site Web. Ce n'est cependant que rarement le cas, et Weboob a l'ambitieuse mission de pallier aux carences des sites Web. Cela le rend forcément très riche, car le Web regorge de fonctionnalités... Par une petite suite de billets (probablement deux, ou trois, selon l'humeur) je vais présenter tout ce dont je me sers au quotidien (dans un ordre historique d'utilisation), et ce qui me fait gagner un temps relativement important tous les jours.

Relevés de compte

C'est par boobank que j'ai commencé à utiliser (et contribuer à) Weboob. L'application permet d'aller chercher le solde de ses comptes, l'historique des opérations, les opérations à venir, et même d'exporter les données pour l'intégration à un logiciel de comptabilité. J'étais très demandeur de cette fonctionnalité pour les banques françaises, qui contrairement aux banques allemandes forcent la connexion à leur site bourré de publicités plutôt que de permettre un simple export par des protocoles bien connus. Concrètement, avec le clavier virtuel, le changement régulier obligatoire de mots de passe, le site plutôt lent, je passais un temps fou à suivre mes comptes sur la BNP. Alors qu'en deux clics c'était fait pour la Deutsche Bank.

J'ai donc été bluffé quand j'ai utilisé pour la première fois Weboob et le module de la BNP. En une commande dans le terminal je pouvais enfin vérifier que je n'étais pas dans le rouge. Ça m'a tellement plu que j'ai contribué pour la première fois aux alentours d'août 2010 avec quelques patchs pour la BNP.

Depuis, boobank n'a fait que s'améliorer. L'application permet notamment de faire des virements de compte à compte et l'export en .qif. C'est toujours plus long que de passer par aqbanking à la mode allemande, mais le bénéfice est plus qu'appréciable. Autre chose que j'ai pu apprécier lors de mon changement de banque, c'est l'agrégation des données de toutes les banques configurées. J'avais à ce moment là deux banques, et je pouvais suivre le solde des deux au même endroit.

En cerise sur le gâteau, un script existe pour faire des graphiques des comptes à travers munin. Complètement inutile, donc parfaitement indispensable.

En conclusion, Boobank est l'archétype de « Weboob ne devrait pas exister ». Si les banques françaises arrêtaient de se moquer de leurs clients en forçant des accès à travers leur site Web ou des applications spéciales pour Smartphone (et je ne parle même des options payantes à des prix scandaleux pour recevoir des « alertes »), Boobank disparaîtrait immédiatement. Des solutions existent, comme les banques allemandes le prouvent.

Surveillance de l'Elbe

Vivre à Dresde, c'est vivre dans une ville au niveau du fleuve bien changeant. Ce n'est heureusement pas souvent comme en 2002, mais les variations peuvent tout de même être spectaculaires. Je ne suis pas ultra fan du site officiel (notamment car il ne publie pas un réel historique des données), et j'avais donc programmé un petit module Weboob pour suivre cette évolution, et faire des jolis graphiques comme celui-ci :

elbooc_dresden-year.png

(des observateurs un peu curieux pourront détecter une anomalie en décembre, mon serveur étant en panne...).

J'ai longtemps gardé dans mon coin ce module, qui était vraiment peu configurable et écrit (trop) rapidement pour mes besoins spécifiques. J'ai cependant fini par le proposer dans Weboob, et il est présent depuis la version 0.b dans la version officielle et utilisable à travers Wetboobs. Pour savoir le niveau de l'Elbe (ou de tout autre cours d'eau en Saxe), une commande très simple est maintenant disponible :

$ wetboobs gauges Elbe

On peut aussi aller chercher l'historique d'une sonde, ou bien juste la dernière valeur connue. Bien entendu, si je l'ai fait pour la Saxe, on peut imaginer écrire le même module pour la France entière via Vigicrue. Et coupler Weboob à un petit script pour recevoir un mail en cas d'alerte de crue, c'est assez simple. Le tout en attendant que les autorités publiques allemandes et françaises commencent à publier des Données ouvertes.

La suite

Dans un autre billet... Avec notamment la récupération des articles de journaux, le téléchargement de vidéos, et bien d'autres trucs.

Une contrainte qui avait été relevée par les utilisateurs relative au nouveau système de dépôts, est la possibilité d'être informé lorsque les modules sont mis à jour, notamment pour des problèmes de sécurité.

C'est à cette problématique que j'ai répondu en créant un flux RSS actualisé au moment où sont poussées les nouvelles versions de modules, et contenant les dernières mises à jour accompagnées des messages de commits liés.

Afin d'en profiter, abonnez-vous à l'un de ces deux liens, suivant la version de Weboob que vous utilisez :

Un problème majeur que l'on rencontre avec Weboob, est l'évolutivité imprévisible des sites web supportés, qui peuvent casser un module si celui-ci n'est pas suffisamment tolérant, ou si le changement est trop conséquent.

Pour réduire le désagrément de l'utilisateur qui ne peut plus utiliser les fonctionnalités qui améliorent sa vie au quotidien, il convient d'être réactif sur trois points :

La détection du bug

Ce premier point est effectué soit par le buildbot (via ses tests journaliers et post-commits), soit par l'utilisateur qui va sagement produire un rapport de bug. Une idée d'amélioration permettant l'envoi automatisé d'un bugreport contenant toutes les informations nécessaires sera l'objet d'un futur billet.

L'écriture d'un correctif

Chaque module est en principe maintenu par une personne qui l'utilise au quotidien. Malheureusement, il arrive que des modules voient leur mainteneur disparaître sans donner de nouvelles. Il est toujours possible pour un membre de la Core Team dévoué et chômeur d'intervenir rapidement sur un de ces modules, mais ce n'est malheureusement pas toujours possible, notamment en ce qui concerne les modules supportant des sites bancaires.

La diffusion du correctif

Ce point est celui qui va retenir notre attention aujourd'hui.

Jusqu'alors, les modules étant distribués directement avec les sources de Weboob, il convenait de sortir une nouvelle version de l'ensemble du logiciel pour diffuser le moindre correctif.

Pour l'utilisateur, il convenait par simplicité d'utiliser les dépôts Debian de Weboob pour bénéficier du système APT afin de mettre aisément à jour les modules. Pour une installation depuis les sources (sans passer par git), c'est plus contraignant.

C'est pourquoi il a été décidé de développer un système de dépôts Weboob (inspiré de celui de tucan) pour distribuer les modules et de gérer leurs mises à jour.

Les dépôts

Concrètement, lorsqu'on installe Weboob, seuls le core et les tools sont présents sur le système.

Dès que l'utilisateur cherche à ajouter un backend, si le module correspondant n'est pas installé, l'application s'occupe d'aller le chercher sur les dépôts, puis l'installe dans son ~/.weboob/.

Pour mettre à jour les modules, l'utilisateur se contentera de taper la commande suivante :

$ weboob-config update

Ça va chercher sur les dépôts si de nouvelles versions des modules installés sont présentes, et si oui les installe.

Ce n'est pas plus compliqué que ça pour l'utilisateur, qui se contente de mettre à jour de temps en temps, ou lorsqu'il rencontre un problème avec un module, pour vérifier si un correctif n'est pas déjà mis à disposition.

Architecture

Un dépôt est un répertoire servi par HTTP qui contient un fichier modules.list, ainsi que, pour chaque module, un .tar.gz (le module lui-même) et un .png (son icône).

Il existe un dépôt pour chaque version de Weboob, avec plusieurs déclinaisons : main et nsfw.

Côté client, chaque utilisateur possède un fichier ~/.weboob/sources.list contenant les liens vers les dépôts.
Par défaut, il contient :

# List of Weboob repositories
#
# The entries below override the entries above (with
# backends of the same name).

http://updates.weboob.org/%(version)s/main/
# To enable NSFW backends, uncomment the following line:
#http://updates.weboob.org/%(version)s/nsfw/

# DEVELOPMENT
# If you want to hack on Weboob backends, you may add a reference
# to sources, for example:
#file:///home/rom1/src/weboob/modules/

Un éditeur externe peut donc créer son propre dépôt sur lequel il distribue ses propres modules Weboob.

L'outil weboob-repos permet de gérer un dépôt. Lorsqu'un module est mis à jour, sa version (sous forme AAAAMMJJHHMM) est incrémentée.

Développement

Afin de développer des modules sans avoir à les uploader sur un véritable dépôt pour les tester, il est possible de référencer des pseudo-dépôts locaux.

Pour ce faire, il suffit de spécifier le chemin vers le répertoire contenant les modules de cette manière :

file:///path/to/modules/

Après un weboob-config update, les modules qui s'y trouvent sont utilisables directement.

Contrairement aux dépôts distants, les modules des dépôts locaux n'ont pas à être installés. Ils sont chargés directement depuis le répertoire indiqué dans le sources.list.

Conclusion

Ce mode de distribution des modules permet de pousser des mises à jour de modules immédiatement pour tous les utilisateurs d'une version donnée. Pour tester, il vous suffit d'installer la version git, et de lancer une update pour installer tous les modules référencés dans votre fichier ~/.weboob/backends.

La prochaine étape devrait être de sécuriser le téléchargement de ces modules, en utilisant un système basé sur GPG pour signer les tarballs.

Les applications consoles de Weboob fournissent tout un tas d'options et de paramètres qui peuvent paraître complexes ou superflues pour les utilisateurs qui ont eu l'audace de lire la sortie de --help, mais elles apportent quand même la possibilité d'étendre les usages de Weboob.

Je pense que je vais écrire de courts billets fréquemment pour évoquer des astuces d'utilisation de Weboob qui ne sautent pas aux yeux immédiatement mais qui peuvent se révéler fort utiles.

Aujourd'hui, nous allons voir comment télécharger toutes les vidéos résultant d'une recherche faite avec videoob :

$ videoob search lol -s url \
          --no-keys -f multiline | wget -i-

Si on regarde de plus près :

  • search lol: la commande de recherche et le pattern voulu
  • -s url: dans la sortie, on ne veut que le champ 'url' de chaque vidéo
  • -f multiline: le formateur par défaut (très joli et tout) n'est pas celui que l'on veut, on prend multiline qui affiche un champ par ligne
  • --no-keys: on indique que l'on ne veut pas afficher la clef du champ, mais uniquement la valeur
  • | wget -i-: on pipe à wget en lui indiquant de lire les URLs dans l'entrée standard

On aurait également pu utiliser les options -b ou -n pour sélection un backend particulier ou limiter le nombre de résultats (par défaut à 10), ou même rajouter un ou deux filtres sur les résultats avec le paramètre -c.

À comparer avec une solution ruby :

videoob search lol|ruby -ne 'lambda{|a|puts a if a}[$_.scan(/\* \((.+?)\)/).flatten]'|xargs -I@ videoob download @

Ce matin j'ai effectué un changement au système de browser que je voulais faire depuis un moment et qui est de séparer la classe BaseBrowser en deux.

Nous trouvons donc maintenant deux classes :

  • BaseBrowser, dont le fonctionnement reste inchangé et qui a pour objectif d'être dérivée, afin de gérer toutes les interactions possibles que l'on peut avoir avec le site web, et dont les rouages internes doivent être opaques pour l'utilisateur de l'objet.
  • StandardBrowser, qui se veut être utilisable telle quelle, comme le mechanize.Browser, avec la gestion des proxy, cookies, parsers, exceptions, et autres helpers.

J'ai donc cherché à l'utiliser dans le backend OuiFM qui était cassé, et ça donne ceci. On constate que ça va être très pratique dans l'écriture de backends concis que Noé réclame de pouvoir faire depuis longtemps.

Boobank, l'application de gestion des comptes bancaires de Weboob, est une des plus anciennes, car directement issue d'un script que j'avais développé pour le site de la BNP et qui existait avant Weboob. C'est aussi je pense l'une des applications qui a le plus de potentiel, car elle touche à un élément moteur de la vie quotidienne — l'argent — et qu'elle permet de répondre fortement au vide laissé par le fossé qu'il y a entre les sites web des banques et les besoins des utilisateurs.

En plus de permettre la visualiser de ses comptes et des opérations, et d'effectuer des transferts, ce potentiel de boobank est dans le traitement des données ainsi exportées, et des ordres que l'on pourrait automatiquement programmer. C'est de là qu'est venue dans un premier temps le plugin boobank pour Munin, permettant de grapher l'évoluer de ses comptes bancaires dans le temps :

Mais une idée plus intéressante est une application qui permettrait de mettre en relation non seulement les backends de banque, mais également ceux de messages, afin d'avoir un démon qui monitor ses comptes bancaires automatiquement et qui est capable, suivant des règles pré-établies, d'envoyer des alertes (via ces backends ICapMessagesPost), voire de prendre lui-même une décision.

L'exemple d'un fichier de configuration type de cette application boobank-monitor permet de mettre en avant les possibilités :

[main]
interval = 3600
email = weboob@example.org

[alert:MAIL]
type = mail
address = weboob@example.org

[alert:SMS]
type = message
to = 0623456789@sms
message = Attention mon gars, il ne reste que %(CHEQUE.balance)s neuros sur ton compte chèque et %(LIVRET_A.balance)s sur ton livret A.

[alert:DLFP]
type = message
to = T@dlfp
title = Donnez pour Tuxfamily
message = Bonjour, nal.
 Le compte de Tuxfamily est dans le rouge, envoyez les brouzoufs

[account:CHEQUE]
id = 1234567891234567@bnporc

[account:LIVRET_A]
id = 4567891234567892@bnporc

[account:LIVRET_JEUNE]
id = 9876543219876543@bnporc

[rule:Ctoomuch]
if = CHEQUE.balance > 1500
1 = transfer, CHEQUE, LIVRET_A, LIVRET_A.balance - 1500
2 = alert, MAIL

[rule:Cnotenough]
if = EMPTY_CHEQUE and LIVRET_A_ENOUGH_MONEY
1 = transfer, LIVRET_A, CHEQUE, 500
2 = alert, MAIL
3 = alert, SMS

[rule:Cwtf]
if = EMPTY_CHEQUE or not LIVRET_A_ENOUGH_MONEY
1 = ACTION_PANIC

[condition:EMPTY_CHEQUE]
if = CHEQUE.balance  500

[action:ACTION_PANIC]
1 = alert, MAIL
2 = alert, SMS
3 = alert, DLFP

C'est ce chantier qu'il me semble important de mettre en œuvre car la demande est importante. Rien que le fait de n'avoir commité que très récemment le support du format QIF (et encore, il faudrait supporter cette merde d'OFX) et qui a pourtant été apprécié, montre qu'il y a une attente qu'on ne devrait pas aussi tarder à combler.

Dans le but de consolider les équipes du projet Weboob, j'ai mis en place le Planet Weboob.

Le but sera de permettre à chaque contributeur du projet de publier des articles relatifs à son travail sur tel ou tel backend, les astuces utilisées pour boobiser un site, explication de difficultés rencontrées, etc.

La langue retenue pour le moment est le français. En effet, même si Weboob est un projet qui se veut international, la majorité des contributeurs et des sites supportés sont français, aussi même en maîtrisant l'anglais écrit, il est plus aisé de rédiger de longs textes lyriques dans sa langue natale.
Si par la suite cela s'avère nécessaire, on pourra changer.

Les développeurs de Weboob qui souhaitent donc pouvoir bénéficier de cette tribune peuvent m'envoyer par mail un flux RSS correspondant à une catégorie de leur blog qui ne comportera que des articles relatifs à Weboob. Le but de ce planet n'est pas de réunir les histoires de vacances ou les péripéties sexuelles des gens qui gravitent autour du projet, mais bel et bien des articles consacrés à celui-ci.