hsbc to browser2!

This commit is contained in:
Vincent Paredes 2014-03-20 18:26:45 +01:00 committed by Romain Bignon
commit 2766983a33
6 changed files with 212 additions and 339 deletions

View file

@ -19,111 +19,60 @@
from datetime import timedelta
import urllib
import re
from weboob.tools.date import LinearDateGuesser
from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword, BasePage, BrokenPageError
from weboob.tools.decorators import retry
from .pages.accounts import AccountsListPage, CPTHistoryPage, CardHistoryPage
from .pages.login import LoginPage
from weboob.tools.browser import BrowserIncorrectPassword
from weboob.tools.browser2 import LoginBrowser, URL, need_login
from .pages import AccountsPage, CBOperationPage, CPTOperationPage, LoginPage
__all__ = ['HSBC']
class NotLoggedPage(BasePage):
pass
class HSBC(BaseBrowser):
DOMAIN = 'client.hsbc.fr'
PROTOCOL = 'https'
class HSBC(LoginBrowser):
VERIFY = False
BASEURL = 'https://client.hsbc.fr'
CERTHASH = '48d84a782728eeeb622e9ff721688365e24f555ae1aec49b3be33831c7fe24e6'
ENCODING = None # refer to the HTML encoding
PAGES = {'https://client.hsbc.fr/session_absente.html': NotLoggedPage,
'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
connection = URL('https://www.hsbc.fr/1/2/hsbc-france/particuliers/connexion', LoginPage)
login = URL('https://www.hsbc.fr/1/*', LoginPage)
cptPage = URL('/cgi-bin/emcgi.*\&CPT_IdPrestation.*',
'/cgi-bin/emcgi.*\&Ass_IdPrestation.*',
CPTOperationPage)
cbPage = URL('/cgi-bin/emcgi.*\&CB_IdPrestation.*',
CBOperationPage)
accounts = URL('/cgi-bin/emcgi', AccountsPage)
def __init__(self, username, password, secret, *args, **kwargs):
self.secret = secret
BaseBrowser.__init__(self, username, password, *args, **kwargs)
LoginBrowser.__init__(self, username, password, *args, **kwargs)
def home(self):
self.login()
return self.login.go()
def is_logged(self):
return self._session is not None and not self.is_on_page((NotLoggedPage,LoginPage))
def do_login(self):
self.connection.stay_or_go()
self.page.login(self.username)
@retry(BrokenPageError, tries=2)
def login(self):
assert isinstance(self.username, basestring)
assert isinstance(self.password, basestring)
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)
if not m:
no_secure_key_link = self.page.get_no_secure_key()
if not no_secure_key_link:
raise BrowserIncorrectPassword()
self.location(no_secure_key_link)
self._session = m.group(1)
self.page.login_w_secure(self.login, self.password, self.secret)
self.page.useless_form()
data = {'Secret': self.password}
r = self.readurl('https://client.hsbc.fr/cgi-bin/emcgi?sessionid=%s' % self._session, urllib.urlencode(data), if_fail='raise')
if r.find('Erreur Identification') >= 0:
home_url = self.page.get_frame()
if not home_url:
raise BrowserIncorrectPassword()
self.location(home_url)
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()
@need_login
def get_accounts_list(self):
self.location(self.buildurl('/cgi-bin/emcgi', sessionid=self._session, debr='COMPTES_PAN'))
return self.page.get_list()
return self.accounts.stay_or_go().iter_accounts()
def get_account(self, id):
assert isinstance(id, basestring)
if not self.is_on_page(AccountsListPage):
l = self.get_accounts_list()
else:
l = self.page.get_list()
l = self.get_accounts_list()
for a in l:
if a.id == id:
@ -134,25 +83,17 @@ class HSBC(BaseBrowser):
def get_history(self, account):
if account._link_id is None:
return
self.location(account._link_id)
for tr in self._get_history(account._link_id):
if self.page is None:
return
if self.cbPage.is_here():
guesser = LinearDateGuesser(date_max_bump=timedelta(45))
return self.pagination(lambda: self.page.get_history(date_guesser=guesser))
else:
return self._get_history()
def _get_history(self):
for tr in self.page.get_history():
yield tr
for card in account._card_links:
for tr in self._get_history(card):
yield tr
def _get_history(self, link):
num_page = 0
guesser = LinearDateGuesser(date_max_bump=timedelta(45))
while link is not None:
self.location(link)
if self.page is None:
return
for tr in self.page.get_operations(num_page, guesser):
yield tr
link = self.page.get_next_link()
num_page += 1