[Ameli]&[Amelipro] Update after sites changes, and upgrade to new browser

This commit is contained in:
Kitof 2013-12-17 22:22:52 +01:00 committed by Romain Bignon
commit 10c5abc3d4
7 changed files with 251 additions and 229 deletions

View file

@ -24,10 +24,8 @@ from weboob.tools.value import ValueBackendPassword
from .browser import Amazon
__all__ = ['AmazonModule']
class AmazonModule(Module, CapShop):
NAME = 'amazon'
MAINTAINER = u'Oleg Plakhotniuk'

91
modules/ameli/browser.py Normal file → Executable file
View file

@ -17,7 +17,8 @@
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
from weboob.deprecated.browser import Browser, BrowserIncorrectPassword
from weboob.browser import LoginBrowser, URL, need_login
from weboob.exceptions import BrowserIncorrectPassword
from weboob.capabilities.bill import Detail
from decimal import Decimal
from .pages import LoginPage, HomePage, AccountPage, LastPaymentsPage, PaymentDetailsPage, BillsPage
@ -25,80 +26,66 @@ from .pages import LoginPage, HomePage, AccountPage, LastPaymentsPage, PaymentDe
__all__ = ['AmeliBrowser']
class AmeliBrowser(Browser):
PROTOCOL = 'https'
DOMAIN = 'assure.ameli.fr'
ENCODING = None
class AmeliBrowser(LoginBrowser):
BASEURL = 'https://assure.ameli.fr'
PAGES = {'.*_pageLabel=as_login_page.*': LoginPage,
'.*_pageLabel=as_accueil_page.*': HomePage,
'.*_pageLabel=as_etat_civil_page.*': AccountPage,
'.*_pageLabel=as_revele_mensuel_presta_page.*': BillsPage,
'.*_pageLabel=as_dernier_paiement_page': LastPaymentsPage,
'.*_actionOverride=%2Fportlets%2Fpaiements%2Fdetailpaiements&paiements.*': PaymentDetailsPage
}
loginp = URL('/PortailAS/appmanager/PortailAS/assure\?.*_pageLabel=as_login_page', LoginPage)
homep = URL('/PortailAS/appmanager/PortailAS/assure\?_nfpb=true&_pageLabel=as_accueil_page', HomePage)
accountp = URL('/PortailAS/appmanager/PortailAS/assure\?_nfpb=true&_pageLabel=as_info_perso_page', AccountPage)
billsp = URL('/PortailAS/appmanager/PortailAS/assure\?_nfpb=true&_pageLabel=as_revele_mensuel_presta_page', BillsPage)
paymentdetailsp = URL('/PortailAS/appmanager/PortailAS/assure\?_nfpb=true&_pageLabel=as_dernier_paiement_page&paiements_1_actionOverride=%2Fportlets%2Fpaiements%2Fdetailpaiements&paiements_1idPaiement=.*', PaymentDetailsPage)
lastpaymentsp = URL('/PortailAS/appmanager/PortailAS/assure\?_nfpb=true&_pageLabel=as_dernier_paiement_page$', LastPaymentsPage)
loginp = '/PortailAS/appmanager/PortailAS/assure?_somtc=true&_pageLabel=as_login_page'
homep = '/PortailAS/appmanager/PortailAS/assure?_nfpb=true&_pageLabel=as_accueil_page'
accountp = '/PortailAS/appmanager/PortailAS/assure?_nfpb=true&_pageLabel=as_etat_civil_page'
billsp = '/PortailAS/appmanager/PortailAS/assure?_nfpb=true&_pageLabel=as_revele_mensuel_presta_page'
lastpaymentsp = '/PortailAS/appmanager/PortailAS/assure?_nfpb=true&_pageLabel=as_dernier_paiement_page'
logged = False
is_logging = False
def do_login(self):
self.logger.debug('call Browser.do_login')
if self.logged:
return True
def home(self):
self.logger.debug('call Browser.home')
self.location(self.homep)
if ((not self.is_logged()) and (not self.is_logging)):
self.login()
self.loginp.stay_or_go()
if self.homep.is_here():
self.logged = True
return True
def is_logged(self):
self.logger.debug('call Browser.is_logged')
return self.page.is_logged()
def login(self):
self.logger.debug('call Browser.login')
# Do we really need to login?
if self.is_logged():
self.logger.debug('Already logged in')
return
if self.is_logging:
return
self.is_logging = True
self.location(self.loginp)
self.page.login(self.username, self.password)
if not self.is_logged():
self.homep.stay_or_go() # Redirection not interpreted by browser. Mannually redirect on homep
if not self.homep.is_here():
raise BrowserIncorrectPassword()
self.is_logging = False
self.logged = True
@need_login
def iter_subscription_list(self):
if not self.is_on_page(AccountPage):
self.location(self.accountp)
self.logger.debug('call Browser.iter_subscription_list')
self.accountp.stay_or_go()
return self.page.iter_subscription_list()
@need_login
def get_subscription(self, id):
self.logger.debug('call Browser.get_subscription')
assert isinstance(id, basestring)
for sub in self.iter_subscription_list():
if id == sub._id:
return sub
return None
@need_login
def iter_history(self, sub):
if not self.is_on_page(LastPaymentsPage):
self.location(self.lastpaymentsp)
self.logger.debug('call Browser.iter_history')
self.lastpaymentsp.stay_or_go()
urls = self.page.iter_last_payments()
for url in urls:
self.location(url)
assert self.is_on_page(PaymentDetailsPage)
assert self.paymentdetailsp.is_here()
for payment in self.page.iter_payment_details(sub):
yield payment
@need_login
def iter_details(self, sub):
self.logger.debug('call Browser.iter_details')
det = Detail()
det.id = sub.id
det.label = sub.label
@ -106,17 +93,21 @@ class AmeliBrowser(Browser):
det.price = Decimal('0.0')
yield det
@need_login
def iter_bills(self, sub):
self.logger.debug('call Browser.iter_bills')
if not sub._id.isdigit():
return []
if not self.is_on_page(BillsPage):
self.location(self.billsp)
return self.page.iter_bills(sub)
self.billsp.stay_or_go()
return self.page.iter_bills(sub)
@need_login
def get_bill(self, id):
self.logger.debug('call Browser.get_bill')
assert isinstance(id, basestring)
subs = self.iter_subscription_list()
for sub in subs:
for b in self.iter_bills(sub):
if id == b.id:
return b
return False

