ah ah aha ci siete cascati CRETINI!
in allegato trovate un programmino che ho scritto per scaricare interi
corsi di laurea da icampus, prima della sua paventata chiusura. il
programma soffre dei seguenti problemi:
- grammaticalmente, ecumenicamente, filosoficamente scorretto
- graziosamente inefficiente
- varie ed eventuali
il programma è scritto purtroppo con un linguaggio deprecato e
deprecabile (no non sto parlando di Perl :D). la prossima versione (se
mai ci sarà) verrà scritta con L'UNICO LINGUAGGIO DI PROGRAMMAZIONE 
VALIDO, vale a dire java.. :D :D
cià
#!/usr/bin/python
import sys
import getopt
import os
import getpass
import urllib2
import urllib
from cookielib import CookieJar
cj = CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
tipo_corsi_cod = []
tipo_corsi_desc = []
tipo_cdl_cod = []
tipo_cdl_desc = []
corsi_subscribed_cod = []
corsi_subscribed_desc = []
corsi_cdl_desc = []
corsi_download = []
corsi_download_desc = []
#corso_desc = []
def login():
    # input-type values for the html form
    loop = 0
    while loop == 0:    
        try:
                login=int(raw_input('Inserisci nome utente: '))
            break
        except ValueError:
            print "Inserire un valore valido"
        
    password = getpass.getpass()
    formdata = { "login" : str(login), "password": password, "submitAuth" : "Entra" }
    data_encoded = urllib.urlencode(formdata)
    response = opener.open("http://icampus.ingegneria.unical.it/claroline/auth/login.php", data_encoded)
    content = response.read()
    if "Richiesta di autenticazione" in content:
        print "Errore nel login. Reinserire uername e password"
        return -1    
    else:
        #get PHPSESSIONID cookie
        response = opener.open("http://icampus.ingegneria.unical.it/claroline/")
        #content = response.read()
        if response.code != 200:
            print "Errore nell'autenticazione. Rieffettuare il login"
            print
            return -1
            
        print "Login effettuato con successo!"
        print
    return 0
#end login    
def get_courses_type():
    response = opener.open("http://icampus.ingegneria.unical.it/claroline/auth/courses.php?cmd=rqReg&category=")
    content = response.read()
    inizio = content.find("<h4>Corsi")
    fine = content.find("</ul>", inizio)
    content_mod = content[inizio:fine]
    inizio_cat = content_mod.find("category=", 0)
    fine_cat = content_mod.find('">', inizio_cat)
    indice = 0
#    array = []
#    array2 = []
    
    while inizio_cat != -1 or fine_cat != -1 :
        categoria = content_mod[inizio_cat+9:fine_cat]
        inizio_desc = fine_cat+2
        fine_desc = content_mod.find("</a>", inizio_desc)    
        desc=content_mod[inizio_desc:fine_desc]
    
        #array.insert(indice, categoria)
        #array2.insert(indice, desc)    
        tipo_corsi_cod.insert(indice, categoria)
        tipo_corsi_desc.insert(indice, desc)
    
        indice+=1
        inizio_cat = content_mod.find("category=", fine_cat)
            fine_cat = content_mod.find('">', inizio_cat)
    #end while
    indice = 1
    #for i in array2:
    print "Elenco tipo dei corsi di laurea"
    
    for i in tipo_corsi_desc:
            print str(indice) + " - " + str(i)
            indice+=1
    print
def choose_course_type():
    loop = 0
    while loop == 0:
        try:
                CDL=int(raw_input('Scegli il tipo di corso di laurea: '))
            if CDL > len(tipo_corsi_cod) or CDL < 0:
                        print "Inserire un valore valido per il tipo di corso di laurea"
            else:
                        break        
        except ValueError:
            print "Inserire un valore valido per il tipo di corso di laurea"
    print
    return CDL
