From 7fb8e4a181bad86575e32e088bb2f1044ee9ddbb Mon Sep 17 00:00:00 2001 From: Christophe Benz Date: Tue, 23 Nov 2010 16:27:32 +0100 Subject: [PATCH] Implement bouygues backend. --- weboob/backends/bouygues/__init__.py | 3 ++ weboob/backends/bouygues/backend.py | 51 +++++++++++++++++++ weboob/backends/bouygues/browser.py | 57 ++++++++++++++++++++++ weboob/backends/bouygues/pages/__init__.py | 0 weboob/backends/bouygues/pages/compose.py | 53 ++++++++++++++++++++ weboob/backends/bouygues/pages/login.py | 30 ++++++++++++ weboob/backends/bouygues/test.py | 25 ++++++++++ 7 files changed, 219 insertions(+) create mode 100644 weboob/backends/bouygues/__init__.py create mode 100644 weboob/backends/bouygues/backend.py create mode 100644 weboob/backends/bouygues/browser.py create mode 100644 weboob/backends/bouygues/pages/__init__.py create mode 100644 weboob/backends/bouygues/pages/compose.py create mode 100644 weboob/backends/bouygues/pages/login.py create mode 100644 weboob/backends/bouygues/test.py diff --git a/weboob/backends/bouygues/__init__.py b/weboob/backends/bouygues/__init__.py new file mode 100644 index 0000000000..383d76f22b --- /dev/null +++ b/weboob/backends/bouygues/__init__.py @@ -0,0 +1,3 @@ +from .backend import BouyguesBackend + +__all__ = ['BouyguesBackend'] diff --git a/weboob/backends/bouygues/backend.py b/weboob/backends/bouygues/backend.py new file mode 100644 index 0000000000..d3d6d3aa28 --- /dev/null +++ b/weboob/backends/bouygues/backend.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Christophe Benz +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +from __future__ import with_statement + +from weboob.capabilities.messages import CantSendMessage, ICapMessages, ICapMessagesPost +from weboob.capabilities.account import ICapAccount, StatusField +from weboob.tools.backend import BaseBackend +from weboob.tools.value import ValuesDict, Value + +from .browser import BouyguesBrowser + + +__all__ = ['BouyguesBackend'] + + +class BouyguesBackend(BaseBackend, ICapAccount, ICapMessages, ICapMessagesPost): + NAME = 'bouygues' + MAINTAINER = 'Christophe Benz' + EMAIL = 'christophe.benz@gmail.com' + VERSION = '0.4' + DESCRIPTION = 'Bouygues french mobile phone provider' + LICENSE = 'GPLv3' + CONFIG = ValuesDict(Value('login', label='Login'), + Value('password', label='Password', masked=True)) + BROWSER = BouyguesBrowser + ACCOUNT_REGISTER_PROPERTIES = None + + def create_default_browser(self): + return self.create_browser(self.config['login'], self.config['password']) + + def post_message(self, message): + if not message.content.strip(): + raise CantSendMessage(u'Message content is empty.') + with self.browser: + self.browser.post_message(message) diff --git a/weboob/backends/bouygues/browser.py b/weboob/backends/bouygues/browser.py new file mode 100644 index 0000000000..bea98e4d48 --- /dev/null +++ b/weboob/backends/bouygues/browser.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Christophe Benz +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +from .pages.compose import ComposeFrame, ComposePage, ConfirmPage, SentPage +from .pages.login import LoginPage + +from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword + + +__all__ = ['BouyguesBrowser'] + + +class BouyguesBrowser(BaseBrowser): + DOMAIN = 'www.bouyguestelecom.fr' + PAGES = { + 'http://www.espaceclient.bouyguestelecom.fr/ECF/jsf/client/envoiSMS/viewEnvoiSMS.jsf': ComposePage, + 'http://www.mobile.service.bbox.bouyguestelecom.fr/services/SMSIHD/sendSMS.phtml': ComposeFrame, + 'http://www.mobile.service.bbox.bouyguestelecom.fr/services/SMSIHD/confirmSendSMS.phtml': ConfirmPage, + 'https://www.espaceclient.bouyguestelecom.fr/ECF/jsf/submitLogin.jsf': LoginPage, + 'http://www.mobile.service.bbox.bouyguestelecom.fr/services/SMSIHD/resultSendSMS.phtml': SentPage, + } + + def home(self): + self.location('http://www.espaceclient.bouyguestelecom.fr/ECF/jsf/client/envoiSMS/viewEnvoiSMS.jsf') + + def is_logged(self): + return 'code' not in [form.name for form in self.forms()] + + def login(self): + self.location('https://www.espaceclient.bouyguestelecom.fr/ECF/jsf/submitLogin.jsf', no_login=True) + self.page.login(self.username, self.password) + if not self.is_logged(): + raise BrowserIncorrectPassword() + + def post_message(self, message): + if not self.is_on_page(ComposeFrame): + self.home() + self.location('http://www.mobile.service.bbox.bouyguestelecom.fr/services/SMSIHD/sendSMS.phtml') + self.page.post_message(message) + assert self.is_on_page(ConfirmPage) + self.page.confirm() + assert self.is_on_page(SentPage) diff --git a/weboob/backends/bouygues/pages/__init__.py b/weboob/backends/bouygues/pages/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/weboob/backends/bouygues/pages/compose.py b/weboob/backends/bouygues/pages/compose.py new file mode 100644 index 0000000000..ad01ac3c61 --- /dev/null +++ b/weboob/backends/bouygues/pages/compose.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Christophe Benz +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +import re + +from weboob.capabilities.messages import CantSendMessage +from weboob.tools.browser import BasePage +from weboob.tools.parsers.lxmlparser import select, SelectElementException + + +__all__ = ['ComposeFrame', 'ComposePage', 'ConfirmPage', 'SentPage'] + + +class ComposeFrame(BasePage): + phone_regex = re.compile('^(\+33|0033|0)(6|7)(\d{8})$') + + def post_message(self, message): + receiver_list = [re.sub(' +', '', receiver) for receiver in message.receivers] + for receiver in receiver_list: + if self.phone_regex.match(receiver) is None: + raise CantSendMessage(u'Invalid receiver: %s' % receiver) + self.browser.select_form(nr=0) + self.browser['fieldMsisdn'] = ','.join(receiver_list) + self.browser['fieldMessage'] = message.content + self.browser.submit() + + +class ComposePage(BasePage): + pass + + +class ConfirmPage(BasePage): + def confirm(self): + self.browser.location('http://www.mobile.service.bbox.bouyguestelecom.fr/services/SMSIHD/resultSendSMS.phtml') + + +class SentPage(BasePage): + pass diff --git a/weboob/backends/bouygues/pages/login.py b/weboob/backends/bouygues/pages/login.py new file mode 100644 index 0000000000..4b489d6ed3 --- /dev/null +++ b/weboob/backends/bouygues/pages/login.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Christophe Benz +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +from weboob.tools.browser import BasePage + + +__all__ = ['LoginPage'] + + +class LoginPage(BasePage): + def login(self, login, password): + self.browser.select_form(name='code') + self.browser['j_username'] = login + self.browser['j_password'] = password + self.browser.submit() diff --git a/weboob/backends/bouygues/test.py b/weboob/backends/bouygues/test.py new file mode 100644 index 0000000000..f90eff7248 --- /dev/null +++ b/weboob/backends/bouygues/test.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Christophe Benz +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +from weboob.tools.test import BackendTest + +class BouyguesTest(BackendTest): + BACKEND = 'bouygues' + + def test_bouygues(self): + pass -- GitLab