domingo, 24 de julio de 2011

[Python] Descargando desde rapidshare usando la api

Sólo por probar como funciona la api de rapidshare que se encuentra documentada en http://images.rapidshare.com/apidoc.txt
#!/usr/bin/env python

import sys
import urllib2
import urllib
import time
url =  "http://rapidshare.com/#!download|958tl|40"
url += "20022538|NarutoKizunaDriveSaveData.rar|222|"
url += "R~3187F38923AB1D7B76BF6D2C55ADDCEE"
print url #link de prueba
url_api = "http://api.rapidshare.com/cgi-bin/rsapi.cgi"

status_file = {0:'File not found',
1:'File OK',
3:'Server down',
4:'File marked as illegal',
5:'Direct download'
}

headers = {'User-Agent':'Firefox Mozilla 7.0'}

class opener(urllib.FancyURLopener):
version = headers['User-Agent']

def check_files(link):
#Aquí vamos a verficar que el link sea válido
#?sub=checkfiles_v1&filenames=?&files=?
try:
file_id, file_name = link.rsplit('/')[3].split('|')[2:4]
except:
print("No rapidshare link")
sys.exit(1)

params = {'filenames':file_name,
'files':file_id,
}
params_string = urllib.urlencode(params)
check_link = "%s?sub=checkfiles_v1&%s"%(url_api,params_string)
request = urllib2.Request(url=check_link, headers=headers)
conn = urllib2.urlopen(request)
file_id, file_name,size,serverid,status,short_host,fmd5 = conn.read().split(',')
print("check_files -----------------|\n")
print(status_file[int(status)])
if status == '1':
print("File ID: %s\nFile Name: %s\nsize: %s bytes"%(file_id,file_name,size))
print("Server ID: %s\nShort host: %s\nmd5_hex: %s"%(serverid,short_host,fmd5))
return file_id,file_name,size,serverid,fmd5
else:
print('Aborting download')
sys.exit(1)


def get_download_auth(file_id,file_name):
#Para usuarios con cuentas gratuitas obtenemos primero el la autorización de descarga
# y el tiempo de espera para descargar
#?sub=download_v1&filname=?&fileid=?
params = {'filename':file_name,
'fileid':file_id
}
params_string = urllib.urlencode(params)
link = "%s?sub=download_v1&%s"%(url_api,params_string)
request = urllib2.Request(url=link, headers=headers)
conn = urllib2.urlopen(request)
key, value = conn.read().split(':')
if key == "ERROR":
print("Error:%s"%value)
sys.exit(1)
host, dlauth, countdown, fmd5 = value.split(',')
print("get_download_auth ---------------|\n")
print(link)
print("\nHost: %s\ndlauth: %s\ncountdown: %s seconds"%(host,dlauth,countdown))
return host, dlauth, countdown, fmd5

def download_file(file_id,file_name,host,dlauth, countdown, fmd5):
#Descargamos el archivo
params = {'fileid':file_id,
'filename':file_name,
'dlauth':dlauth
}
params_string = urllib.urlencode(params)
download_link = "http://%s/cgi-bin/rsapi.cgi?sub=download_v1&%s"%(host,
params_string)
time.spleep(int(countdown))
print("download_file --------------|\n")
print(download_link)
download_opener = opener()
filename, headers = download_opener.retrieve(download_link, file_name)
print('Download Completed')
print("File Name: %s"%filename)
print("Headers: %s"%headers)

if __name__== '__main__':
file_id,file_name,size,serverid,fmd5 = check_files(url)
host,dlauth,countdown,fmd5 = get_download_auth(file_id,file_name)
download_file(file_id,file_name,host,dlauth,countdown, fmd5)

Salida

http://rapidshare.com/#!download|958tl|4020022538|NarutoKizunaDriveSaveData.rar|222|R~3187F38923AB1D7B76BF6D2C55ADDCEE
check_files -----------------|

File OK
File ID: 4020022538
File Name: NarutoKizunaDriveSaveData.rar
size: 222575 bytes
Server ID: 958
Short host: tg
md5_hex: 41C7C90CDA303BDBBF90A053130255F6

get_download_auth ---------------|

http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=download_v1&fileid=4020022538&filename=NarutoKizunaDriveSaveData.rar

Host: rs958tl2.rapidshare.com
dlauth: 189BDE52B120B121E40E4B492293947FFB6A0EDB426797339B9045C39527BC28EFEAE1F4FAE96472AFC73963140F1485706FC8FCE1E931D4ADB4A3B0AD3F5A4E505C6225F0C4F70DB7CA37B9D9E35886189BDE52B120B121E40E4B492293947FFB6A0EDB426797339B9045C39527BC283F2A732A85F08C6E98E793B05368EB42
countdown: 0 seconds
download_file --------------|

http://rs958tl2.rapidshare.com/cgi-bin/rsapi.cgi?sub=download_v1&filename=NarutoKizunaDriveSaveData.rar&dlauth=189BDE52B120B121E40E4B492293947FFB6A0EDB426797339B9045C39527BC28EFEAE1F4FAE96472AFC73963140F1485706FC8FCE1E931D4ADB4A3B0AD3F5A4E505C6225F0C4F70DB7CA37B9D9E35886189BDE52B120B121E40E4B492293947FFB6A0EDB426797339B9045C39527BC283F2A732A85F08C6E98E793B05368EB42&fileid=4020022538
Download Completed
File Name: NarutoKizunaDriveSaveData.rar
Headers: Date: Sun, 24 Jul 2011 19:50:00 GMT
Connection: close
Content-Type: application/octet-stream
Accept-Ranges: bytes
Content-Disposition: Attachment; filename=NarutoKizunaDriveSaveData.rar
Content-Length: 222575


Es un ejemplo sencillo y nada elaborado, que no pretende ser de uso diario, para eso tenemos plowshare (http://code.google.com/p/plowshare/).

No hay comentarios: