hsbc to browser2!
This commit is contained in:
parent
4ac38b89cf
commit
2766983a33
6 changed files with 212 additions and 339 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue