Initial commit
This commit is contained in:
commit
3c61089fb4
153
pymarks.py
Normal file
153
pymarks.py
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user