From 3c61089fb458e3bbe893c8d84370e36e5f194a30 Mon Sep 17 00:00:00 2001 From: Rnhmjoj Date: Sat, 13 Dec 2014 18:56:26 +0100 Subject: [PATCH] Initial commit --- pymarks.py | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 pymarks.py diff --git a/pymarks.py b/pymarks.py new file mode 100644 index 0000000..36b924c --- /dev/null +++ b/pymarks.py @@ -0,0 +1,153 @@ +# -*- 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