bnporc[ent]: Account list
This commit is contained in:
parent
0e08ceab6e
commit
f8bf995cfd
2 changed files with 51 additions and 4 deletions
|
|
@ -31,7 +31,7 @@ class BNPEnterprise(BaseBrowser):
|
||||||
CERTHASH = '423f68a8162d1328bacb48269675d8b8577ebcc9d222860de8421792c4d222c1'
|
CERTHASH = '423f68a8162d1328bacb48269675d8b8577ebcc9d222860de8421792c4d222c1'
|
||||||
|
|
||||||
PAGES = {'%s://%s/NSAccess.*' % (PROTOCOL, DOMAIN): LoginPage,
|
PAGES = {'%s://%s/NSAccess.*' % (PROTOCOL, DOMAIN): LoginPage,
|
||||||
'%s://%s/UNE\?Action=DSP_VGLOBALE' % (PROTOCOL, DOMAIN): AccountsPage}
|
'%s://%s/UNE\?.*' % (PROTOCOL, DOMAIN): AccountsPage}
|
||||||
|
|
||||||
def home(self):
|
def home(self):
|
||||||
self.location('%s://%s/NSAccess' % (self.PROTOCOL, self.DOMAIN))
|
self.location('%s://%s/NSAccess' % (self.PROTOCOL, self.DOMAIN))
|
||||||
|
|
@ -51,7 +51,15 @@ class BNPEnterprise(BaseBrowser):
|
||||||
self.home()
|
self.home()
|
||||||
|
|
||||||
self.page.login(self.username, self.password)
|
self.page.login(self.username, self.password)
|
||||||
self.location('/UNE?Action=DSP_VGLOBALE', no_login=True)
|
self.location('/UNE?ch6=0&ch8=2000&chA=1&chh=O', no_login=True)
|
||||||
|
|
||||||
if not self.is_logged():
|
if not self.is_logged():
|
||||||
raise BrowserIncorrectPassword()
|
raise BrowserIncorrectPassword()
|
||||||
|
|
||||||
|
def get_accounts_list(self):
|
||||||
|
# options shows accounts in their original currency
|
||||||
|
# it's the "en capitaux" mode, not sure if it's the best
|
||||||
|
# the "en valeur" mode is ch8=1000
|
||||||
|
self.location('/UNE?ch6=0&ch8=2000&chA=1&chh=O')
|
||||||
|
for account in self.page.get_list():
|
||||||
|
yield account
|
||||||
|
|
|
||||||
|
|
@ -17,14 +17,25 @@
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
|
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from weboob.tools.browser import BasePage
|
from decimal import Decimal
|
||||||
from weboob.tools.captcha.virtkeyboard import MappedVirtKeyboard, VirtKeyboardError
|
|
||||||
|
|
||||||
import hashlib
|
import hashlib
|
||||||
|
from urlparse import parse_qs
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from weboob.capabilities.bank import Account
|
||||||
|
from weboob.tools.browser import BasePage
|
||||||
|
from weboob.tools.capabilities.bank.transactions import FrenchTransaction
|
||||||
|
from weboob.tools.captcha.virtkeyboard import MappedVirtKeyboard, VirtKeyboardError
|
||||||
|
from weboob.tools.misc import to_unicode
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['LoginPage', 'AccountsPage']
|
__all__ = ['LoginPage', 'AccountsPage']
|
||||||
|
|
||||||
|
|
||||||
|
class Transaction(FrenchTransaction):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BEPage(BasePage):
|
class BEPage(BasePage):
|
||||||
def get_error(self):
|
def get_error(self):
|
||||||
for title in self.document.xpath('/html/head/title'):
|
for title in self.document.xpath('/html/head/title'):
|
||||||
|
|
@ -103,4 +114,32 @@ class LoginPage(BEPage):
|
||||||
|
|
||||||
|
|
||||||
class AccountsPage(BEPage):
|
class AccountsPage(BEPage):
|
||||||
pass
|
def find_table(self):
|
||||||
|
for table in self.parser.select(self.document.getroot(), 'table', 'many'):
|
||||||
|
for td in self.parser.select(table, 'tr td'):
|
||||||
|
if td.text and td.text.strip().startswith('COMPTES COURANTS'):
|
||||||
|
return table
|
||||||
|
|
||||||
|
def get_list(self):
|
||||||
|
table = self.find_table()
|
||||||
|
# skip first tr
|
||||||
|
trs = self.parser.select(table, 'tr')
|
||||||
|
for tr in trs:
|
||||||
|
tds = self.parser.select(tr, 'td')
|
||||||
|
if len(tds) != 6:
|
||||||
|
continue
|
||||||
|
tdlabel, tdid, tdcur, tdupdated, tdbal, tdbalcur = tds
|
||||||
|
|
||||||
|
account = Account()
|
||||||
|
account.label = to_unicode(tdlabel.text_content().strip())
|
||||||
|
# this is important - and is also the last part of the id (considering spaces)
|
||||||
|
# we can't use only the link as it does not goes where we want
|
||||||
|
link = self.parser.select(tdlabel, 'a', 1)
|
||||||
|
account._link_id = parse_qs(link.attrib['href'])['ch4'][0]
|
||||||
|
account.id = to_unicode(tdid.text.strip().replace(' ', ''))
|
||||||
|
# just in case we are showing the converted balances
|
||||||
|
account._main_currency = Account.get_currency(tdcur.text)
|
||||||
|
account.balance = Decimal(Transaction.clean_amount(tdbal.text_content()))
|
||||||
|
account.currency = Account.get_currency(tdbalcur.text)
|
||||||
|
account._updated = datetime.strptime(tdupdated.text, '%d/%m/%Y')
|
||||||
|
yield account
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue