From 228b056faaac1e451a4dc69f0f090dffd38fa519 Mon Sep 17 00:00:00 2001 From: Florian Duguet Date: Tue, 24 Sep 2019 16:57:09 +0200 Subject: [PATCH] [ldlc - pro] manage captcha and change login form field Closes: 46991@sibi --- modules/ldlc/browser.py | 12 ++++++++++-- modules/ldlc/module.py | 5 +++-- modules/ldlc/pages.py | 18 ++++++++++++++---- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/modules/ldlc/browser.py b/modules/ldlc/browser.py index 8af9a2e9a9..fb1102abf5 100644 --- a/modules/ldlc/browser.py +++ b/modules/ldlc/browser.py @@ -18,7 +18,7 @@ # along with this weboob module. If not, see . from weboob.browser import LoginBrowser, AbstractBrowser, URL, need_login -from weboob.exceptions import BrowserIncorrectPassword +from weboob.exceptions import BrowserIncorrectPassword, NocaptchaQuestion from .pages import HomePage, LoginPage, ProBillsPage, DocumentsPage @@ -46,9 +46,17 @@ class LdlcBrowser(LoginBrowser): login = URL(r'/Account/LoginPage.aspx', LoginPage) home = URL(r'/$', HomePage) + def __init__(self, config, *args, **kwargs): + super(LdlcBrowser, self).__init__(*args, **kwargs) + self.config = config + def do_login(self): self.login.stay_or_go() - self.page.login(self.username, self.password) + sitekey = self.page.get_recaptcha_sitekey() + if sitekey and not self.config['captcha_response'].get(): + raise NocaptchaQuestion(website_key=sitekey, website_url=self.login.build()) + + self.page.login(self.username, self.password, self.config['captcha_response'].get()) if self.login.is_here(): raise BrowserIncorrectPassword(self.page.get_error()) diff --git a/modules/ldlc/module.py b/modules/ldlc/module.py index 3ddb0d1a5d..04266da77a 100644 --- a/modules/ldlc/module.py +++ b/modules/ldlc/module.py @@ -40,7 +40,8 @@ class LdlcModule(AbstractModule, CapDocument): CONFIG = BackendConfig(Value('login', label='Email'), ValueBackendPassword('password', label='Password'), Value('website', label='Site web', default='part', - choices={'pro': 'Professionnels', 'part': 'Particuliers'})) + choices={'pro': 'Professionnels', 'part': 'Particuliers'}), + Value('captcha_response', label='RĂ©ponse captcha', default='', required=False)) PARENT = 'materielnet' @@ -50,7 +51,7 @@ def create_default_browser(self): return self.create_browser(self.config['login'].get(), self.config['password'].get(), weboob=self.weboob) else: self.BROWSER = LdlcProBrowser - return self.create_browser(self.config['login'].get(), self.config['password'].get()) + return self.create_browser(self.config, self.config['login'].get(), self.config['password'].get()) def download_document(self, bill): if not isinstance(bill, Bill): diff --git a/modules/ldlc/pages.py b/modules/ldlc/pages.py index c9694d9162..620443757b 100644 --- a/modules/ldlc/pages.py +++ b/modules/ldlc/pages.py @@ -50,10 +50,20 @@ class item(ItemElement): class LoginPage(HTMLPage): - def login(self, username, password): - form = self.get_form(xpath='//form[contains(@action, "/Login/Login")]') - form['Email'] = username - form['Password'] = password + def get_recaptcha_sitekey(self): + return Attr('//div[@class="g-recaptcha"]', 'data-sitekey', default=NotAvailable)(self.doc) + + def login(self, username, password, captcha_response=None): + form = self.get_form(id='aspnetForm') + form['__EVENTTARGET'] = 'ctl00$cphMainContent$butConnexion' + form['ctl00$cphMainContent$txbMail'] = username + form['ctl00$cphMainContent$txbPassword'] = password + + # remove this, else error message will be empty if there is a wrongpass + del form['ctl00$SaveCookiesChoices'] + if captcha_response: + form['g-recaptcha-response'] = captcha_response + form.submit() def get_error(self): -- GitLab