# -*- coding: utf-8 -*- from __future__ import print_function from getpass import getpass import mechanize import re import bs4 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) def login(user, password): '''Effetua l'autenticazione''' br.open(url_login) # Seleziona il primo form br.select_form(nr=0) # Nell'username mette l'username, nella password la password br.form['username'] = user br.form['password'] = password r = br.submit() # Se non compare 'errati' si รจ autenticati if 'errati' in r.read(): 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('') id = int(raw_input('Materia: ')) 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: user, password = raw_input('Username: '), getpass('Password: ') 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() raw_input() if __name__ == '__main__': try: main() except KeyboardInterrupt: pass