Depuis quelques jours, le site https://particuliers.secure.lcl.fr du crédit Lyonnais a mis en place un login avec un tableau de chiffres que l’on doit cliquer, qui sont répartis de façon aléatoire.
Exemple 1:

Exemple 2:

Si on examine attentivement les deux images avec Gimp (par exemple) on remarquera que non seulement les chiffres ne sont pas placés au même endroit, mais qu’en plus leurs position par rapport aux fond bleu peuvent varier (dans cet exemple : 1 pixel en hauteur).
Comme j’aime les défis et aussi le web scraping et que je me met au langage de programmation python, je me suis décidé à me lancer dans l’aventure.
Ma première idée : sikuli permet de faire ce genre de chose, mais cela est contraignant : on doit avoir un navigateur ouvert sur la page et de plus la souris est réquisitionnée le temps de l’opération. Donc, non cette solution ne me convenait pas.
J’ai donc cherché des pistes pour faire du template matching à la manière de sikuli, mais cette fois en scriptant.
Avec les modules python PyQt4 et webkit, il est possible de piloter un navigateur avec accès au DOM, javascript, cookies, user-agent… Et on peut choisir d’afficher ou non la fenêtre du navigateur. (pour faire simple, on code son navigateur à sa sauce, et on implémente ce dont on a besoin).
Après de nombreuses recherches sur le web, j’ai trouvé le module spynner qui permet de faire cela de façon relativement facile.
Reste la partie image-processing, j’ai pour cela choisit l’excellent module PIL associé à numpy pour gérer des tableaux multidimensionnels.
Voici mon process :
- on se rend sur la page de login
- on crée un screenshot de la page
- on découpe le screenshot pour ne garder que le tableau vu en exemple
- on passe tous les pixels non blancs en noir pour simplifier la recherche de motifs
- on compare les petites images des numéros (crées avec Gimp) avec le tableau pour chaque numéro du code personnel
- si ça match, on récupère les abscisses et ordonnées et on lance le code javascript ad-hoc
- on valide (submit)
A présent, nous sommes logués, et le code devient plus traditionnel : recherches XPath, manipulation du DOM…
Cela représente un travail d’une dizaine de jours (pas à temps complet) ce qui a permis de m’inculquer quelque peu la syntaxe de python et de découvrir de belles possibilités de manipulation d’images, ce qui m’était inconnu jusqu’à lors.
Ce script est librement téléchargeable et largement commenté.
Ce script n’a pour le moment pas été testé avec un autre compte que le miens, merci de me remonter si ça fonctionne ou non pour vous et vos éventuels message d’erreurs, merci.
Install sous ubuntu :
sudo easy-install spynner
sudo apt-get install python-qt4
wget http://www.sputnick-area.net/scripts/LCL-dl-QIF/LCL-dl-QIF_current.tar.bz2
tar xjf LCL-dl-QIF_current.tar.bz2
cd LCL-dl-QIF
chmod +x LCL-dl-QIF.py
./LCL-dl-QIF.py
Joli travail..
Si j’avais un peu de temps, je tenterais le porter le principe vers ma banque (pas LCL)..
PS: il y a le .swp dans le .tar.bz2
@Uggy,
Merci !
Pour le .swp, il a été retiré.
Regarde du coté de weboob ( http://weboob.org/ ), il me semble que ça existait déjà…
@jigso,
Ma première release date du 28 octobre, j’ai contacté la team weboob le 29 octobre, ils ont depuis créé des patchs dès le 30 octobre. Avant cela, le clavier virtuel n’était pas encore implémenté.
C’est moi qui a inspiré le premier backend LCL (en Perl à l’époque), voir les 3 derniers posts de dlfp.
salut sput
bonjour j’ai pas saisi a quoi serre ton script python …
Je suis tomber la en cherchant un moyen de me connecter a lcl automatiquement via xdotool et un script bash … Voila si tu as une idée
d’ailleurs j’ai une erreur sur ton script
Traceback (most recent call last):File "LCL-dl-QIF.py", line 192, in
).format('0', j)
ValueError: zero length field name in format
@n3o51
Ce script sert à récupérer les mouvements de comptes dans un format standard.
Pour te connecter à LCL automatiquement en mode « human readable », tu peux installer weboob, l’avantage c’est que ya plus de monde sur ce projet que le miens
Il faut configurer ton compte boobank, puis
boobank -q history -n 500@lcl
boobank -q ls @lcl