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()
'''