132 lines
4.9 KiB
Python
132 lines
4.9 KiB
Python
import os
|
|
from datetime import datetime, date, timedelta
|
|
import logging
|
|
|
|
from splinter import Browser
|
|
|
|
|
|
class Messagenet(object):
|
|
BASE = 'https://www.messagenet.com'
|
|
|
|
def __init__(self, browser_driver='chrome'):
|
|
self.browser_driver = browser_driver
|
|
self._browser = None
|
|
|
|
# roba pitonesca {{{
|
|
def __enter__(self):
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
if self._browser is not None:
|
|
if os.getenv('MN_DEBUG', '0') == '1':
|
|
raw_input('Premi un tasto per uscire')
|
|
self._browser.quit()
|
|
self._browser = None
|
|
# }}}
|
|
|
|
@property
|
|
def browser(self):
|
|
if self._browser is None:
|
|
self._browser = Browser(self.browser_driver)
|
|
return self._browser
|
|
|
|
def login(self, user, password):
|
|
self.browser.visit(self.BASE)
|
|
self.browser.fill('userid', user)
|
|
self.browser.fill('password', password)
|
|
self.browser.find_by_css('#login button').click()
|
|
|
|
def get_inbound_calls(self):
|
|
'''you cannot call this unless you have already logged in'''
|
|
b = self.browser
|
|
b.visit(self.BASE + '/voip/log/?chiamate=ricevute')
|
|
# estendo la ricerca {{{
|
|
longest = b.find_by_css('select[name="data"] option:last-child')
|
|
longest.click()
|
|
b.find_by_css('button.search_button').click()
|
|
# }}}
|
|
|
|
rows = b.find_by_css('.sepLog')
|
|
for r in rows:
|
|
ok = r.has_class('statusOK')
|
|
cells = r.find_by_tag('td')
|
|
call_type_desc = cells[0].value
|
|
date = cells[1].value
|
|
# avanzato: prendi la data {{{2
|
|
# }}}
|
|
call_from = cells[2].value
|
|
call_to = cells[3].value
|
|
duration = cells[4].value
|
|
yield {'status': (ok, call_type_desc), 'date': date,
|
|
'from': call_from, 'to': call_to, 'duration': duration}
|
|
|
|
def get_outbound_calls(self):
|
|
'''you cannot call this unless you have already logged in'''
|
|
b = self.browser
|
|
b.visit(self.BASE + '/voip/log/?chiamate=effettuate')
|
|
# estendo la ricerca {{{
|
|
longest = b.find_by_css('select[name="data"] option:last-child')
|
|
longest.click()
|
|
b.find_by_css('button.search_button').click()
|
|
# }}}
|
|
|
|
rows = b.find_by_css('.sepLog')
|
|
for r in rows:
|
|
ok = r.has_class('statusOK')
|
|
cells = r.find_by_tag('td')
|
|
call_type_desc = cells[0].value
|
|
human_date = cells[1].value
|
|
# avanzato: parsa la data {{{2
|
|
try:
|
|
parsed_date = datetime.strptime(human_date, '%Y-%m-%d, %H.%M.%S')
|
|
except ValueError as exc:
|
|
print 'parsing date', exc
|
|
if human_date.startswith('Oggi, '):
|
|
d = date.today()
|
|
t = datetime.strptime(human_date.split(',', 1)[1].strip(),
|
|
'%H.%M.%S').time()
|
|
parsed_date = datetime.combine(d, t)
|
|
elif human_date.startswith('Ieri, '):
|
|
d = date.today() - timedelta(days=1)
|
|
t = datetime.strptime(human_date.split(',', 1)[1].strip(),
|
|
'%H.%M.%S').time()
|
|
parsed_date = datetime.combine(d, t)
|
|
else:
|
|
logging.error("Could not parse date '%s'" % human_date)
|
|
parsed_date = None
|
|
# }}}
|
|
call_from = cells[2].value
|
|
deviata = bool(cells[3].value)
|
|
call_to = cells[4].value
|
|
duration = cells[5].value
|
|
yield {'status': (ok, call_type_desc),
|
|
'date': human_date, 'datetime': parsed_date,
|
|
'deviata': deviata,
|
|
'from': call_from, 'to': call_to, 'duration': duration}
|
|
|
|
def set_forward(self, to):
|
|
b = self.browser
|
|
b.visit(self.BASE + '/voip/numeri')
|
|
if to is False:
|
|
print '\n'.join([meth for meth in dir(b) if '_by_' in meth])
|
|
b.find_by_name('deviazione').find_by_value('disattiva').click()
|
|
else:
|
|
# assumiamo che il numero sia valido
|
|
b.find_by_name('deviazione').find_by_value('numero').click()
|
|
b.find_by_id('numdev').fill(to)
|
|
b.find_by_css('button[type="submit"]').click()
|
|
|
|
def get_forward(self):
|
|
b = self.browser
|
|
b.visit(self.BASE + '/voip/numeri')
|
|
fw_type = b.find_by_name('deviazione').first.value
|
|
fw_all = bool(int(b.find_by_id('tutte').value))
|
|
fw_to = b.find_by_id('numdev').value
|
|
return {'type': fw_type, 'all': fw_all, 'to': fw_to}
|
|
|
|
def get_currency(self):
|
|
b = self.browser
|
|
b.visit(self.BASE + '/voip/numeri')
|
|
moneystring = b.find_by_css('.currency span').first.value
|
|
# FIXME: should do a proper parsing based on LC_CURRENCY
|
|
return float(moneystring.replace(',', '.'))
|