def get_courses(cdl_type):
    #response = opener.open("http://icampus.ingegneria.unical.it/claroline/auth/courses.php?cmd=rqReg&category="+array[CDL-1])
    response = opener.open("http://icampus.ingegneria.unical.it/claroline/auth/courses.php?cmd=rqReg&category="+tipo_corsi_cod[cdl_type-1])
    content = response.read()
    inizio = content.find("<h4>Corsi")
    fine = content.find("</ul>", inizio)
    content_mod = content[inizio:fine]
    inizio_cat = content_mod.find("category=", 0)
    fine_cat = content_mod.find('">', inizio_cat)
    indice = 0
    #array = []
    #array2 = []
    while inizio_cat != -1 or fine_cat != -1 :
        codice = content_mod[inizio_cat+9:fine_cat]
        inizio_desc = fine_cat+2
        fine_desc = content_mod.find("</a>", inizio_desc)    
        desc = content_mod[inizio_desc:fine_desc]
        
        #elimino gli spazi dopo l'ultima parola della descrizione del tipo di cdl
        loop = 0
        while loop == 0:
            if desc[len(desc) -1].isspace():
                desc = desc[:len(desc)-1]
            else:    
                break
        #array.insert(indice, categoria)
        #array2.insert(indice, desc)    
        tipo_cdl_cod.insert(indice, codice)
        tipo_cdl_desc.insert(indice, desc)
        indice+=1
        inizio_cat = content_mod.find("category=", fine_cat)
            fine_cat = content_mod.find('">', inizio_cat)
    indice = 1
    for i in tipo_cdl_desc:
        print str(indice) + " - " + str(i)
        indice+=1
    print
#end get_courses_type
def choose_course():
    loop = 0
    while loop == 0:
        try:
            CDL=int(raw_input('Scegli il numero del corso di laurea: '))
            if CDL > len(tipo_cdl_cod) or CDL < 0:
                        print "Inserire un valore valido per il corso di laurea"
                        print
            else:
                break
        except ValueError:
                print "Inserire un valore valido per il corso di laurea"
            print
    
#    if CDL > len(tipo_cdl_cod) or CDL < 0:
#            print "Inserire un valore valido per il corso di laurea"
#        print
#        choose_course()
    print
    return CDL
#end choose_course
def subscribe_to_course(cdl):
    # vado al cdl selezionato
    #link = "http://icampus.ingegneria.unical.it/claroline/auth/courses.php?cmd=rqReg&category="+array[CDL-1]
    link = "http://icampus.ingegneria.unical.it/claroline/auth/courses.php?cmd=rqReg&category="+tipo_cdl_cod[cdl-1]
    response = opener.open(link)
    content = response.read()
    inizio = content.find("<h4>Elenco dei corsi</h4>")
    fine = content.find("</table>", inizio)
    content_mod = content[inizio:fine]
    inizio_riga_tab = content_mod.find("<tr>", 0)
    fine_riga_tab = content_mod.find("</tr", inizio_riga_tab)
    indice = 0
    #array3 = []  -->  corsi_subrscribed_cod
    #array4 = []  -->  corsi_download[]
    
    while inizio_riga_tab != -1 or fine_riga_tab != -1 :
        riga =  content_mod[inizio_riga_tab:fine_riga_tab]
        
        inizio_desc = riga.find("-", 0)
                fine_desc = riga.find("<br", inizio_desc)
                desc = riga[inizio_desc+2:fine_desc]
        if "Iscrizione" in riga:
            #inizio_desc = riga.find("-", 0)
                #fine_desc = riga.find("<br", inizio_desc)
                    #desc = riga[inizio_desc+2:fine_desc]
            inizio_cod = riga.find("<td>", fine_desc)
            inizio_cod = riga.find("course=", fine_desc)
                    fine_cod = riga.find('">', inizio_cod)
                    cod_corso = riga[inizio_cod+7:fine_cod]
                #array3.insert(indice, cod_corso)
            corsi_cdl_desc.append(desc)
            corsi_subscribed_cod.append(cod_corso)
            corsi_subscribed_desc.append(desc)
        elif "iscritto" in riga:
            corsi_subscribed_desc.append(desc)
            corsi_cdl_desc.append(desc)
        else:
            pass
    
        #aggiorno le condizioni per l'uscita dal ciclo
        inizio_riga_tab = content_mod.find("<tr>", fine_riga_tab)
        fine_riga_tab = content_mod.find("</tr", inizio_riga_tab)
    #end while
    #mi iscrivo a tutti i corsi a cui non sono iscritto e che non sono bloccati
    #for i in range(len(corsi_subscribed_cod)):    
    for corso in corsi_subscribed_cod:
        link = "http://icampus.ingegneria.unical.it/claroline/auth/courses.php?cmd=exReg&course="+corso
        response = opener.open(link)
        content = response.read()
        
        indice = corsi_subscribed_cod.index(corso)
        #controllo che il corso non abbia un codice per l'iscrizione
        if "codice di iscrizione" in content:            
            print "Iscrizione al corso " + corsi_subscribed_desc[indice] + " - " + corsi_subscribed_cod[indice]+" - non possibile. Necessario codice di iscrizione"
            corsi_subscribed_cod.remove(corso)
            corsi_subscribed_desc.pop(indice)
            corsi_cdl_desc.pop(indice)
        else:
            status = response.code
            if status == 200:
                print "Iscrizione al corso " + corsi_subscribed_desc[indice] + " - " + corsi_subscribed_cod[indice]+" - OK"
            else:
                print "Iscrizione al corso " + corsi_subscribed_desc[indice] + " - " + corsi_subscribed_cod[indice]+" - non riuscita. erorre "+str(status)
                corsi_subscribed_cod.remove(corso)
                corsi_subscribed_desc.pop(indice)
                corsi_cdl_desc.pop(indice)
    print
