From fe6d99c51abfb6b3d47e038a4dc7de07b4363556 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Wed, 7 Aug 2013 10:57:23 +0200 Subject: [PATCH] bred: ability to select accounts --- modules/bred/backend.py | 10 +++++++--- modules/bred/browser.py | 4 ++++ modules/bred/pages.py | 22 +++++++++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/modules/bred/backend.py b/modules/bred/backend.py index eabafdd1..c6a7271e 100644 --- a/modules/bred/backend.py +++ b/modules/bred/backend.py @@ -21,7 +21,7 @@ from weboob.capabilities.bank import ICapBank, AccountNotFound from weboob.tools.backend import BaseBackend, BackendConfig -from weboob.tools.value import ValueBackendPassword +from weboob.tools.value import ValueBackendPassword, Value from .browser import BredBrowser @@ -37,11 +37,15 @@ class BredBackend(BaseBackend, ICapBank): DESCRIPTION = u'BRED French bank website' LICENSE = 'AGPLv3+' CONFIG = BackendConfig(ValueBackendPassword('login', label='Account ID', masked=False), - ValueBackendPassword('password', label='Password of account')) + ValueBackendPassword('password', label='Password of account'), + Value('accnum', label='Account number to force (optional)', default='', masked=False) + ) BROWSER = BredBrowser def create_default_browser(self): - return self.create_browser(self.config['login'].get(), self.config['password'].get()) + return self.create_browser(self.config['accnum'].get(), + self.config['login'].get(), + self.config['password'].get()) def iter_accounts(self): with self.browser: diff --git a/modules/bred/browser.py b/modules/bred/browser.py index 0646c0c6..deaf3e1b 100644 --- a/modules/bred/browser.py +++ b/modules/bred/browser.py @@ -41,6 +41,10 @@ class BredBrowser(BaseBrowser): 'https://www.bred.fr/': EmptyPage, } + def __init__(self, accnum, *args, **kwargs): + self.accnum = accnum.zfill(11) + BaseBrowser.__init__(self, *args, **kwargs) + def is_logged(self): return self.page is not None and not self.is_on_page(LoginPage) diff --git a/modules/bred/pages.py b/modules/bred/pages.py index 7b7049ae..b8d1d741 100644 --- a/modules/bred/pages.py +++ b/modules/bred/pages.py @@ -55,7 +55,27 @@ class LoginResultPage(BasePage): pass else: self.browser.set_all_readonly(False) - self.browser['typeCompte'] = 'P' + accounts = {} + for tr in self.document.getroot().cssselect('table.compteTable tbody tr'): + attr = tr.xpath('.//a')[0].attrib.get('onclick', '') + m = re.search("value = '(\w+)';checkAndSubmit\('\w+','(\w+)','(\w+)'\)", attr) + if m: + typeCompte = m.group(1) + tagName = m.group(2) + value = self.document.xpath('//input[@id="%s%s"]' % (m.group(2), m.group(3)))[0].attrib['value'] + accounts[value] = (typeCompte, tagName) + + try: + typeCompte, tagName = accounts[self.browser.accnum] + value = self.browser.accnum + except KeyError: + if self.browser.accnum != '00000000000': + self.logger.warning(u'Unable to find account "%s". Available ones: %s' % (self.browser.accnum, ', '.join(accounts.keys()))) + elif len(accounts) > 1: + self.logger.warning('There are several accounts, please use "accnum" backend parameter to force the one to use') + value, (typeCompte, tagName) = accounts.popitem() + self.browser['typeCompte'] = typeCompte + self.browser[tagName] = [value] self.browser.submit()