Bonjour à tous,
Je vous présente mon premier vrai script python.
Il permet de récupérer des informations sur ses comptes Credit Agricole (pour le moment, simplement le solde des comptes, mais on peut faire mieux), sans passer par le site (que je trouve assez mal foutu).
Comme je l'ai dit, je suis un grand débutant en python (meme pas une semaine a mon actif), donc le script est largement perfectible. D'autre part, j'attends d'éventuels commentaires qui pourraient m'aider à parfaire ma syntaxe balubutiante.
Sans plus attendre, voila
le fichier zip (
edit: lien mort. Voir la fin du post).
Ou alors le code:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from urllib import urlencode
import urllib2
import re
import cookielib
class HackCA():
"Récupère des informations concernant un compte Credit Agricole"
def __init__(self,sCompte,sCode):
#Les paramètres pour l'initialisation dont le numero du compte utilisé pour s'authentifier,
# ainsi que le code secret à 6 chiffres
self.sCompte,self.sCode = sCompte,sCode
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
urllib2.install_opener(self.opener)
self.sUrlForm='https://www.cr867-comete-g2-enligne.credit-agricole.fr/stb/entreeBam'
def getPageLogin(self):
#Retourne le code source complet de la page d'authentification
dcPostData={'TOP_ORIGINE':'V','vitrine':'0','largeur_ecran':'800','hauteur_ecran':'600','origine':'vitrine','situationTravail':'BANQUAIRE','canal':'WEB','typeAuthentification':'CLIC_ALLER','urlOrigine':'http://www.ca-norddefrance.fr'}
dcPostData=urlencode(dcPostData)
req=urllib2.Request(self.sUrlForm,dcPostData)
fHandle=urllib2.urlopen(req) #TODO: une gestion d'erreurs
sLoginPageSource=fHandle.read()
fHandle.close()
return sLoginPageSource
def getUniqId(self,sPageSource):
#La page contenant le formulaire d'uthentification contient un identifiant unique
#Cet identifiant doit etre passé dans les paramètres POST
#Cette méthode retourne cet identifiant
rxUniqId=re.compile('name="idUnique" value="([^"]+)"')
return rxUniqId.search(sPageSource).group(1)
def getCodeTranslation(self,sPageSource):
#Le site utilise un système de pavé numerique, sur lequel les chiffres sont placés aléatoirement.
#Quand on clique sur un chiffre, le systeme enregistre la "position" du clic, pas le chiffre cliqué.
#Cette méthode retourne donc une "traduction" du code secret en termes de positions sur le pavé numerique
rxRandomPositions=re.compile('<td class="case" onClick="clicPosition\\(\'(\\d{2})\'\\)".+? (\\d) ',re.DOTALL)
lTranslation=rxRandomPositions.findall(sPageSource)
def tupleKey(t):
return t[1]
lTranslation.sort(key=tupleKey)
return ','.join([lTranslation[int(i)][0] for i in self.sCode])
def getPageLogged(self,sPageSource):
#Retourne le code source de la page d'accueil, une fois loggé.
#Cette page contient entre autres le solde des comptes.
sUniqId=self.getUniqId(sPageSource)
sTranslatedCode=self.getCodeTranslation(sPageSource)
dcPostData={'origine':'vitrine','situationTravail':'BANQUAIRE','canal':'WEB','typeAuthentification':'CLIC_RETOUR','idUnique': sUniqId ,'CCCRYC': sTranslatedCode ,'CCPTE': self.sCompte,'CCCRYC2':'000000'}
dcPostData=urlencode(dcPostData)
req=urllib2.Request(self.sUrlForm,dcPostData)
fHandle=urllib2.urlopen(req) #TODO: une gestion d'erreurs
sPageSource=fHandle.read()
fHandle.close()
return sPageSource
def getBalance(self,sPageSource):
#Cette méthode retourne une liste contenant les soldes des différents comptes
rxMoney=re.compile('class="montant3">\\s*([0-9 ]+,\\d{2})')
lAccountBalances=rxMoney.findall(sPageSource)
rxNonDigit=re.compile(' ')
def fnGenerator(rxp):
return lambda x:rxp.sub('',x)
return map(fnGenerator(rxNonDigit),lAccountBalances)
#exemple basique d'utilisation:
if __name__ == '__main__':
sCompte = raw_input('Votre numéro de compte :')
sCode = raw_input('Votre code secret :')
myCA=HackCA(sCompte,sCode)
sPage=myCA.getPageLogin()
sPage=myCA.getPageLogged(sPage)
print myCA.getBalance(sPage)
Bien entendu, ce code est librement utilisable/modifiable par quiconque.
Bonne journée 🙂
[edit du 6dec]Ajout de la saisie utilisateur du numéro de compte/mot de passe au lieu d'etre en dur dans le fichier.
[edit 2 ans plus tard 🙂 ]Le code est désormais hébergé sur github a cette adresse:
http://github.com/bmispelon/pyCA.