#end subscribe_to_course
def download_course(cdl):
    
    response = opener.open("http://icampus.ingegneria.unical.it/index.php")
    content = response.read()
    
    inizio = content.find('<h3 class="claroToolTitle">I miei corsi</h3>')
    fine = content.find("</ul>", inizio)
    content_mod = content[inizio:fine]
    inizio_riga = content_mod.find('<li', 0)
        fine_riga = content_mod.find("</li>", inizio_riga)
    
    while inizio_riga != -1 or fine_riga != -1:
        riga = content_mod[inizio_riga:fine_riga]
        inizio_cod = riga.find("cid=")
        fine_cod = riga.find('">', inizio_cod)
        cod = riga[inizio_cod+4:fine_cod]
        
        inizio_desc = fine_cod+2
        fine_desc = riga.find('(', inizio_desc)
        desc = riga[inizio_desc:fine_desc-1]
        
        if any(desc in s for s in corsi_cdl_desc):        
            corsi_download.append(cod)
            corsi_download_desc.append(desc)
        inizio_riga = content_mod.find('<li', fine_riga)
            fine_riga = content_mod.find("</li>", inizio_riga)
        
    print "Inizio il download dei file.."
    print
        
    #scrivo un file di indice per i file e le relative descrizioni
    dir = tipo_cdl_desc[cdl-1]
    if not os.path.exists(dir):
        os.makedirs(dir)
    outputIndex = open(dir+"/"+"indice.txt","wb")
    #download
    for corso in corsi_download:
        response = opener.open("http://icampus.ingegneria.unical.it/claroline/course/index.php?cid="+corso)
        response.read()
        #print "CODICE RISPOSTA1" + str(response.code)
        response = opener.open("http://icampus.ingegneria.unical.it/claroline/document/document.php")
        content = response.read()
        
        #controllo che ci siano documenti nella cartella Documenti e link
        inizio = content.find('<h3 class="claroToolTitle">Documenti e link</h3>')
        fine = content.find("Download la directory corrente", inizio)
        
        content_mod = content[inizio:fine]
        
        inizio = content_mod.find("Cerca")
        content_mod = content_mod[inizio:]
        
        indice = corsi_download.index(corso)
        
        #controllo se il corso non ha documenti da scaricare
        if "claroCmdDisabled" in content_mod:
            response.close()
            print "Il corso : "+corsi_download_desc[indice] +" - " + corso+" non contiene documenti. Skip.."
            print
            continue        
                    
        fine = content.find("</tbody>")
        content_mod = content[inizio:fine]
        inizio = content_mod.rfind("<tbody>")
        index = content_mod.find("<tr", inizio)
        if index == -1:
            print "Il corso : "+corsi_download_desc[indice] +" - " + corso+" non contiene documenti. Skip.."
            print
            continue
        