24
modules/ameli/module.py Normal file → Executable file
View file

@ -17,7 +17,6 @@
# 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 urllib
from weboob.capabilities.bill import CapBill, SubscriptionNotFound, BillNotFound, Subscription, Bill
from weboob.tools.backend import Module, BackendConfig
from weboob.tools.value import ValueBackendPassword
@ -35,13 +34,12 @@ class AmeliModule(Module, CapBill):
LICENSE = 'AGPLv3+'
BROWSER = AmeliBrowser
CONFIG = BackendConfig(ValueBackendPassword('login',
label='numero de SS',
label='Numero de SS',
masked=False),
ValueBackendPassword('password',
label='Password',
masked=True)
)
BROWSER = AmeliBrowser
def create_default_browser(self):
return self.create_browser(self.config['login'].get(),
@ -51,8 +49,7 @@ class AmeliModule(Module, CapBill):
return self.browser.iter_subscription_list()
def get_subscription(self, _id):
with self.browser:
subscription = self.browser.get_subscription(_id)
subscription = self.browser.get_subscription(_id)
if not subscription:
raise SubscriptionNotFound()
else:
@ -61,24 +58,20 @@ class AmeliModule(Module, CapBill):
def iter_bills_history(self, subscription):
if not isinstance(subscription, Subscription):
subscription = self.get_subscription(subscription)
with self.browser:
return self.browser.iter_history(subscription)
return self.browser.iter_history(subscription)
def get_details(self, subscription):
if not isinstance(subscription, Subscription):
subscription = self.get_subscription(subscription)
with self.browser:
return self.browser.iter_details(subscription)
return self.browser.iter_details(subscription)
def iter_bills(self, subscription):
if not isinstance(subscription, Subscription):
subscription = self.get_subscription(subscription)
with self.browser:
return self.browser.iter_bills(subscription)
return self.browser.iter_bills(subscription)
def get_bill(self, id):
with self.browser:
bill = self.browser.get_bill(id)
bill = self.browser.get_bill(id)
if not bill:
raise BillNotFound()
else:
@ -87,5 +80,6 @@ class AmeliModule(Module, CapBill):
def download_bill(self, bill):
if not isinstance(bill, Bill):
bill = self.get_bill(bill)
with self.browser:
return self.browser.readurl(bill._url, urllib.urlencode(bill._args))
request = self.browser.open(bill._url, stream=True)
assert(request.headers['content-type'] == "application/pdf")
return request.content

View file

@ -22,53 +22,48 @@ from datetime import datetime
import re
import urllib
from decimal import Decimal
from weboob.deprecated.browser import Page, BrokenPageError
from weboob.browser.pages import HTMLPage
from weboob.capabilities.bill import Subscription, Detail, Bill
from weboob.browser.filters.standard import CleanText
# Ugly array to avoid the use of french locale
FRENCH_MONTHS = [u'janvier', u'février', u'mars', u'avril', u'mai', u'juin', u'juillet', u'août', u'septembre', u'octobre', u'novembre', u'décembre']
class AmeliBasePage(Page):
class AmeliBasePage(HTMLPage):
def is_logged(self):
try:
self.parser.select(self.document.getroot(), 'a.logout', 1)
except BrokenPageError:
logged = False
else:
if self.doc.xpath('//a[@id="id_lien_deco"]'):
logged = True
else:
logged = False
self.logger.debug('logged: %s' % (logged))
return logged
class LoginPage(AmeliBasePage):
def login(self, login, password):
self.browser.select_form('connexionCompteForm')
self.browser["connexioncompte_2numSecuriteSociale"] = login.encode('utf8')
self.browser["connexioncompte_2codeConfidentiel"] = password.encode('utf8')
self.browser.submit()
form = self.get_form('//form[@name="connexionCompteForm"]')
form['connexioncompte_2numSecuriteSociale'] = login.encode('utf8')
form['connexioncompte_2codeConfidentiel'] = password.encode('utf8')
form.submit()
class HomePage(AmeliBasePage):
pass
class AccountPage(AmeliBasePage):
def iter_subscription_list(self):
idents = self.document.xpath('//div[contains(@class, "blocfond")]')
enfants = 0
for ident in idents:
if len(ident.xpath('.//h3')) == 0:
continue
name = CleanText('//div[@id="bloc_contenu_masituation"]/h3', replace=[('Titulaire du compte : ', '')])(self.doc)
number = re.sub('[^\d]+', '', self.doc.xpath('//div[@id="bloc_contenu_masituation"]/ul/li')[2].text)
sub = Subscription(number)
sub._id = number
sub.label = unicode(name)
sub.subscriber = unicode(name)
yield sub
name = self.parser.tocleanstring(ident.xpath('.//h3')[0])
lis = ident.xpath('.//li')
if len(lis) > 3:
number = re.sub('[^\d]+', '', ident.xpath('.//li')[3].text)
else:
enfants = enfants + 1
number = "AFFILIE" + str(enfants)
nb_childs = 0
childs = self.doc.xpath('//div[@class="bloc_infos"]')
for child in childs:
name = CleanText('.//h3[1]')(child)
nb_childs = nb_childs + 1
number = "AFFILIE" + str(nb_childs)
sub = Subscription(number)
sub._id = number
sub.label = unicode(name)
@ -78,14 +73,14 @@ class AccountPage(AmeliBasePage):
class LastPaymentsPage(AmeliBasePage):
def iter_last_payments(self):
list_table = self.document.xpath('//table[@id="tabDerniersPaiements"]')
list_table = self.doc.xpath('//table[@id="tabDerniersPaiements"]')
if len(list_table) > 0:
table = list_table[0].xpath('.//tr')
for tr in table:
list_a = tr.xpath('.//a')
if len(list_a) == 0:
continue
yield list_a[0].attrib.get('href')
yield list_a[0].attrib.get('href').replace(':443','')
class PaymentDetailsPage(AmeliBasePage):
@ -94,39 +89,86 @@ class PaymentDetailsPage(AmeliBasePage):
idx = 0
else:
idx = sub._id.replace('AFFILIE', '')
if len(self.document.xpath('//div[@class="centrepage"]/h2')) > idx or self.document.xpath('//table[@id="DetailPaiement3"]') > idx:
id_str = self.document.xpath('//div[@class="centrepage"]/h2')[idx].text.strip()
if len(self.doc.xpath('//div[@class="centrepage"]/h2')) > idx or self.doc.xpath('//table[@id="DetailPaiement3"]') > idx:
id_str = self.doc.xpath('//div[@class="centrepage"]/h2')[idx].text.strip()
m = re.match('.*le (.*) pour un montant de.*', id_str)
if m:
id_str = m.group(1)
id_date = datetime.strptime(id_str, '%d/%m/%Y').date()
id = sub._id + "." + datetime.strftime(id_date, "%Y%m%d")
table = self.document.xpath('//table[@class="tableau"]')[idx].xpath('.//tr')
table = self.doc.xpath('//table[@class="tableau"]')[idx].xpath('.//tr')
line = 1
last_date = None
for tr in table:
tds = tr.xpath('.//td')
if len(tds) == 0:
continue
date_str = tds[0].text
det = Detail()
det.id = id + "." + str(line)
det.label = unicode(tds[1].text.strip())
if date_str is None or date_str == '':
det.infos = u''
det.datetime = last_date
else:
det.infos = u'Payé ' + unicode(re.sub('[^\d,-]+', '', tds[2].text)) + u'€ / Base ' + unicode(re.sub('[^\d,-]+', '', tds[3].text)) + u'€ / Taux ' + unicode(re.sub('[^\d,-]+', '', tds[4].text)) + '%'
det.datetime = datetime.strptime(date_str, '%d/%m/%Y').date()
last_date = det.datetime
det.price = Decimal(re.sub('[^\d,-]+', '', tds[5].text).replace(',', '.'))
if len(tds) == 5:
date_str = tds[0].text
det.id = id + "." + str(line)
det.label = unicode(tds[1].text.strip())
jours = tds[2].text
if jours is None:
jours = '0'
montant = tds[3].text
if montant is None:
montant = '0'
price = tds[4].text
if price is None:
price = '0'
if date_str is None or date_str == '':
det.infos = u''
det.datetime = last_date
else:
det.infos = date_str + u' (' + unicode(re.sub('[^\d,-]+', '', jours)) + u'j) * ' + unicode(re.sub('[^\d,-]+', '', montant)) + u''
det.datetime = datetime.strptime(date_str.split(' ')[3], '%d/%m/%Y').date()
last_date = det.datetime
det.price = Decimal(re.sub('[^\d,-]+', '', price).replace(',', '.'))
if len(tds) == 6:
date_str = tds[0].text
det.id = id + "." + str(line)
det.label = unicode(tds[1].text.strip())
paye = tds[2].text
if paye is None:
paye = '0'
base = tds[3].text
if base is None:
base = '0'
taux = tds[4].text
if taux is None:
taux = '0'
price = tds[5].text
if price is None:
price = '0'
if date_str is None or date_str == '':
det.infos = u''
det.datetime = last_date
else:
det.infos = u'Payé ' + unicode(re.sub('[^\d,-]+', '', paye)) + u'€ / Base ' + unicode(re.sub('[^\d,-]+', '', base)) + u'€ / Taux ' + unicode(re.sub('[^\d,-]+', '', taux)) + '%'
det.datetime = datetime.strptime(date_str, '%d/%m/%Y').date()
last_date = det.datetime
det.price = Decimal(re.sub('[^\d,-]+', '', price).replace(',', '.'))
line = line + 1
yield det
class BillsPage(AmeliBasePage):
def iter_bills(self, sub):
table = self.document.xpath('//table[@id="tableauDecompte"]')[0].xpath('.//tr')
table = self.doc.xpath('//table[@id="relevesMensuels"]')[0].xpath('.//tr')
for tr in table:
list_tds = tr.xpath('.//td')
if len(list_tds) == 0:
@ -137,15 +179,14 @@ class BillsPage(AmeliBasePage):
amount = list_tds[1].text
if amount is None:
continue
amount = re.sub(' euros', '', amount)
amount = re.sub('[^\d,-]+', '', amount)
bil = Bill()
bil.id = sub._id + "." + date.strftime("%Y%m")
bil.date = date
bil.label = u''+amount.strip()
bil.price = Decimal('-'+amount.strip().replace(',','.'))
bil.format = u'pdf'
filedate = date.strftime("%m%Y")
bil._url = '/PortailAS/PDFServletReleveMensuel.dopdf'
bil._args = {'PDF.moisRecherche': filedate}
bil.label = date.strftime("%Y%m%d")
bil._url = '/PortailAS/PDFServletReleveMensuel.dopdf?PDF.moisRecherche='+date.strftime("%m%Y")
yield bil
def get_bill(self, bill):

90
modules/amelipro/browser.py Normal file → Executable file
View file

@ -18,65 +18,60 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import urllib
from weboob.deprecated.browser import Browser, BrowserIncorrectPassword
from weboob.browser import LoginBrowser, URL, need_login
from weboob.exceptions import BrowserIncorrectPassword
from weboob.capabilities.bill import Detail
from decimal import Decimal
from .pages import LoginPage, HomePage, AccountPage, HistoryPage, BillsPage
from .pages import LoginPage, HomePage, AccountPage, HistoryPage, BillsPage, SearchPage
__all__ = ['AmeliProBrowser']
class AmeliProBrowser(LoginBrowser):
BASEURL = 'https://espacepro.ameli.fr:443'
class AmeliProBrowser(Browser):
PROTOCOL = 'https'
DOMAIN = 'espacepro.ameli.fr'
ENCODING = None
loginp = URL('/PortailPS/appmanager/portailps/professionnelsante\?_nfpb=true&_pageLabel=vp_login_page', LoginPage)
homep = URL('/PortailPS/appmanager/portailps/professionnelsante\?_nfpb=true&_pageLabel=vp_accueil_page', HomePage)
accountp = URL('/PortailPS/appmanager/portailps/professionnelsante\?_nfpb=true&_pageLabel=vp_coordonnees_infos_perso_page', AccountPage)
billsp = URL('/PortailPS/appmanager/portailps/professionnelsante\?_nfpb=true&_pageLabel=vp_releves_mensuels_page', BillsPage)
searchp = URL('/PortailPS/appmanager/portailps/professionnelsante\?_nfpb=true&_pageLabel=vp_recherche_par_date_paiements_page', SearchPage)
historyp = URL('/PortailPS/appmanager/portailps/professionnelsante\?_nfpb=true&_windowLabel=vp_recherche_paiement_tiers_payant_portlet_1&vp_recherche_paiement_tiers_payant_portlet_1_actionOverride=%2Fportlets%2Fpaiements%2Frecherche&_pageLabel=vp_recherche_par_date_paiements_page', HistoryPage)
PAGES = {'.*_pageLabel=vp_login_page.*': LoginPage,
'.*_pageLabel=vp_accueil.*': HomePage,
'.*_pageLabel=vp_coordonnees_infos_perso_page.*': AccountPage,
'.*_pageLabel=vp_recherche_par_date_paiements_page.*': HistoryPage,
'.*_pageLabel=vp_releves_mensuels_page.*': BillsPage,
}
logged = False
loginp = '/PortailPS/appmanager/portailps/professionnelsante?_nfpb=true&_pageLabel=vp_login_page'
homep = '/PortailPS/appmanager/portailps/professionnelsante?_nfpb=true&_pageLabel=vp_accueil_book'
accountp = '/PortailPS/appmanager/portailps/professionnelsante?_nfpb=true&_pageLabel=vp_coordonnees_infos_perso_page'
billsp = '/PortailPS/appmanager/portailps/professionnelsante?_nfpb=true&_pageLabel=vp_releves_mensuels_page'
searchp = '/PortailPS/appmanager/portailps/professionnelsante?_nfpb=true&_pageLabel=vp_recherche_par_date_paiements_page'
historyp = '/PortailPS/appmanager/portailps/professionnelsante?_nfpb=true&_windowLabel=vp_recherche_paiement_tiers_payant_portlet_1&vp_recherche_paiement_tiers_payant_portlet_1_actionOverride=%2Fportlets%2Fpaiements%2Frecherche&_pageLabel=vp_recherche_par_date_paiements_page'
def do_login(self):
self.logger.debug('call Browser.do_login')
if self.logged:
return True
def home(self):
self.location(self.homep)
self.loginp.stay_or_go()
if self.homep.is_here():
self.logged = True
return True
def is_logged(self):
if self.is_on_page(LoginPage):
return False
return True
def login(self):
assert isinstance(self.username, basestring)
assert isinstance(self.password, basestring)
if not self.is_on_page(LoginPage):
self.location(self.loginp)
self.page.login(self.username, self.password)
if self.is_on_page(LoginPage):
if not self.homep.is_here():
raise BrowserIncorrectPassword()
def get_subscription_list(self):
if not self.is_on_page(AccountPage):
self.location(self.accountp)
return self.page.get_subscription_list()
self.logged = True
@need_login
def get_subscription_list(self):
self.logger.debug('call Browser.get_subscription_list')
self.accountp.stay_or_go()
return self.page.iter_subscription_list()
@need_login
def get_subscription(self, id):
assert isinstance(id, basestring)
return self.get_subscription_list()
@need_login
def iter_history(self, subscription):
if not self.is_on_page(HistoryPage):
self.location(self.searchp)
self.searchp.stay_or_go()
date_deb = self.page.document.xpath('//input[@name="vp_recherche_paiement_tiers_payant_portlet_1dateDebutRecherche"]')[0].value
date_fin = self.page.document.xpath('//input[@name="vp_recherche_paiement_tiers_payant_portlet_1dateFinRecherche"]')[0].value
date_deb = self.page.doc.xpath('//input[@name="vp_recherche_paiement_tiers_payant_portlet_1dateDebutRecherche"]')[0].value
date_fin = self.page.doc.xpath('//input[@name="vp_recherche_paiement_tiers_payant_portlet_1dateFinRecherche"]')[0].value
data = {'vp_recherche_paiement_tiers_payant_portlet_1dateDebutRecherche': date_deb,
'vp_recherche_paiement_tiers_payant_portlet_1dateFinRecherche': date_fin,
@ -85,9 +80,12 @@ class AmeliProBrowser(Browser):
'vp_recherche_paiement_tiers_payant_portlet_1codeRegime': '01',
}
self.location(self.historyp, urllib.urlencode(data))
return self.page.iter_history()
self.session.headers.update({'Content-Type': 'application/x-www-form-urlencoded'})
self.historyp.go(data=urllib.urlencode(data))
if self.historyp.is_here():
return self.page.iter_history()
@need_login
def get_details(self, sub):
det = Detail()
det.id = sub.id
@ -96,14 +94,20 @@ class AmeliProBrowser(Browser):
det.price = Decimal('0.0')
return det
@need_login
def iter_bills(self):
if not self.is_on_page(BillsPage):
self.location(self.billsp)
self.billsp.stay_or_go()
return self.page.iter_bills()
@need_login
def get_bill(self, id):
assert isinstance(id, basestring)
for b in self.iter_bills():
if id == b.id:
return b
return None
@need_login
def download_bill(self, bill):
request = self.open(bill._url, data=bill._data, stream=True)
return request.content

22
modules/amelipro/module.py Normal file → Executable file
View file

@ -17,7 +17,6 @@
# 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 urllib
from weboob.capabilities.bill import CapBill, SubscriptionNotFound, BillNotFound, Subscription, Bill
from weboob.tools.backend import Module, BackendConfig
from weboob.tools.value import ValueBackendPassword
@ -25,7 +24,6 @@ from .browser import AmeliProBrowser
__all__ = ['AmeliProModule']
class AmeliProModule(Module, CapBill):
NAME = 'amelipro'
DESCRIPTION = u'Ameli website: French Health Insurance for Professionals'
@ -41,9 +39,9 @@ class AmeliProModule(Module, CapBill):
label='Password',
masked=True)
)
BROWSER = AmeliProBrowser
def create_default_browser(self):
self.logger.settings['save_responses'] = False # Set to True to help debugging
return self.create_browser(self.config['login'].get(),
self.config['password'].get())
@ -53,8 +51,7 @@ class AmeliProModule(Module, CapBill):
def get_subscription(self, _id):
if not _id.isdigit():
raise SubscriptionNotFound()
with self.browser:
subscription = self.browser.get_subscription(_id)
subscription = self.browser.get_subscription(_id)
if not subscription:
raise SubscriptionNotFound()
else:
@ -63,24 +60,20 @@ class AmeliProModule(Module, CapBill):
def iter_bills_history(self, subscription):
if not isinstance(subscription, Subscription):
subscription = self.get_subscription(subscription)
with self.browser:
return self.browser.iter_history(subscription)
return self.browser.iter_history(subscription)
def get_details(self, subscription):
if not isinstance(subscription, Subscription):
subscription = self.get_subscription(subscription)
with self.browser:
return self.browser.get_details(subscription)
return self.browser.get_details(subscription)
def iter_bills(self, subscription):
if not isinstance(subscription, Subscription):
subscription = self.get_subscription(subscription)
with self.browser:
return self.browser.iter_bills()
return self.browser.iter_bills()
def get_bill(self, id):
with self.browser:
bill = self.browser.get_bill(id)
bill = self.browser.get_bill(id)
if not bill:
raise BillNotFound()
else:
@ -89,5 +82,4 @@ class AmeliProModule(Module, CapBill):
def download_bill(self, bill):
if not isinstance(bill, Bill):
bill = self.get_bill(bill)
with self.browser:
return self.browser.readurl(bill._url, urllib.urlencode(bill._args))
return self.browser.download_bill(bill)

