pymarks/pymarks.py

150 lines
3.9 KiB
Python
Raw Normal View History

2014-12-13 18:56:26 +01:00
from getpass import getpass
2014-12-13 18:58:14 +01:00
from robobrowser import RoboBrowser
from re import compile
2014-12-13 18:56:26 +01:00
url = 'https://galilei-cr-sito.registroelettronico.com/'
url_main = url + 'news'
url_login = url + 'login'
url_voti = url + 'votes/?s='
materie = {}
br = mechanize.Browser()
br.set_handle_robots(False)
2014-12-13 18:58:14 +01:00
br = RoboBrowser(history=False)
2014-12-13 18:56:26 +01:00
def login(user, password):
'''Effetua l'autenticazione'''
br.open(url_login)
2014-12-13 18:58:14 +01:00
# Fill in the login form
form = br.get_form(id='loginform')
form['username'].value = user
form['password'].value = password
br.submit_form(form)
2014-12-13 18:56:26 +01:00
# Se non compare 'errati' si รจ autenticati
2014-12-13 18:58:14 +01:00
if 'errati' in br.response.text:
2014-12-13 18:56:26 +01:00
return False
else:
return True
def medie():
'''Calcola la medie per ogni materia'''
medie = []
for i in materie.keys():
medie.append(_media(get_voti(i)))
return medie
def get_nome():
'''Estrapola [cit.] il nome dello studente dal registro'''
news = br.open(url_main)
# Prende il contenuto del tag 'h2' con ID 'student_name'
soup = bs4.BeautifulSoup(news)
nome = soup.find('h2', {'id': 'student_name'}, text=True).contents[0].split()
return ' '.join([nome[-1]] + nome[:-1])
def get_materie():
'''Resituisce il dizionario delle materie dello studente'''
br.open(url_main)
links_materie = br.links(url_regex=re.compile('votes/\?s=\d+'))
return {i.text.capitalize(): i.url[-7::] for i in links_materie}
def get_voti(materia):
'''Restituisce la lista dei voti per materia'''
html = br.open(url_voti + str(materie[materia]))
testo = bs4.BeautifulSoup(html).get_text()
regex = re.compile('(\d{1,2}(\+|-|\.\d{1,2})?) \(.{3}\)')
voti = [i[0] for i in re.findall(regex, testo)]
return _converti(voti)
def _converti(lista):
'''Converte la lista con i voti da str in float'''
voti = []
for i in lista:
try:
# Voti del tipo 6.5
voti.append(float(i))
# Voti del tipo 7+
except ValueError:
if i == 'A':
pass
elif i == 'NC':
voti.append(0)
elif i[1] == '+':
voti.append(float(i[0]) + 0.25)
elif i[1] == '-':
voti.append(float(i[0]) - 0.25)
elif i[2] == '-':
voti.append(float(i[:-1]) - 0.25)
return voti
def _media(voti):
'''Calcola la media di una lista di voti'''
return sum(voti) / len(voti)
def _mostra_medie():
'''Mostra le medie per ogni materia e generale [Procedura]'''
voti = medie()
media_generale = _media(voti)
# Scrive numero, nome e media per ogni materia
print('Media generale: %.2f' % media_generale)
for id, (materia, voto) in enumerate(zip(materie.keys(), voti)):
print('%d. %s - Media: %.2f' % (id + 1, materia, voto))
def _mostra_voti():
'''Mostra i voti per la materie scelta [Procedura]'''
for i, materia in enumerate(materie.keys()):
print('%d. %s' % (i + 1, materia))
while True:
print('')
2014-12-13 18:58:14 +01:00
id = int(input('Materia: '))
2014-12-13 18:56:26 +01:00
if id in range(15):
nome = materie.keys()[id - 1]
voti = get_voti(nome)
print(nome)
print('Voti:', *voti)
print('Media: %.2f' % _media(voti))
else:
print('Inserire numero corretto!')
def main():
# Autenticazione
logged = False
while not logged:
2014-12-13 18:58:14 +01:00
user, password = input('Username: '), getpass('Password: ')
2014-12-13 18:56:26 +01:00
logged = login(user, password)
if not logged:
print('Autenticazione fallita, riprovare.')
print('Connesso come %s.\n' % get_nome())
global materie
materie = get_materie()
#Menu
while True:
scelta = raw_input('Scegli [v]oti o [m]edie: ')
print('')
if scelta == 'v':
_mostra_voti()
elif scelta == 'm':
_mostra_medie()
2014-12-13 18:58:14 +01:00
input()
2014-12-13 18:56:26 +01:00
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
2014-12-13 18:58:14 +01:00
print('')