#        if '<span class="claroCmdDisabled"><img src="/claroline/img/save.gif' in content:
#            print "skip"
#            continue
        #print response.read()
        #print "CODICE RISPOSTA2" + str(response.code)
        response = opener.open("http://icampus.ingegneria.unical.it/claroline/document/document.php?cmd=exDownload&file=")
        #print "CODICE RISPOSTA3" + str(response.code)
        #print response.headers
        #print response.info
        meta =  response.info()
        file = meta.getheaders("Content-Disposition")
        #response.close()
        filename_meta = file[0]
        inizio = filename_meta.find("=")
        fine = filename_meta.find('"',inizio+3)
        filename = filename_meta[inizio+2:fine]
#        print "Salvataggio Corso: "+corso+" - "+filename
#        indice = corsi_download.index(corso)
        print "Salvataggio Corso: "+corsi_download_desc[indice]+" - "+corso+" - "+filename
    
        #scrivo il corso e il file nell'indice
        outputIndex = open(dir+"/"+"indice.txt","a+b")
        outputIndex.write(corsi_download_desc[indice]+" - "+filename + "\n")
        '''
        dir = tipo_cdl_desc[cdl-1]
    
        if not os.path.exists(dir):
            os.makedirs(dir)
        '''
        if os.path.exists(dir+"/"+filename):
            print "Il file esiste gia'. Tento la continuazione..."
            outputFile = open(dir+"/"+filename,"ab")
            existSize = os.path.getsize(dir+"/"+filename)
            #If the file exists, then only download the remainder
            response.close()
            opener.addheaders.append(("Range", "bytes="+str(existSize)))
            response = opener.open("http://icampus.ingegneria.unical.it/claroline/document/document.php?cmd=exDownload&file=")
            #print response.info()
            #If the file exists, but we already have the whole thing, don't download again
            if int(response.headers['Content-Length']) == existSize:
                print "File gia' interamente scaricato"
                response.close()
            else:
                print "Continuo il download precedentemente interrotto..."
                output = open(dir+"/"+filename, 'wb')
                        output.write(response.read())
                        output.close()    
            
            indice = opener.addheaders.index(("Range", "bytes="+str(existSize)))
            opener.addheaders.pop(indice)
            
        else:
            output = open(dir+"/"+filename, 'wb')
            output.write(response.read())
            output.close()
        outputIndex.close()
        response.close()
        print
#end download_course
def unsubscribe():
    print "Disiscrizione dai corsi.."
    for corso in corsi_subscribed_cod:
        response = opener.open("http://icampus.ingegneria.unical.it/claroline/auth/courses.php?cmd=exUnreg&course="+corso)
        if response.code == 200:
            print "Disiscrizione dal corso " + corso + " riuscita"
        else:
            print "Disiscrizione dal corso " + corso + " non riuscita"
    print "Disiscrizione completata!"
    print
