weboob-devel/modules/s2e/pages.py

97 lines
3.2 KiB
Python

# -*- coding: utf-8 -*-
# Copyright(C) 2015 Christophe Lampiné
#
# 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 <http://www.gnu.org/licenses/>.
import random
from weboob.browser.pages import HTMLPage, LoggedPage, JsonPage
class LoginPage(HTMLPage):
def generate_uuid(self):
chars = list('0123456789abcdef')
uuid = [None]*36
rnd = random.random
for i in (8, 13, 18, 23):
uuid[i] = '-'
uuid[14] = '4' # version 4
for i in range(36):
if uuid[i] is None:
r = 0 | int(rnd()*16)
idx = (((r & 0x3) | 0x8) if (i == 19) else (r & 0xf))
uuid[i] = chars[idx]
i += 1
return ''.join(uuid)
def login(self, login, password):
uuid = self.generate_uuid()
data = self.browser.calcp.open(uuid=uuid).get_data(login, password)
self.browser.profilp.open(data=data).store_sessionId()
class CalcPage(JsonPage):
def get_data(self, login, password):
convert_data = {}
for num_data in self.doc['grilleMdp']:
convert_data[num_data["nom"]] = num_data["valeur"]
encrypt_pass = ""
for char in password:
encrypt_pass += (convert_data[int(char)] + ":")
data = {'clang': self.browser.LANG,
'conversationId': self.doc["conversationId"],
'ctcc': self.browser.CTCC,
'login': login,
'password': encrypt_pass}
return data
class ProfilPage(JsonPage):
def store_sessionId(self):
self.browser.sessionId = self.doc['session']
class AccountsPage(LoggedPage, JsonPage):
def get_list(self):
accounts = {}
for entreprise in self.doc["listeEntreprise"]:
for dispositif in entreprise["listeDispositf"]: # Ceci n'est pas une erreur de frappe ;)
for fonds in dispositif["listeFonds"]:
if fonds["montantValeurEuro"] == 0:
continue
fonds["codeLong"] = entreprise["codeEntreprise"] + dispositif["codeDispositif"] + fonds["codeSupport"]
if fonds["codeLong"] in accounts:
accounts[fonds["codeLong"]]["montantValeurEuro"] += fonds["montantValeurEuro"]
else:
accounts[fonds["codeLong"]] = fonds
return accounts
class HistoryPage(LoggedPage, JsonPage):
def get_transactions(self):
for operation in self.doc["listeOperations"]:
yield operation
class I18nPage(JsonPage):
def load_i18n(self):
self.browser.i18n = self.doc["i18n"]