support international accounts

This commit is contained in:
Romain Bignon 2013-04-05 19:04:22 +02:00
commit ad7c2c535b
2 changed files with 41 additions and 5 deletions

View file

@ -21,7 +21,7 @@ from __future__ import with_statement
from weboob.capabilities.bank import ICapBank, AccountNotFound from weboob.capabilities.bank import ICapBank, AccountNotFound
from weboob.tools.backend import BaseBackend, BackendConfig from weboob.tools.backend import BaseBackend, BackendConfig
from weboob.tools.value import ValueBackendPassword from weboob.tools.value import ValueBackendPassword, Value
from .browser import HSBC from .browser import HSBC
@ -37,12 +37,14 @@ class HSBCBackend(BaseBackend, ICapBank):
LICENSE = 'AGPLv3+' LICENSE = 'AGPLv3+'
DESCRIPTION = 'HSBC France bank website' DESCRIPTION = 'HSBC France bank website'
CONFIG = BackendConfig(ValueBackendPassword('login', label='Account ID', masked=False), 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 BROWSER = HSBC
def create_default_browser(self): def create_default_browser(self):
return self.create_browser(self.config['login'].get(), return self.create_browser(self.config['login'].get(),
self.config['password'].get()) self.config['password'].get(),
self.config['secret'].get())
def iter_accounts(self): def iter_accounts(self):
for account in self.browser.get_accounts_list(): for account in self.browser.get_accounts_list():

View file

@ -25,6 +25,7 @@ import re
from weboob.tools.date import LinearDateGuesser from weboob.tools.date import LinearDateGuesser
from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword, BasePage, BrokenPageError from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword, BasePage, BrokenPageError
from .pages.accounts import AccountsListPage, CPTHistoryPage, CardHistoryPage from .pages.accounts import AccountsListPage, CPTHistoryPage, CardHistoryPage
from .pages.login import LoginPage
__all__ = ['HSBC'] __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\?.*debr=COMPTES_PAN': AccountsListPage,
'https://client.hsbc.fr/cgi-bin/emcgi\?.*CPT_IdPrestation=.*': CPTHistoryPage, 'https://client.hsbc.fr/cgi-bin/emcgi\?.*CPT_IdPrestation=.*': CPTHistoryPage,
'https://client.hsbc.fr/cgi-bin/emcgi\?.*CB_IdPrestation=.*': CardHistoryPage, '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 _session = None
def __init__(self, username, password, secret, *args, **kwargs):
self.secret = secret
BaseBrowser.__init__(self, username, password, *args, **kwargs)
def home(self): def home(self):
self.login() self.login()
def is_logged(self): 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): def login(self):
assert isinstance(self.username, basestring) assert isinstance(self.username, basestring)
assert isinstance(self.password, 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} data = {'Ident': self.username}
r = self.readurl('https://client.hsbc.fr/cgi-bin/emcgi?Appl=WEBACC', urllib.urlencode(data), if_fail='raise') 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) m = re.search('sessionid=([^ "]+)', r, flags=re.MULTILINE)
@ -74,8 +88,28 @@ class HSBC(BaseBrowser):
m = re.search('url = "/cgi-bin/emcgi\?sessionid=([^& "]+)&debr="', r, flags=re.MULTILINE) m = re.search('url = "/cgi-bin/emcgi\?sessionid=([^& "]+)&debr="', r, flags=re.MULTILINE)
if not m: if not m:
raise BrokenPageError('Unable to find session token') raise BrokenPageError('Unable to find session token')
self._session = m.group(1) 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): def get_accounts_list(self):
self.location(self.buildurl('/cgi-bin/emcgi', sessionid=self._session, debr='COMPTES_PAN')) self.location(self.buildurl('/cgi-bin/emcgi', sessionid=self._session, debr='COMPTES_PAN'))