From ad7c2c535b38da888cd6b6b283c3e94b98a34859 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Fri, 5 Apr 2013 19:04:22 +0200 Subject: [PATCH] support international accounts --- modules/hsbc/backend.py | 8 +++++--- modules/hsbc/browser.py | 38 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/modules/hsbc/backend.py b/modules/hsbc/backend.py index b2b92219af..05cca90233 100644 --- a/modules/hsbc/backend.py +++ b/modules/hsbc/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 HSBC @@ -37,12 +37,14 @@ class HSBCBackend(BaseBackend, ICapBank): LICENSE = 'AGPLv3+' DESCRIPTION = 'HSBC France bank website' CONFIG = BackendConfig(ValueBackendPassword('login', label='Account ID', masked=False), - ValueBackendPassword('password', label='Password', regexp='^(\d+|)$')) + ValueBackendPassword('password', label='Password'), + Value( 'secret', label='Secret (optional)', default='')) BROWSER = HSBC def create_default_browser(self): return self.create_browser(self.config['login'].get(), - self.config['password'].get()) + self.config['password'].get(), + self.config['secret'].get()) def iter_accounts(self): for account in self.browser.get_accounts_list(): diff --git a/modules/hsbc/browser.py b/modules/hsbc/browser.py index 62ec4725cd..a1c0cc808a 100644 --- a/modules/hsbc/browser.py +++ b/modules/hsbc/browser.py @@ -25,6 +25,7 @@ from weboob.tools.date import LinearDateGuesser from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword, BasePage, BrokenPageError from .pages.accounts import AccountsListPage, CPTHistoryPage, CardHistoryPage +from .pages.login import LoginPage __all__ = ['HSBC'] @@ -43,21 +44,34 @@ class HSBC(BaseBrowser): 'https://client.hsbc.fr/cgi-bin/emcgi\?.*debr=COMPTES_PAN': AccountsListPage, 'https://client.hsbc.fr/cgi-bin/emcgi\?.*CPT_IdPrestation=.*': CPTHistoryPage, 'https://client.hsbc.fr/cgi-bin/emcgi\?.*CB_IdPrestation=.*': CardHistoryPage, + 'https://www.hsbc.fr/.*': LoginPage, + 'https://client.hsbc.fr/cgi-bin/emcgi': LoginPage, } _session = None + def __init__(self, username, password, secret, *args, **kwargs): + self.secret = secret + BaseBrowser.__init__(self, username, password, *args, **kwargs) + def home(self): self.login() def is_logged(self): - return self._session is not None and not self.is_on_page(NotLoggedPage) + return self._session is not None and not self.is_on_page((NotLoggedPage,LoginPage)) def login(self): assert isinstance(self.username, basestring) assert isinstance(self.password, basestring) - assert self.password.isdigit() + self._ua_handlers['_cookies'].cookiejar.clear() + + if len(self.username) == 11 and self.username.isdigit(): + self.login_france() + else: + self.login_world() + + def login_france(self): data = {'Ident': self.username} r = self.readurl('https://client.hsbc.fr/cgi-bin/emcgi?Appl=WEBACC', urllib.urlencode(data), if_fail='raise') m = re.search('sessionid=([^ "]+)', r, flags=re.MULTILINE) @@ -74,8 +88,28 @@ def login(self): m = re.search('url = "/cgi-bin/emcgi\?sessionid=([^& "]+)&debr="', r, flags=re.MULTILINE) if not m: raise BrokenPageError('Unable to find session token') + self._session = m.group(1) + def login_world(self): + data = {'Appl': 'WEBACC', + 'CODE_ABONNE': self.username, + 'Ident': self.username, + 'ifr': 0, + 'nextPage': 'localsso.hbfr.Redirect', + 'secret': '', + 'userid': self.username, + } + self.location('https://www.hsbc.fr/1/2/?idv_cmd=idv.Authentication', urllib.urlencode(data), no_login=True) + + self.page.login(self.username, self.secret, self.password) + + error = self.page.get_error() + if error is not None: + raise BrowserIncorrectPassword(error) + + self._session = self.page.get_session() + def get_accounts_list(self): self.location(self.buildurl('/cgi-bin/emcgi', sessionid=self._session, debr='COMPTES_PAN')) -- GitLab