From b5e016f9bab2c66fa7969688e344f981165f40cd Mon Sep 17 00:00:00 2001 From: nicolas duhamel Date: Mon, 15 Nov 2010 15:18:34 +0100 Subject: [PATCH] finished to use BaseBrowser (closes #422) --- weboob/backends/bp/backend.py | 8 ++++ weboob/backends/bp/browser.py | 49 ++++++++++++++++++----- weboob/backends/bp/pages/__init__.py | 6 ++- weboob/backends/bp/pages/login.py | 7 +++- weboob/backends/bp/pages/transfer.py | 60 ++++++++++++++++++++++++++++ 5 files changed, 118 insertions(+), 12 deletions(-) create mode 100644 weboob/backends/bp/pages/transfer.py diff --git a/weboob/backends/bp/backend.py b/weboob/backends/bp/backend.py index 858b0f62..9e81c486 100644 --- a/weboob/backends/bp/backend.py +++ b/weboob/backends/bp/backend.py @@ -49,4 +49,12 @@ class BPBackend(BaseBackend, ICapBank): def iter_history(self, account): for history in self.browser.get_history(account): yield history + + def transfer(self, id_from, id_to, amount, reason=None): + from_account = self.get_account(id_from) + to_account = self.get_account(id_to) + + #TODO: retourner le numero du virement + #TODO: support the 'reason' parameter + return self.browser.make_transfer(from_account, to_account, amount) diff --git a/weboob/backends/bp/browser.py b/weboob/backends/bp/browser.py index 8e02969f..c494a874 100644 --- a/weboob/backends/bp/browser.py +++ b/weboob/backends/bp/browser.py @@ -16,10 +16,13 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -from weboob.tools.browser import BaseBrowser#, BrowserIncorrectPassword +from datetime import datetime -from .pages import LoginPage, LoggedPage, CookiePage, AccountList, AccountHistory +from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword, BrowserBanned +from .pages import LoginPage, LoggedPage, CookiePage, AccountList, AccountHistory, BadLoginPage, AccountDesactivate, TransferChooseAccounts, CompleteTransfer, TransferConfirm, TransferSummary + +from weboob.capabilities.bank import Transfer __all__ = ['BPbrowser'] @@ -28,14 +31,19 @@ class BPbrowser(BaseBrowser): DOMAIN = 'voscomptesenligne.labanquepostale.fr' PROTOCOL = 'https' ENCODING = None # refer to the HTML encoding - PAGES = { r'.*wsost/OstBrokerWeb/loginform.*': LoginPage, - r'.*voscomptes/canalXHTML/identif.ea': LoggedPage, - r'.*voscomptes/canalXHTML/releve/syntheseAssurancesEtComptes.ea': CookiePage, - r'.*voscomptes/canalXHTML/releve/liste_comptes.jsp': AccountList, - r'.*canalXHTML/relevesCCP/.*': AccountHistory, - r'.*canalXHTML/relevesEpargnes/.*': AccountHistory, - + PAGES = { r'.*wsost/OstBrokerWeb/loginform.*': LoginPage, + r'.*voscomptes/canalXHTML/identif\.ea.*': LoggedPage, + r'.*voscomptes/canalXHTML/releve/syntheseAssurancesEtComptes\.ea': CookiePage, + r'.*voscomptes/canalXHTML/releve/liste_comptes\.jsp': AccountList, + r'.*canalXHTML/relevesCCP/.*': AccountHistory, + r'.*canalXHTML/relevesEpargnes/.*': AccountHistory, + r'.*ost/messages\.CVS\.html\?param=0x132120c8.*' : BadLoginPage, + r'.*ost/messages\.CVS\.html\?param=0x132120cb.*' : AccountDesactivate, + r'.*/virementsafran/aiguillage/saisieComptes\.ea.*': TransferChooseAccounts, + r'.*/virementsafran/aiguillage/2-saisieComptes\.ea.*' : CompleteTransfer, + r'.*/virementsafran/virementnational/2-virementNational\.ea.*' : TransferConfirm, + r'.*/virementsafran/virementnational/4-virementNational\.ea.*' : TransferSummary, } def home(self): @@ -50,6 +58,12 @@ class BPbrowser(BaseBrowser): self.page.login(self.username, self.password) + + if self.is_on_page(BadLoginPage): + raise BrowserIncorrectPassword() + if self.is_on_page(AccountDesactivate): + raise BrowserBanned() + def get_accounts_list(self): self.location("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/authentification/liste_contrat_atos.ea") self.location("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/releve/liste_comptes.jsp") @@ -66,3 +80,20 @@ class BPbrowser(BaseBrowser): def get_history(self, Account): self.location(Account.link_id) return self.page.get_history() + + def make_transfer(self, from_account, to_account, amount): + self.location("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/virementsafran/aiguillage/saisieComptes.ea") + self.page.set_accouts(from_account, to_account) + + #TODO: Check + self.page.complete_transfer(amount) + + self.page.confirm() + + id_transfer = self.page.get_transfer_id() + transfer = Transfer(id_transfer) + transfer.amount = amount + transfer.origin = from_account.label + transfer.recipient = to_account.label + transfer.date = datetime.now() + return transfer diff --git a/weboob/backends/bp/pages/__init__.py b/weboob/backends/bp/pages/__init__.py index cc471da6..f7aeebee 100644 --- a/weboob/backends/bp/pages/__init__.py +++ b/weboob/backends/bp/pages/__init__.py @@ -15,9 +15,11 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -from .login import LoginPage, LoggedPage +from .login import LoginPage, LoggedPage, BadLoginPage, AccountDesactivate from .cookie import CookiePage from .accountlist import AccountList from .accounthistory import AccountHistory -__all__ = ['LoginPage', 'LoggedPage', 'CookiePage', "AccountList", 'AccountHistory'] +from .transfer import TransferChooseAccounts, CompleteTransfer, TransferConfirm, TransferSummary + +__all__ = ['LoginPage', 'LoggedPage', 'CookiePage', "AccountList", 'AccountHistory', 'BadLoginPage', 'AccountDesactivate', 'TransferChooseAccounts', 'CompleteTransfer', 'TransferConfirm', 'TransferSummary'] diff --git a/weboob/backends/bp/pages/login.py b/weboob/backends/bp/pages/login.py index a0fa8f8a..f7442e18 100644 --- a/weboob/backends/bp/pages/login.py +++ b/weboob/backends/bp/pages/login.py @@ -20,7 +20,7 @@ import hashlib from weboob.tools.browser import BasePage -__all__ = ['LoginPage', 'LoggedPage'] +__all__ = ['LoginPage', 'LoggedPage', 'BadLoginPage', 'AccountDesactivate'] def md5(file): @@ -53,3 +53,8 @@ class LoginPage(BasePage): class LoggedPage(BasePage): pass + +class BadLoginPage(BasePage): + pass +class AccountDesactivate(BasePage): + pass diff --git a/weboob/backends/bp/pages/transfer.py b/weboob/backends/bp/pages/transfer.py new file mode 100644 index 00000000..d7a280c5 --- /dev/null +++ b/weboob/backends/bp/pages/transfer.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Nicolas Duhamel +# +# 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 + +import re + +__all__ = ['TransferChooseAccounts', 'CompleteTransfer', 'TransferConfirm', 'TransferSummary'] + + +class TransferChooseAccounts(BasePage): + + def set_accouts(self, from_account, to_account): + self.browser.select_form(name="AiguillageForm") + self.browser["idxCompteEmetteur"] = [from_account.id] + self.browser["idxCompteReceveur"] = [to_account.id] + self.browser.submit() + + +class CompleteTransfer(BasePage): + + def complete_transfer(self, amount): + self.browser.select_form(name="VirementNationalForm") + self.browser["montant"] = str(amount) + self.browser.submit() + +class TransferConfirm(BasePage): + + def confirm(self): + self.browser.location("https://voscomptesenligne.labanquepostale.fr/voscomptes/canalXHTML/virementsafran/virementnational/4-virementNational.ea") + +class TransferSummary(BasePage): + + def get_transfer_id(self): + pattern = "Votre virement N.+ ([0-9]+) " + regex = re.compile(pattern) + #HACK for deal with bad encoding ... + try: + text = self.document.xpath("//form/div/p")[0].text + except UnicodeDecodeError, error: + text = error.object + match = regex.search(text) + id_transfer = match.groups()[0] + return id_transfer +