mardi 25 mars 2014

Un nouveau navigateur dans Weboob

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.

jeudi 20 février 2014

Rapports de bugs tout simplement avec Weboob

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.

mardi 3 septembre 2013

Weboob dans Linux Pratique

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).

lundi 23 juillet 2012

Raccourcir les commandes sur Weboob

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

jeudi 26 avril 2012

Weboob, ou comment se passer de navigateur Web (1/2)

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.