diff --git a/weboob/backends/cragr/__init__.py b/weboob/backends/cragr/__init__.py new file mode 100644 index 00000000..7a583160 --- /dev/null +++ b/weboob/backends/cragr/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +""" +Copyright(C) 2010 Romain Bignon + +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 .backend import CragrBackend diff --git a/weboob/backends/cragr/backend.py b/weboob/backends/cragr/backend.py new file mode 100644 index 00000000..22c76aa9 --- /dev/null +++ b/weboob/backends/cragr/backend.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- + +""" +Copyright(C) 2010 Romain Bignon + +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.backend import Backend +from weboob.capabilities.bank import ICapBank, AccountNotFound + +from .browser import Cragr + +class CragrBackend(Backend, ICapBank): + NAME = 'cragr' + MAINTAINER = 'Romain Bignon' + EMAIL = 'romain@peerfuse.org' + VERSION = '1.0' + LICENSE = 'GPLv3' + + CONFIG = {'login': Backend.ConfigField(description='Account ID'), + 'password': Backend.ConfigField(description='Password of account', is_masked=True), + 'website': Backend.ConfigField(description='What website to use', default='m.lefil.com'), + } + browser = None + + def need_browser(func): + def inner(self, *args, **kwargs): + if not self.browser: + self.browser = Cragr(self.config['website'], self.config['login'], self.config['password']) + + return func(self, *args, **kwargs) + return inner + + @need_browser + def iter_accounts(self): + for account in self.browser.get_accounts_list(): + yield account + + @need_browser + def get_account(self, _id): + try: + _id = long(_id) + except ValueError: + raise AccountNotFound() + else: + account = self.browser.get_account(_id) + if account: + return account + else: + raise AccountNotFound() + + @need_browser + def iter_operations(self, account): + """ Not supported yet """ + return iter([]) diff --git a/weboob/backends/cragr/browser.py b/weboob/backends/cragr/browser.py new file mode 100644 index 00000000..be1f1654 --- /dev/null +++ b/weboob/backends/cragr/browser.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- + +""" +Copyright(C) 2009-2010 Romain Bignon + +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 Browser, BrowserIncorrectPassword +from weboob.backends.cragr import pages + +# Browser +class Cragr(Browser): + PROTOCOL = 'https' + ENCODING = 'utf-8' + USER_AGENT = 'Wget/1.11.4' + + is_logging = False + + def __init__(self, website, *args, **kwargs): + self.DOMAIN = website + self.PAGES = {'https://%s/' % website: pages.LoginPage, + 'https://%s/.*\.c.*' % website: pages.AccountList, + } + Browser.__init__(self, *args, **kwargs) + + def home(self): + self.location('https://m.lefil.com/') + + def is_logged(self): + return not self.is_on_page(pages.LoginPage) or self.is_logging + + def login(self): + assert isinstance(self.username, (str,unicode)) + assert isinstance(self.password, (str,unicode)) + + if not self.is_on_page(pages.LoginPage): + self.home() + + self.is_logging = True + self.page.login(self.username, self.password) + + if self.is_on_page(pages.LoginPage): + raise BrowserIncorrectPassword() + self.is_logging = False + + def get_accounts_list(self): + if not self.is_on_page(pages.AccountsList): + self.home() + return self.page.get_list() + + def get_account(self, id): + assert isinstance(id, (int, long)) + + l = self.get_accounts_list() + for a in l: + if a.id == id: + return a + + return None + + #def get_coming_operations(self, account): + # if not self.is_on_page(pages.AccountComing) or self.page.account.id != account.id: + # self.location('/NS_AVEEC?ch4=%s' % account.link_id) + # return self.page.get_operations() diff --git a/weboob/backends/cragr/pages/__init__.py b/weboob/backends/cragr/pages/__init__.py new file mode 100644 index 00000000..995d61a5 --- /dev/null +++ b/weboob/backends/cragr/pages/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- + +""" +Copyright(C) 2010 Romain Bignon + +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 .accounts_list import AccountsList +from .login import LoginPage diff --git a/weboob/backends/cragr/pages/accounts_list.py b/weboob/backends/cragr/pages/accounts_list.py new file mode 100644 index 00000000..bd63b04f --- /dev/null +++ b/weboob/backends/cragr/pages/accounts_list.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- + +""" +Copyright(C) 2010 Romain Bignon + +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.capabilities.bank import Account +from weboob.tools.browser import BasePage + +class AccountsList(BasePage): + def loaded(self): + pass + + def get_list(self): + l = [] + for div in self.document.getiterator('div'): + if div.attrib.get('class', '') == 'dv' and div.getchildren()[0].tag == 'a': + a = div.getchildren()[0] + account = Account() + account.setLabel(a.text.strip()) + account.setID(long(a.getchildren('br')[0].tail.strip())) + balance = a.getchildren('span')[0].getchildren('span')[0].getchildren('b')[0].text + balance = balance.replace(',', '.').replace(u' ', '').replace(u' €', '') + account.setBalance(float(balance)) + return l diff --git a/weboob/backends/cragr/pages/login.py b/weboob/backends/cragr/pages/login.py new file mode 100644 index 00000000..249b88d6 --- /dev/null +++ b/weboob/backends/cragr/pages/login.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +""" +Copyright(C) 2010 Romain Bignon + +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 ClientForm + +from weboob.tools.browser import BasePage + +class LoginPage(BasePage): + def loaded(self): + pass + + def login(self, login, password): + self.browser.select_form() + try: + self.browser['numero'] = login + self.browser['code'] = password + except ClientForm.ControlNotFoundError: + try: + self.browser['userLogin'] = login + self.browser['userPassword'] = password + except ClientForm.ControlNotFoundError: + print 'WTF' + return + + self.browser.submit() + +class ConfirmPage(BasePage): + pass