diff --git a/modules/orange/bill/__init__.py b/modules/orange/bill/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/modules/orange/bill/browser.py b/modules/orange/bill/browser.py deleted file mode 100644 index 7f053a60b517d67b0e33c49db2e877c947c5f7f3..0000000000000000000000000000000000000000 --- a/modules/orange/bill/browser.py +++ /dev/null @@ -1,116 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright(C) 2012-2014 Vincent Paredes -# -# This file is part of weboob. -# -# weboob is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# weboob is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with weboob. If not, see . - -from __future__ import unicode_literals - -from weboob.browser import LoginBrowser, URL, need_login -from weboob.exceptions import BrowserIncorrectPassword -from .pages import LoginPage, BillsPage -from .pages.bills import SubscriptionsPage, BillsApiPage, ContractsPage -from .pages.profile import ProfilePage -from weboob.browser.exceptions import ClientError, ServerError - -__all__ = ['OrangeBillBrowser'] - - -class OrangeBillBrowser(LoginBrowser): - BASEURL = 'https://espaceclientv3.orange.fr/' - - loginpage = URL('https://login.orange.fr/\?service=sosh&return_url=https://www.sosh.fr/', - 'https://login.orange.fr/front/login', LoginPage) - - contracts = URL('https://espaceclientpro.orange.fr/api/contracts\?page=1&nbcontractsbypage=15', ContractsPage) - - subscriptions = URL(r'https://espaceclientv3.orange.fr/js/necfe.php\?zonetype=bandeau&idPage=gt-home-page', SubscriptionsPage) - - billspage = URL('https://m.espaceclientv3.orange.fr/\?page=factures-archives', - 'https://.*.espaceclientv3.orange.fr/\?page=factures-archives', - 'https://espaceclientv3.orange.fr/\?page=factures-archives', - 'https://espaceclientv3.orange.fr/\?page=facture-telecharger', - 'https://espaceclientv3.orange.fr/maf.php', - 'https://espaceclientv3.orange.fr/\?idContrat=(?P.*)&page=factures-historique', - 'https://espaceclientv3.orange.fr/\?page=factures-historique&idContrat=(?P.*)', - BillsPage) - - bills_api = URL('https://espaceclientpro.orange.fr/api/contract/(?P\d+)/bills\?count=(?P)', - BillsApiPage) - - doc_api = URL('https://espaceclientpro.orange.fr/api/contract/(?P\d+)/bill/(?P.*)/(?P.*)/\?(?P)') - profile = URL('/\?page=profil-infosPerso', ProfilePage) - - - def do_login(self): - assert isinstance(self.username, basestring) - assert isinstance(self.password, basestring) - - try: - self.loginpage.stay_or_go().login(self.username, self.password) - except ClientError as error: - if error.response.status_code == 401: - raise BrowserIncorrectPassword() - raise - - def get_nb_remaining_free_sms(self): - raise NotImplementedError() - - def post_message(self, message, sender): - raise NotImplementedError() - - @need_login - def get_subscription_list(self): - profile = self.profile.go().get_profile() - # this only works when there are pro subs. - nb_sub = 0 - try: - for sub in self.contracts.go().iter_subscriptions(): - sub.subscriber = profile.name - yield sub - nb_sub = self.page.doc['totalContracts'] - # assert pagination is not needed - assert nb_sub < 15 - except ServerError: - pass - - if nb_sub > 0: - return - # if nb_sub is 0, we continue, because we can get them in next url - - self.location('https://espaceclientv3.orange.fr/?page=gt-home-page&sosh') - self.subscriptions.go() - for sub in self.page.iter_subscription(): - sub.subscriber = profile.name - yield sub - - @need_login - def iter_documents(self, subscription): - documents = [] - if subscription._is_pro: - for d in self.bills_api.go(subid=subscription.id, count=72).get_bills(subid=subscription.id): - documents.append(d) - # check pagination for this subscription - assert len(documents) != 72 - else: - self.billspage.go(subid=subscription.id) - for b in self.page.get_bills(subid=subscription.id): - documents.append(b) - return iter(documents) - - @need_login - def get_profile(self): - return self.profile.go().get_profile() diff --git a/modules/orange/bill/pages/__init__.py b/modules/orange/bill/pages/__init__.py deleted file mode 100644 index c87ea35fb6914dfd8a2dced64c2bc1f38d254d13..0000000000000000000000000000000000000000 --- a/modules/orange/bill/pages/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright(C) 2010-2011 Vincent Paredes -# -# This file is part of weboob. -# -# weboob is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# weboob is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with weboob. If not, see . - -from .login import LoginPage -from .bills import BillsPage - -__all__ = ['LoginPage', 'BillsPage'] diff --git a/modules/orange/bill/pages/login.py b/modules/orange/bill/pages/login.py deleted file mode 100644 index 536dc8b41d8f18abbca36b7d163a87ab33ad3a3f..0000000000000000000000000000000000000000 --- a/modules/orange/bill/pages/login.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright(C) 2010-2011 Vincent Paredes -# -# This file is part of weboob. -# -# weboob is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# weboob is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with weboob. If not, see . - - -from weboob.browser.pages import HTMLPage - - -class LoginPage(HTMLPage): - def login(self, username, password): - json_data = { - 'forcePwd': False, - 'login': username, - 'mem': True, - } - self.browser.location('https://login.orange.fr/front/login', json=json_data) - - json_data = { - 'login': username, - 'password': password, - } - self.browser.location('https://login.orange.fr/front/password', json=json_data) diff --git a/modules/orange/browser.py b/modules/orange/browser.py index b36e22a399dd4c4ae96451109dd25f015fbf6c5d..bd514e4efadc42a73f9e0d27b03388df2f22ca25 100644 --- a/modules/orange/browser.py +++ b/modules/orange/browser.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Nicolas Duhamel +# Copyright(C) 2012-2014 Vincent Paredes # # This file is part of weboob. # @@ -17,52 +17,101 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . +from __future__ import unicode_literals -#~ from .pages.compose import ClosePage, ComposePage, ConfirmPage, SentPage -#~ from .pages.login import LoginPage +from weboob.browser import LoginBrowser, URL, need_login +from weboob.exceptions import BrowserIncorrectPassword +from .pages import LoginPage, BillsPage +from .pages.bills import SubscriptionsPage, BillsApiPage, ContractsPage +from .pages.profile import ProfilePage +from weboob.browser.exceptions import ClientError, ServerError +from weboob.tools.compat import basestring -from .pages import LoginPage, ComposePage, ConfirmPage -from weboob.deprecated.browser import Browser, BrowserIncorrectPassword +__all__ = ['OrangeBillBrowser'] -__all__ = ['OrangeBrowser'] +class OrangeBillBrowser(LoginBrowser): + BASEURL = 'https://espaceclientv3.orange.fr/' + loginpage = URL('https://login.orange.fr/\?service=sosh&return_url=https://www.sosh.fr/', + 'https://login.orange.fr/front/login', LoginPage) -class OrangeBrowser(Browser): - DOMAIN = 'orange.fr' - PAGES = { - 'http://id.orange.fr/auth_user/bin/auth_user.cgi.*': LoginPage, - 'http://id.orange.fr/auth_user/bin/auth0user.cgi.*': LoginPage, - 'https://id.orange.fr/auth_user/bin/auth_user.cgi.*': LoginPage, - 'https://id.orange.fr/auth_user/bin/auth0user.cgi.*': LoginPage, - 'https://authweb.orange.fr/auth_user/bin/auth_user.cgi.*': LoginPage, - 'https://authweb.orange.fr/auth_user/bin/auth0user.cgi.*': LoginPage, - 'http://smsmms1.orange.fr/./Sms/sms_write.php.*' : ComposePage, - 'http://smsmms1.orange.fr/./Sms/sms_write.php?command=send' : ConfirmPage, - 'https://smsmms1.orange.fr/./Sms/sms_write.php.*' : ComposePage, - 'https://smsmms1.orange.fr/./Sms/sms_write.php?command=send' : ConfirmPage, - } + contracts = URL('https://espaceclientpro.orange.fr/api/contracts\?page=1&nbcontractsbypage=15', ContractsPage) - def get_nb_remaining_free_sms(self): - self.location("http://smsmms1.orange.fr/M/Sms/sms_write.php") - return self.page.get_nb_remaining_free_sms() + subscriptions = URL(r'https://espaceclientv3.orange.fr/js/necfe.php\?zonetype=bandeau&idPage=gt-home-page', SubscriptionsPage) + + billspage = URL('https://m.espaceclientv3.orange.fr/\?page=factures-archives', + 'https://.*.espaceclientv3.orange.fr/\?page=factures-archives', + 'https://espaceclientv3.orange.fr/\?page=factures-archives', + 'https://espaceclientv3.orange.fr/\?page=facture-telecharger', + 'https://espaceclientv3.orange.fr/maf.php', + 'https://espaceclientv3.orange.fr/\?idContrat=(?P.*)&page=factures-historique', + 'https://espaceclientv3.orange.fr/\?page=factures-historique&idContrat=(?P.*)', + BillsPage) + + bills_api = URL('https://espaceclientpro.orange.fr/api/contract/(?P\d+)/bills\?count=(?P)', + BillsApiPage) - def home(self): - self.location("http://smsmms1.orange.fr/M/Sms/sms_write.php") + doc_api = URL('https://espaceclientpro.orange.fr/api/contract/(?P\d+)/bill/(?P.*)/(?P.*)/\?(?P)') + profile = URL('/\?page=profil-infosPerso', ProfilePage) - def is_logged(self): - self.location("http://smsmms1.orange.fr/M/Sms/sms_write.php", no_login=True) - return not self.is_on_page(LoginPage) + def do_login(self): + assert isinstance(self.username, basestring) + assert isinstance(self.password, basestring) - def login(self): - if not self.is_on_page(LoginPage): - self.location('https://authweb.orange.fr/auth_user/bin/auth_user.cgi?url=http://www.orange.fr', no_login=True) - self.page.login(self.username, self.password) - if not self.is_logged(): - raise BrowserIncorrectPassword() + try: + self.loginpage.stay_or_go().login(self.username, self.password) + except ClientError as error: + if error.response.status_code == 401: + raise BrowserIncorrectPassword() + raise + + def get_nb_remaining_free_sms(self): + raise NotImplementedError() def post_message(self, message, sender): - if not self.is_on_page(ComposePage): - self.home() - self.page.post_message(message, sender) + raise NotImplementedError() + + @need_login + def get_subscription_list(self): + profile = self.profile.go().get_profile() + # this only works when there are pro subs. + nb_sub = 0 + try: + for sub in self.contracts.go().iter_subscriptions(): + sub.subscriber = profile.name + yield sub + nb_sub = self.page.doc['totalContracts'] + # assert pagination is not needed + assert nb_sub < 15 + except ServerError: + pass + + if nb_sub > 0: + return + # if nb_sub is 0, we continue, because we can get them in next url + + self.location('https://espaceclientv3.orange.fr/?page=gt-home-page&sosh') + self.subscriptions.go() + for sub in self.page.iter_subscription(): + sub.subscriber = profile.name + yield sub + + @need_login + def iter_documents(self, subscription): + documents = [] + if subscription._is_pro: + for d in self.bills_api.go(subid=subscription.id, count=72).get_bills(subid=subscription.id): + documents.append(d) + # check pagination for this subscription + assert len(documents) != 72 + else: + self.billspage.go(subid=subscription.id) + for b in self.page.get_bills(subid=subscription.id): + documents.append(b) + return iter(documents) + + @need_login + def get_profile(self): + return self.profile.go().get_profile() diff --git a/modules/orange/module.py b/modules/orange/module.py index 26092f196bdc1f1de50210e41cd5701180b7cff4..ca948d6c29d8f706de54bb65352ac615fcb7a38c 100644 --- a/modules/orange/module.py +++ b/modules/orange/module.py @@ -19,53 +19,29 @@ from weboob.capabilities.bill import CapDocument, Subscription, Document, SubscriptionNotFound, DocumentNotFound -from weboob.capabilities.messages import CantSendMessage, CapMessages, CapMessagesPost from weboob.capabilities.base import find_object, NotAvailable -from weboob.capabilities.account import CapAccount, StatusField +from weboob.capabilities.account import CapAccount from weboob.capabilities.profile import CapProfile from weboob.tools.backend import Module, BackendConfig from weboob.tools.value import ValueBackendPassword, Value -from .browser import OrangeBrowser -from .bill.browser import OrangeBillBrowser +from .browser import OrangeBillBrowser __all__ = ['OrangeModule'] -# We need to have a switcher, CapMessages use a browser1 and -# CapDocument use a browser2 -# This will be remove when CapMessages use a browser2 -def browser_switcher(b): - def set_browser(func): - def func_wrapper(*args, **kwargs): - self = args[0] - if self._browser is None or type(self._browser) != b: - self.BROWSER = b - try: - self._browser = self._browsers[b] - except KeyError: - self._browsers[b] = self.create_default_browser() - self._browser = self._browsers[b] - return func(*args, **kwargs) - return func_wrapper - return set_browser - - -class OrangeModule(Module, CapAccount, CapMessages, CapMessagesPost, CapDocument, CapProfile): + +class OrangeModule(Module, CapAccount, CapDocument, CapProfile): NAME = 'orange' - MAINTAINER = u'Lucas Nussbaum' - EMAIL = 'lucas@lucas-nussbaum.net' + MAINTAINER = 'Florian Duguet' + EMAIL = 'florian.duguet@budget-insight.com' VERSION = '1.4' DESCRIPTION = 'Orange French mobile phone provider' LICENSE = 'AGPLv3+' CONFIG = BackendConfig(Value('login', label='Login'), - ValueBackendPassword('password', label='Password'), - Value('phonenumber', label='Phone number', default='') - ) - ACCOUNT_REGISTER_PROPERTIES = None + ValueBackendPassword('password', label='Password')) BROWSER = OrangeBillBrowser - def __init__(self, *args, **kwargs): self._browsers = dict() super(OrangeModule, self).__init__(*args, **kwargs) @@ -73,38 +49,22 @@ def __init__(self, *args, **kwargs): def create_default_browser(self): return self.create_browser(self.config['login'].get(), self.config['password'].get()) - @browser_switcher(OrangeBrowser) - def get_account_status(self): - return (StatusField('nb_remaining_free_sms', 'Number of remaining free SMS', - self.browser.get_nb_remaining_free_sms()),) - - @browser_switcher(OrangeBrowser) - def post_message(self, message): - if not message.content.strip(): - raise CantSendMessage(u'Message content is empty.') - self.browser.post_message(message, self.config['phonenumber'].get()) - - @browser_switcher(OrangeBillBrowser) def iter_subscription(self): return self.browser.get_subscription_list() - @browser_switcher(OrangeBillBrowser) def get_subscription(self, _id): return find_object(self.iter_subscription(), id=_id, error=SubscriptionNotFound) - @browser_switcher(OrangeBillBrowser) def get_document(self, _id): subid = _id.rsplit('_', 1)[0] subscription = self.get_subscription(subid) return find_object(self.iter_documents(subscription), id=_id, error=DocumentNotFound) - @browser_switcher(OrangeBillBrowser) def iter_documents(self, subscription): if not isinstance(subscription, Subscription): subscription = self.get_subscription(subscription) return self.browser.iter_documents(subscription) - @browser_switcher(OrangeBillBrowser) def download_document(self, document): if not isinstance(document, Document): document = self.get_document(document) @@ -112,6 +72,5 @@ def download_document(self, document): return return self.browser.open(document.url).content - @browser_switcher(OrangeBillBrowser) def get_profile(self): return self.browser.get_profile() diff --git a/modules/orange/pages/__init__.py b/modules/orange/pages/__init__.py index 63ee962d66505b2a9f37bf3e7caa05701f147616..c87ea35fb6914dfd8a2dced64c2bc1f38d254d13 100644 --- a/modules/orange/pages/__init__.py +++ b/modules/orange/pages/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Nicolas Duhamel +# Copyright(C) 2010-2011 Vincent Paredes # # This file is part of weboob. # @@ -18,6 +18,6 @@ # along with weboob. If not, see . from .login import LoginPage -from .compose import ComposePage, ConfirmPage +from .bills import BillsPage -__all__ = ['LoginPage', 'ComposePage', 'ConfirmPage'] +__all__ = ['LoginPage', 'BillsPage'] diff --git a/modules/orange/bill/pages/bills.py b/modules/orange/pages/bills.py similarity index 92% rename from modules/orange/bill/pages/bills.py rename to modules/orange/pages/bills.py index 7f77419748db80c3adbedfbfa271341977edae9c..ad3525f3f2f63820922fb966833a1fc36c672552 100644 --- a/modules/orange/bill/pages/bills.py +++ b/modules/orange/pages/bills.py @@ -20,7 +20,7 @@ from __future__ import unicode_literals import re -import HTMLParser +from html.parser import HTMLParser from weboob.browser.pages import HTMLPage, LoggedPage, JsonPage from weboob.capabilities.bill import Subscription @@ -49,14 +49,13 @@ class item(ItemElement): obj_date = Date(Dict('dueDate'), parse_func=parse_french_date, default=NotAvailable) obj_price = CleanDecimal(Dict('amountIncludingTax')) - obj_type = "bill" - obj_format = "pdf" + obj_format = 'pdf' def obj_label(self): - return "Facture du %s" % Field('date')(self) + return 'Facture du %s' % Field('date')(self) def obj_id(self): - return "%s_%s" % (Env('subid')(self), Field('date')(self).strftime('%d%m%Y')) + return '%s_%s' % (Env('subid')(self), Field('date')(self).strftime('%d%m%Y')) def get_params(self): params = {'billid': Dict('id')(self), 'billDate': Dict('dueDate')(self)} @@ -71,11 +70,11 @@ class get_bills(TableElement): item_xpath = '//table[has-class("table-hover")]/div/div/tr | //table[has-class("table-hover")]/div/tr' head_xpath = '//table[has-class("table-hover")]/thead/tr/th' - col_date = u'Date' - col_amount = [u'Montant TTC', u'Montant'] - col_ht = u'Montant HT' - col_url = u'Télécharger' - col_infos = u'Infos paiement' + col_date = 'Date' + col_amount = ['Montant TTC', 'Montant'] + col_ht = 'Montant HT' + col_url = 'Télécharger' + col_infos = 'Infos paiement' class item(ItemElement): klass = Bill @@ -109,7 +108,7 @@ def obj_currency(self): def obj_url(self): if Field('_url_base')(self): # URL won't work if HTML is not unescape - return HTMLParser.HTMLParser().unescape(str(Field('_url_base')(self))) + return HTMLParser().unescape(str(Field('_url_base')(self))) else : return Link(TableCell(Field('_cell')(self))(self)[0].xpath('./a'), default=NotAvailable)(self) @@ -117,7 +116,7 @@ def obj_url(self): def obj_label(self): if Field('_label_base')(self): - return HTMLParser.HTMLParser().unescape(str(Field('_label_base')(self))) + return HTMLParser().unescape(str(Field('_label_base')(self))) else: return CleanText(TableCell(Field('_cell')(self))(self)[0].xpath('.//span[@class="ec_visually_hidden"]'))(self) diff --git a/modules/orange/pages/compose.py b/modules/orange/pages/compose.py deleted file mode 100644 index 3ef2cb457a72ef2f426ead8d5bfe7bf00795b91d..0000000000000000000000000000000000000000 --- a/modules/orange/pages/compose.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright(C) 2010-2011 Nicolas Duhamel -# -# This file is part of weboob. -# -# weboob is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# weboob is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with weboob. If not, see . - -import re - -from weboob.capabilities.messages import CantSendMessage -from weboob.deprecated.browser import Page - - -class ConfirmPage(Page): - def on_loaded(self): - pass - - -class ComposePage(Page): - phone_regex = re.compile('^(\+33|0033|0)(6|7)(\d{8})$') - - def on_loaded(self): - # Deal with bad encoding... for ie6... - response = self.browser.response() - response.set_data(response.get_data().decode('utf-8', 'ignore')) - self.browser.set_response(response) - - def get_nb_remaining_free_sms(self): - return "0" - - def post_message(self, message, sender): - receiver = message.thread.id - if self.phone_regex.match(receiver) is None: - raise CantSendMessage(u'Invalid receiver: %s' % receiver) - - listetel = ",," + receiver - - #Fill the form - self.browser.select_form(name="formulaire") - self.browser.new_control("hidden", "autorize", {'value': ''}) - - self.browser.set_all_readonly(False) - - self.browser["corpsms"] = message.content.encode('utf-8') - self.browser["pays"] = "33" - self.browser["listetel"] = listetel - self.browser["reply"] = "2" - self.browser["typesms"] = "2" - self.browser["produit"] = "1000" - self.browser["destToKeep"] = listetel - self.browser["NUMTEL"] = sender - self.browser["autorize"] = "1" - self.browser["msg"] = message.content.encode('utf-8') - self.browser.submit() diff --git a/modules/orange/pages/login.py b/modules/orange/pages/login.py index b1e0d575f77bed4cd03aadf21d72b59e78fd9dac..536dc8b41d8f18abbca36b7d163a87ab33ad3a3f 100644 --- a/modules/orange/pages/login.py +++ b/modules/orange/pages/login.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Nicolas Duhamel +# Copyright(C) 2010-2011 Vincent Paredes # # This file is part of weboob. # @@ -17,36 +17,21 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . -from weboob.deprecated.browser import Page -from weboob.tools.compat import urlencode -class LoginPage(Page): - def on_loaded(self): - pass +from weboob.browser.pages import HTMLPage - def login(self, user, pwd): - post_data = {"credential" : str(user), - "password" : str(pwd), - "save_user": "false", - "save_pwd" : "false", - "save_TC" : "true", - "action" : "valider", - "usertype" : "", - "service" : "", - "url" : "http://www.orange.fr", - "case" : "", - "origin" : "", } - post_data = urlencode(post_data) - self.browser.addheaders = [('Referer', 'http://id.orange.fr/auth_user/template/auth0user/htm/vide.html'), - ("Content-Type" , 'application/x-www-form-urlencoded') ] +class LoginPage(HTMLPage): + def login(self, username, password): + json_data = { + 'forcePwd': False, + 'login': username, + 'mem': True, + } + self.browser.location('https://login.orange.fr/front/login', json=json_data) - self.browser.open(self.browser.geturl(), data=post_data) - - #~ print "LOGIN!!!" - #~ self.browser.select_form(predicate=lambda form: "id" in form.attrs and form.attrs["id"] == "authentication_form" ) - #~ user_control = self.browser.find_control(id="user_credential") - #~ user_control.value = user - #~ pwd_control = self.browser.find_control(id="user_password") - #~ pwd_control.value = pwd - #~ self.browser.submit() + json_data = { + 'login': username, + 'password': password, + } + self.browser.location('https://login.orange.fr/front/password', json=json_data) diff --git a/modules/orange/bill/pages/profile.py b/modules/orange/pages/profile.py similarity index 100% rename from modules/orange/bill/pages/profile.py rename to modules/orange/pages/profile.py diff --git a/tools/py3-compatible.modules b/tools/py3-compatible.modules index a773dba0224ddec49cd38ce96136b0b7c6782b00..bc8eee35bd0d28e95451b244395da4ea4ee6d870 100644 --- a/tools/py3-compatible.modules +++ b/tools/py3-compatible.modules @@ -101,6 +101,7 @@ nectarine nova oney opensubtitles +orange ouifm pap pariskiwi