diff --git a/modules/societegenerale/browser.py b/modules/societegenerale/browser.py index 2e9d9a45..1f1bc1d9 100644 --- a/modules/societegenerale/browser.py +++ b/modules/societegenerale/browser.py @@ -49,7 +49,14 @@ class SocieteGenerale(BaseBrowser): self.location('https://' + self.DOMAIN_LOGIN + '/index.html') def is_logged(self): - return not self.is_on_page(LoginPage) + if not self.page or self.is_on_page(LoginPage): + return False + + error = self.page.get_error() + if error is None: + return True + + return False def login(self): assert isinstance(self.username, basestring) @@ -57,7 +64,7 @@ class SocieteGenerale(BaseBrowser): assert self.password.isdigit() if not self.is_on_page(LoginPage): - self.location('https://' + self.DOMAIN_LOGIN + '/index.html') + self.location('https://' + self.DOMAIN_LOGIN + '/index.html', no_login=True) self.page.login(self.username, self.password) diff --git a/modules/societegenerale/captcha.py b/modules/societegenerale/captcha.py index b39db15a..aa8e4a65 100644 --- a/modules/societegenerale/captcha.py +++ b/modules/societegenerale/captcha.py @@ -32,8 +32,8 @@ class Captcha(object): def __init__(self, file, infos): self.inim = Image.open(file) self.infos = infos - self.nbr = int(infos["nblignes"]) - self.nbc = int(infos["nbcolonnes"]) + self.nbr = int(infos["nbrows"]) + self.nbc = int(infos["nbcols"]) (self.nx, self.ny) = self.inim.size self.inmat = self.inim.load() self.map = {} @@ -53,7 +53,7 @@ class Captcha(object): num = 0 for c in code: index = self.map[int(c)].id - keycode = self.infos["keyCodes"][num * self.nbr * self.nbc + index] + keycode = str(self.infos["grid"][num * self.nbr * self.nbc + index]) s += keycode if num < 5: s += ',' diff --git a/modules/societegenerale/pages/accounts_list.py b/modules/societegenerale/pages/accounts_list.py index 086ff39d..833638be 100644 --- a/modules/societegenerale/pages/accounts_list.py +++ b/modules/societegenerale/pages/accounts_list.py @@ -26,7 +26,9 @@ import re from weboob.capabilities.bank import Account from weboob.tools.capabilities.bank.transactions import FrenchTransaction -from weboob.tools.browser import BasePage, BrokenPageError +from weboob.tools.browser import BrokenPageError + +from .base import BasePage __all__ = ['AccountsList', 'AccountHistory'] diff --git a/modules/societegenerale/pages/login.py b/modules/societegenerale/pages/login.py index 54502bc4..5c3b9763 100644 --- a/modules/societegenerale/pages/login.py +++ b/modules/societegenerale/pages/login.py @@ -19,14 +19,17 @@ from logging import error +import re +from weboob.tools.json import json -from weboob.tools.browser import BasePage, BrowserUnavailable +from weboob.tools.browser import BrowserUnavailable from weboob.tools.mech import ClientForm + +from .base import BasePage from ..captcha import Captcha, TileError -from lxml import etree -__all__ = ['LoginPage'] +__all__ = ['LoginPage', 'BadLoginPage'] class LoginPage(BasePage): @@ -45,23 +48,18 @@ class LoginPage(BasePage): url_login = 'https://' + DOMAIN_LOGIN + '/index.html' base_url = 'https://' + DOMAIN - url = base_url + '/cvcsgenclavier?mode=jsom&estSession=0' + url = base_url + '//sec/vk/gen_crypto?estSession=0' headers = { 'Referer': url_login } request = self.browser.request_class(url, None, headers) infos_data = self.browser.readurl(request) - infos_xml = etree.XML(infos_data) - infos = {} - for el in ("cryptogramme", "nblignes", "nbcolonnes"): - infos[el] = infos_xml.find(el).text - infos["grille"] = "" - for g in infos_xml.findall("grille"): - infos["grille"] += g.text + "," - infos["keyCodes"] = infos["grille"].split(",") + infos_data = re.match('^_vkCallback\((.*)\);$', infos_data).group(1) - url = base_url + '/cvcsgenimage?modeClavier=0&cryptogramme=' + infos["cryptogramme"] + infos = json.loads(infos_data.replace("'", '"')) + + url = base_url + '//sec/vk/gen_ui?modeClavier=0&cryptogramme=' + infos["crypto"] img = Captcha(self.browser.openurl(url), infos) try: @@ -71,19 +69,18 @@ class LoginPage(BasePage): if err.tile: err.tile.display() - self.browser.openurl(url_login) self.browser.select_form('n2g_authentification') self.browser.controls.append(ClientForm.TextControl('text', 'codsec', {'value': ''})) self.browser.controls.append(ClientForm.TextControl('text', 'cryptocvcs', {'value': ''})) + self.browser.controls.append(ClientForm.TextControl('text', 'vk_op', {'value': 'auth'})) self.browser.set_all_readonly(False) self.browser['codcli'] = login self.browser['user_id'] = login self.browser['codsec'] = img.get_codes(password[:6]) - self.browser['cryptocvcs'] = infos["cryptogramme"] - self.browser.submit() + self.browser['cryptocvcs'] = infos["crypto"] + self.browser.submit(nologin=True) class BadLoginPage(BasePage): - def get_error(self): - return self.document.xpath('//span[@class="error_msg"]')[0].text.strip() + pass