Die Klasse ist mit der FH Aachen getestet. Für andere Hochschulen sind evtl. einige Modifikationen nötig.
Code: Alles auswählen
#
# usage: import qis
# qis = qis.Qis ('user', 'passwort')
# print qis.get_notenspiegel ()
#
import httplib, urllib, re
def unescape (s):
if '&' not in s:
return s
s = s.replace("<", "<")
s = s.replace(">", ">")
s = s.replace("'", "'")
s = s.replace(""", '"')
s = s.replace(" ", " ")
s = s.replace("&", "&")
return s
class Qis:
def __init__(self, qis_user, qis_password):
conn = httplib.HTTPSConnection ('www.qis.fh-aachen.de')
# Anmeldeseite aufrufen um die Sessionid rauszufinden
conn.request('GET', '/qisserver/rds?state=user&type=0&application=lsf')
response = conn.getresponse()
response.read ()
params_anmeldung = urllib.urlencode ({'username':"%s" % qis_user, 'password': "%s" % qis_password,'submit':'Ok'})
headers_anmeldung = {"Content-type": "application/x-www-form-urlencoded", "Cookie" : "JSESSIONID=%s" % re.search ('JSESSIONID=(.*?);', response.getheader ('Set-Cookie')).group (1)}
# Anmeldung durchfuehren
conn.request ('POST', "/qisserver/rds?state=user&type=1", params_anmeldung, headers_anmeldung)
response = conn.getresponse ()
# Sessionid aktualisieren
header_cookie = {"Cookie" : "JSESSIONID=%s" % re.search ('JSESSIONID=(.*?);', response.getheader ('Set-Cookie')).group (1)}
response.read ()
# Menue abrufen
conn.request ('GET', "/qisserver/rds?state=user&type=0&category=menu.browse&startpage=portal.vm", None, header_cookie)
response = conn.getresponse ()
content = response.read ()
asi = re.search (';asi=(.*?)\"', content).group (1)
# Notenspiegel abrufen
conn.request ('GET', "/qisserver/rds?state=htmlbesch&moduleParameter=Student&menuid=notenspiegel&asi=%s" % asi, None, header_cookie)
response = conn.getresponse ()
self.notenspiegel = response.read ()
# Abmeldung
conn.request ('GET', "/qisserver/rds?state=user&type=4&category=auth.logout&menuid=logout", None, header_cookie)
response = conn.getresponse()
response.read ()
# Verbindung beenden
conn.close ()
def get_notenspiegel (self, output_codec = 'utf8'):
if not self.notenspiegel:
return None
pruefungen = []
a = re.findall ('class=\"posrecords\"(.*?)</tr>', self.notenspiegel, re.S)
for b in a:
pruefung = {}
c = re.findall ('class=\"posrecords\">(.*?)</td>', b, re.S)
pruefung["Fach"] = unicode (unescape (c[0]), "cp1252" ).encode (output_codec)
pruefung["Semester"] = unicode (unescape (c[1]), "cp1252" ).encode (output_codec)
pruefung["Datum"] = unicode (unescape (c[2]), "cp1252" ).encode (output_codec)
pruefung["Note"] = unicode (unescape (c[3]), "cp1252" ).encode (output_codec)
pruefung["Credits"] = unicode (unescape (c[4]), "cp1252" ).encode (output_codec)
pruefung["Status"] = unicode (unescape (c[5]), "cp1252" ).encode (output_codec)
pruefung["Versuch"] = unicode (unescape (c[6]), "cp1252" ).encode (output_codec)
pruefungen.append (pruefung)
return pruefungen
Wenn man das bei jedem Rechnerstart ausführt, wird man über neue Noten informiert.
Code: Alles auswählen
import sys, qis, gtk
check = False
if len (sys.argv) > 1 and sys.argv [1] == "check":
check = True
qis = qis.Qis ('user', 'passwort')
pruefungen = qis.get_notenspiegel ()
anzahl = 0
if check:
try:
fo = file ('anzahl_noten.dat')
anzahl = int (fo.read ())
fo.close ()
except:
pass
if not check or len (pruefungen) > anzahl:
if check:
file ('anzahl_noten.dat', "w").write (str (len (pruefungen)))
text = ""
for pruefung in pruefungen:
if float (pruefung["Note"]) <= 4.0:
text = text + "<span size=\"large\"><i>%s</i></span>\nSemester: %s Datum: %s\nNote: <span foreground=\"green\"><b>%s</b></span> Credits: %s\nStatus: %s Versuch: %s \n\n" % (pruefung["Fach"],pruefung["Semester"],pruefung["Datum"],pruefung["Note"],pruefung["Credits"],pruefung["Status"],pruefung["Versuch"])
else:
text = text + "<span size=\"large\"><i>%s</i></span>\nSemester: %s Datum: %s\nNote: <span foreground=\"red\"><b>%s</b></span> Credits: %s\nStatus: %s Versuch: %s \n\n" % (pruefung["Fach"],pruefung["Semester"],pruefung["Datum"],pruefung["Note"],pruefung["Credits"],pruefung["Status"],pruefung["Versuch"])
mbox = gtk.MessageDialog (None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, text)
mbox.set_markup (text)
try:
response = mbox.run()
finally:
mbox.hide()
mbox.destroy()