98
modules/amelipro/pages.py Normal file → Executable file
View file

@ -19,10 +19,9 @@
from datetime import datetime
from decimal import Decimal
import re
import urllib
from weboob.deprecated.browser import Page
from decimal import Decimal
from weboob.browser.pages import HTMLPage
from weboob.capabilities.bill import Subscription, Detail, Bill
@ -30,25 +29,25 @@ from weboob.capabilities.bill import Subscription, Detail, Bill
FRENCH_MONTHS = [u'janvier', u'février', u'mars', u'avril', u'mai', u'juin', u'juillet', u'août', u'septembre', u'octobre', u'novembre', u'décembre']
class LoginPage(Page):
class LoginPage(HTMLPage):
def login(self, login, password):
self.browser.select_form('connexionCompteForm')
self.browser["vp_connexion_portlet_1numPS"] = login.encode('utf8')
self.browser["vp_connexion_portlet_1password"] = password.encode('utf8')
self.browser.submit()
class HomePage(Page):
form = self.get_form('//form[@name="connexionCompteForm"]')
form['vp_connexion_portlet_1numPS'] = login.encode('utf8')
form['vp_connexion_portlet_1password'] = password.encode('utf8')
form.submit()
class HomePage(HTMLPage):
def on_loaded(self):
pass
class SearchPage(HTMLPage):
def on_loaded(self):
pass
class AccountPage(Page):
def get_subscription_list(self):
ident = self.document.xpath('//div[@id="identification"]')[0]
prof = self.document.xpath('//div[@id="profession"]')[0]
class AccountPage(HTMLPage):
def iter_subscription_list(self):
ident = self.doc.xpath('//div[@id="identification"]')[0]
prof = self.doc.xpath('//div[@id="profession"]')[0]
name = ident.xpath('//p/b')[0].text.replace('&nbsp;', ' ').strip()
number = ident.xpath('//p')[1].text.replace('Cabinet', '').strip()
label = prof.xpath('//div[@class="zoneTexte"]')[0].text.strip()
@ -59,34 +58,38 @@ class AccountPage(Page):
return sub
class HistoryPage(Page):
class HistoryPage(HTMLPage):
def iter_history(self):
table = self.document.xpath('//table[contains(concat(" ", @class, " "), " cTableauTriable ")]')[0].xpath('.//tr')
for tr in table:
list_a = tr.xpath('.//a')
if len(list_a) == 0:
continue
date = tr.xpath('.//td')[0].text.strip()
lot = list_a[0].text
factures = tr.xpath('.//div[@class="cAlignGauche"]/a')
factures_lbl = ''
for a in factures:
factures_lbl = factures_lbl + a.text + ' '
montant = tr.xpath('.//div[@class="cAlignDroite"]')[0].text.strip()
det = Detail()
det.id = lot
det.label = lot
det.infos = factures_lbl
det.datetime = datetime.strptime(date, "%d/%m/%Y").date()
det.price = Decimal(montant.replace(',', '.'))
yield det
tables = self.doc.xpath('//table[contains(concat(" ", @class, " "), " cTableauTriable ")]')
if len(tables) > 0:
lines = tables[0].xpath('.//tr')
sno = 0
for tr in lines:
list_a = tr.xpath('.//a')
if len(list_a) == 0:
continue
date = tr.xpath('.//td')[0].text.strip()
lot = list_a[0].text.replace('(*)', '').strip()
if lot == 'SNL':
sno = sno + 1
lot = lot + str(sno)
factures = tr.xpath('.//div[@class="cAlignGauche"]/a')
factures_lbl = ''
for a in factures:
factures_lbl = factures_lbl + a.text.replace('(**)', '').strip() + ' '
montant = tr.xpath('.//div[@class="cAlignDroite"]')[0].text.strip()
det = Detail()
det.id = u''+lot
det.label = u''+lot
det.infos = u''+factures_lbl
det.datetime = datetime.strptime(date, "%d/%m/%Y").date()
det.price = Decimal(montant.replace(',', '.'))
yield det
class BillsPage(Page):
class BillsPage(HTMLPage):
def iter_bills(self):
table = self.document.xpath('//table[@id="releveCompteMensuel"]')[0].xpath('.//tr')
table = self.doc.xpath('//table[@id="releveCompteMensuel"]')[0].xpath('.//tr')
for tr in table:
list_tds = tr.xpath('.//td')
if len(list_tds) == 0:
@ -96,19 +99,18 @@ class BillsPage(Page):
month_str = date_str.split()[0]
date = datetime.strptime(re.sub(month_str, str(FRENCH_MONTHS.index(month_str) + 1), date_str), "%m %Y").date()
amount = tr.xpath('.//td[@class="cAlignDroite"]')[0].text
amount = re.sub('[^\d,-]+', '', amount)
for format in ('CSV', 'PDF'):
bil = Bill()
bil.id = date.strftime("%Y%m") + format
bil.date = date
bil.label = u''+amount.strip()
bil.price = Decimal('-'+amount.strip().replace(',','.'))
bil.label = u''+date.strftime("%Y%m%d")
bil.format = u''+format
filedate = date.strftime("%m%Y")
bil._url = '/PortailPS/fichier.do'
bil._args = {'FICHIER.type': format.lower() + '.releveCompteMensuel',
'dateReleve': filedate,
'FICHIER.titre': '',
}
bil._data = {'FICHIER.type': format.lower()+'.releveCompteMensuel',
'dateReleve': filedate,
'FICHIER.titre': 'Releve' + filedate
}
yield bil
def get_bill(self, bill):
self.location(bill._url, urllib.urlencode(bill._args))