#end unsubscribe
def unsubscribe_from_the_course(cdl):
    # vado al cdl selezionato
    #link = "http://icampus.ingegneria.unical.it/claroline/auth/courses.php?cmd=rqReg&category="+array[CDL-1]
    link = "http://icampus.ingegneria.unical.it/claroline/auth/courses.php?cmd=rqReg&category="+tipo_cdl_cod[cdl-1]
    response = opener.open(link)
    content = response.read()
    inizio = content.find("<h4>Elenco dei corsi</h4>")
    fine = content.find("</table>", inizio)
    content_mod = content[inizio:fine]
    inizio_riga_tab = content_mod.find("<tr>", 0)
    fine_riga_tab = content_mod.find("</tr", inizio_riga_tab)
    indice = 0
    #array3 = []  -->  corsi_subrscribed_cod
    #array4 = []  -->  corsi_download[]
    
    while inizio_riga_tab != -1 or fine_riga_tab != -1 :
        riga =  content_mod[inizio_riga_tab:fine_riga_tab]
        
        inizio_desc = riga.find("-", 0)
                fine_desc = riga.find("<br", inizio_desc)
                desc = riga[inizio_desc+2:fine_desc]
        if "iscritto" in riga:
            corsi_cdl_desc.append(desc)
        else:
            pass
    
        #aggiorno le condizioni per l'uscita dal ciclo
        inizio_riga_tab = content_mod.find("<tr>", fine_riga_tab)
        fine_riga_tab = content_mod.find("</tr", inizio_riga_tab)
    #end while
    
    #procedo con la disicrizione    
    corsi_unsubscribe = []
    corsi_unsubscribe_desc = []
    response = opener.open("http://icampus.ingegneria.unical.it/index.php")
    content = response.read()
    
    inizio = content.find('<h3 class="claroToolTitle">I miei corsi</h3>')
    fine = content.find("</ul>", inizio)
    content_mod = content[inizio:fine]
    inizio_riga = content_mod.find('<li', 0)
        fine_riga = content_mod.find("</li>", inizio_riga)
    
    while inizio_riga != -1 or fine_riga != -1:
        riga = content_mod[inizio_riga:fine_riga]
        inizio_cod = riga.find("cid=")
        fine_cod = riga.find('">', inizio_cod)
        cod = riga[inizio_cod+4:fine_cod]
        
        inizio_desc = fine_cod+2
        fine_desc = riga.find('(', inizio_desc)
        desc = riga[inizio_desc:fine_desc-1]
        
        if any(desc in s for s in corsi_cdl_desc):        
            corsi_unsubscribe.append(cod)
            corsi_unsubscribe_desc.append(desc)
        inizio_riga = content_mod.find('<li', fine_riga)
            fine_riga = content_mod.find("</li>", inizio_riga)
    
    print "Disiscrizione dai corsi.."
    for i in range(len(corsi_unsubscribe)):
#        for corso in corsi_unsubscribe:
                response = opener.open("http://icampus.ingegneria.unical.it/claroline/auth/courses.php?cmd=exUnreg&course="+corsi_unsubscribe[i])
        if response.code == 200:
            print "Disiscrizione dal corso " + corsi_unsubscribe_desc[i] + " - " + corsi_unsubscribe[i] + ": OK"
        else:
            print "Disiscrizione dal corso " + corsi_unsubscribe_desc[i] + " - " + corsi_unsubscribe[i] + ": ERRORE"
            
    print
        print "Disiscrizione dai corsi completata!"
        print
#end unsubscribe_from_the_course
def main(argv):    
    num_args = len(sys.argv)
    if num_args == 2:
        try:
                opts, args = getopt.getopt(argv,"hdus")
        except getopt.GetoptError:
            usage()
            sys.exit(2)
        
        for opt, arg in opts:
            if opt == '-h':
                    usage()
                    sys.exit(1)
            elif opt in ("-d"):
                icampus_download()
            elif opt in ("-u"):
                icampus_unsubscribe()
            elif opt in ("-s"):
                icampus_subscribe()
    else:
        usage()
        sys.exit(1)
#end main
def icampus_download():
    i = login()
    while i == -1:
        i = login()
    i = 0
    while i == 0:
        get_courses_type()
        tipo_cdl = choose_course_type()
        get_courses(tipo_cdl)
        cdl = choose_course()
        subscribe_to_course(cdl)
        download_course(cdl)
        unsubscribe_from_the_course(cdl)
        
        print "Opzioni"
                print "1 - Continua il downlolad di altri corsi"
                print "0 - Esci"
        print
        while i == 0:
                    try:
                            option=int(raw_input("Scegli l'opzione: "))
                            if option > 2 or option < 0:
                                    print "Inserire un valore valido per la scelta"
                                    print
                            else:
                                    break
                    except ValueError:
                            print "Inserire un valore valido per la scelta"
                            print
        print
                if option == 0:
                        logout()
                        sys.exit(0)
        
        del tipo_corsi_cod[:]
        del tipo_corsi_desc[:]
        del tipo_cdl_cod[:]
        del tipo_cdl_desc[:]
        del corsi_cdl_desc[:]
        del corsi_subscribed_cod[:]
        del corsi_subscribed_desc[:]
        del corsi_download[:]
        del corsi_download_desc[:]
