From 3ec1cac9e30bd1a3960cec75670a742208f0500d Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Tue, 14 Jan 2014 10:40:15 +0100 Subject: [PATCH] support dispobank --- modules/bred/backend.py | 5 ++++- modules/bred/browser.py | 35 +++++++++++++++++++++++------------ modules/bred/pages.py | 11 +++++++++-- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/modules/bred/backend.py b/modules/bred/backend.py index bfd43478..b17f78fe 100644 --- a/modules/bred/backend.py +++ b/modules/bred/backend.py @@ -38,12 +38,15 @@ class BredBackend(BaseBackend, ICapBank): LICENSE = 'AGPLv3+' CONFIG = BackendConfig(ValueBackendPassword('login', label='Identifiant', masked=False), ValueBackendPassword('password', label='Mot de passe'), + Value('website', label="Site d'accès", default='bred', + choices={'bred': 'BRED', 'dispobank': 'DispoBank'}), Value('accnum', label='Account number to force (optional)', default='', masked=False) ) BROWSER = BredBrowser def create_default_browser(self): - return self.create_browser(self.config['accnum'].get(), + return self.create_browser(self.config['website'].get(), + self.config['accnum'].get(), self.config['login'].get(), self.config['password'].get()) diff --git a/modules/bred/browser.py b/modules/bred/browser.py index deaf3e1b..92a5eccf 100644 --- a/modules/bred/browser.py +++ b/modules/bred/browser.py @@ -31,18 +31,29 @@ __all__ = ['BredBrowser'] class BredBrowser(BaseBrowser): PROTOCOL = 'https' DOMAIN = 'www.bred.fr' - CERTHASH = '375f1fed165d34aacaaf71674ab14ca6c1b38404cf748278714fde3c58385ff0' + CERTHASH = ['375f1fed165d34aacaaf71674ab14ca6c1b38404cf748278714fde3c58385ff0', '0853a056453b56aea6a29085ef3f3721b18db2052aa8e84220720d44e0eb22af'] ENCODING = 'iso-8859-15' - PAGES = {'https://www.bred.fr/mylittleform.*': LoginPage, - 'https://www.bred.fr/Andromede/MainAuth.*': LoginResultPage, - 'https://www.bred.fr/Andromede/Main': AccountsPage, - 'https://www.bred.fr/Andromede/Ecriture': TransactionsPage, - 'https://www.bred.fr/Andromede/applications/index.jsp': EmptyPage, - 'https://www.bred.fr/': EmptyPage, + PAGES = {'https://www.\w+.fr/mylittleform.*': LoginPage, + 'https://www.\w+.fr/Andromede/MainAuth.*': LoginResultPage, + 'https://www.\w+.fr/Andromede/Main': AccountsPage, + 'https://www.\w+.fr/Andromede/Ecriture': TransactionsPage, + 'https://www.\w+.fr/Andromede/applications/index.jsp': EmptyPage, + 'https://www.bred.fr/': EmptyPage, + 'https://www.dispobank.fr/?': LoginPage, } - def __init__(self, accnum, *args, **kwargs): + URLS = {'bred': {'home': 'https://www.bred.fr/Andromede/Main', + 'login': 'https://www.bred.fr/mylittleform?type=1', + }, + 'dispobank': {'home': 'https://www.dispobank.fr', + 'login': 'https://www.dispobank.fr', + } + } + + def __init__(self, website, accnum, *args, **kwargs): self.accnum = accnum.zfill(11) + self.DOMAIN = 'www.%s.fr' % website + self.website = website BaseBrowser.__init__(self, *args, **kwargs) def is_logged(self): @@ -52,14 +63,14 @@ class BredBrowser(BaseBrowser): if not self.is_logged(): self.login() else: - self.location('https://www.bred.fr/Andromede/Main') + self.location(self.URLS[self.website]['home']) def login(self): assert isinstance(self.username, basestring) assert isinstance(self.password, basestring) if not self.is_on_page(LoginPage): - self.location('https://www.bred.fr/mylittleform?type=1', no_login=True) + self.location(self.URLS[self.website]['login'], no_login=True) self.page.login(self.username, self.password) @@ -74,7 +85,7 @@ class BredBrowser(BaseBrowser): def get_accounts_list(self): if not self.is_on_page(AccountsPage): - self.location('https://www.bred.fr/Andromede/Main') + self.location('https://www.%s.fr/Andromede/Main' % self.website) return self.page.get_list() def get_account(self, id): @@ -99,7 +110,7 @@ class BredBrowser(BaseBrowser): 'monnaie': 'EUR', 'index_hist': 4 } - self.location('https://www.bred.fr/Andromede/Ecriture', urllib.urlencode(data)) + self.location('https://www.%s.fr/Andromede/Ecriture' % self.website, urllib.urlencode(data)) assert self.is_on_page(TransactionsPage) return self.page.get_history(is_coming) diff --git a/modules/bred/pages.py b/modules/bred/pages.py index 82897e76..da0193c8 100644 --- a/modules/bred/pages.py +++ b/modules/bred/pages.py @@ -19,6 +19,9 @@ from mechanize import FormNotFoundError +from weboob.tools.mech import ClientForm +ControlNotFoundError = ClientForm.ControlNotFoundError + from decimal import Decimal, InvalidOperation import re @@ -35,8 +38,12 @@ __all__ = ['LoginPage', 'LoginResultPage', 'AccountsPage', 'TransactionsPage', ' class LoginPage(BasePage): def login(self, login, passwd): self.browser.select_form(name='authen') - self.browser['id'] = login.encode(self.browser.ENCODING) - self.browser['pass'] = passwd.encode(self.browser.ENCODING) + try: + self.browser['id'] = login.encode(self.browser.ENCODING) + self.browser['pass'] = passwd.encode(self.browser.ENCODING) + except ControlNotFoundError: + self.browser.controls.append(ClientForm.TextControl('text', 'id', {'value': login.encode(self.browser.ENCODING)})) + self.browser.controls.append(ClientForm.TextControl('text', 'pass', {'value': passwd.encode(self.browser.ENCODING)})) self.browser.submit(nologin=True)