[Ciotoflow] Promemoria: Ciccillo ti ha invitato ad iscrivert…

Delete this message

Reply to this message
Autore: Ciccillo
Data:  
To: Flussi di ciotia.
Oggetto: [Ciotoflow] Promemoria: Ciccillo ti ha invitato ad iscriverti a Facebook
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()


'''