#end icampus_download
def icampus_unsubscribe():
    i = login()
        while i == -1:
               i = login()
    i = 0
    while i == 0:
            get_courses_type()
               tipo_cdl = choose_course_type()
        get_courses(tipo_cdl)
               cdl = choose_course()
    
        unsubscribe_from_the_course(cdl)
    
        print "Opzioni"
                print "1 - Continua la disiscrizione da altri corsi"
                print "0 - Esci"
        print
        while i == 0:
                    try:
                            option=int(raw_input("Scegli l'opzione: "))
                            if option > 2 or option < 0:
                                    print "Inserire un valore valido per la scelta"
                                    print
                            else:
                                    break
                    except ValueError:
                            print "Inserire un valore valido per la scelta"
                            print
        print
                if option == 0:
                        logout()
                        sys.exit(0)
        
        del tipo_corsi_cod[:]
        del tipo_corsi_desc[:]
        del tipo_cdl_cod[:]
        del tipo_cdl_desc[:]
        del corsi_cdl_desc[:]
        del corsi_subscribed_cod[:]
        del corsi_subscribed_desc[:]
        del corsi_download[:]
        del corsi_download_desc[:]
#end icampus_unsubscribe    
def icampus_subscribe():
    i = login()
    while i == -1:
        i = login()
    i = 0
    while i == 0:
        get_courses_type()
        tipo_cdl = choose_course_type()
        get_courses(tipo_cdl)
        cdl = choose_course()
        subscribe_to_course(cdl)
        
        print "Opzioni"
                print "1 - Continua l'iscrizione ad altri corsi"
                print "0 - Esci"
        print
        while i == 0:
                    try:
                            option=int(raw_input("Scegli l'opzione: "))
                            if option > 2 or option < 0:
                                    print "Inserire un valore valido per la scelta"
                                    print
                            else:
                                    break
                    except ValueError:
                            print "Inserire un valore valido per la scelta"
                            print
        print
                if option == 0:
                        logout()
                        sys.exit(0)
        
        del tipo_corsi_cod[:]
        del tipo_corsi_desc[:]
        del tipo_cdl_cod[:]
        del tipo_cdl_desc[:]
        del corsi_cdl_desc[:]
        del corsi_subscribed_cod[:]
        del corsi_subscribed_desc[:]
        del corsi_download[:]
        del corsi_download_desc[:]
#end icampus_subscribe
def usage():
    print '''Usage: icampus_dump_v3 [-d | -u | -s]
            
-d : download
-u : unsubscribe
-s : subscribe only
            '''
#end usage
def logout():
    response = opener.open("http://icampus.ingegneria.unical.it/index.php?logout=true")
    if response.code == 200:
        print "Logout effettuato con successo!"
        print
        print "Ciao!"
#end logout
if __name__ == "__main__":
    main(sys.argv[1:])
'''
    if os.path.exists(dlFile):
    outputFile = open(dlFile,"ab")
    existSize = os.path.getsize(dlFile)
    #If the file exists, then only download the remainder
    myUrlclass.addheader("Range","bytes=%s-" % (existSize))
else:
    outputFile = open(dlFile,"wb")
webPage = myUrlclass.open("
http://localhost/%s" % dlFile)
#If the file exists, but we already have the whole thing, don't download again
if int(webPage.headers['Content-Length']) == existSize:
    loop = 0
    print "File already downloaded"
#progress
fullsize = headers['Content-Length']
100:fullsize = x:data
for i in range(100):
...    time.sleep(1)
...    sys.stdout.write("\r%d%%" %i)    # or print >> sys.stdout, "\r%d%%" %i,
...    sys.stdout.flush()
'''