Jugando con Youtube y Python
Andaba necesitando un programa para descargarme los videos de youtube y como no siempre andaba en firefox ( eso aparte del hecho que ultimamente no me han funcionado muy bien el videoDownloader ) me vi en la tortuosa necesidad de escribirme uno.
Mi script, enteramente hecho en python, realizar una busqueda de un parametro oculto en la pagina web del video de youtube, el parametro t. Este parametro nos sirve para hacer la consulta al servidor youtube y que este nos indique donde esta el video a descargar.
Haber, expliquemos un poco como funciona esto de youtube.
Youtube tiene una interfaz web que todos conocemos www.youtube.com. Cuando alguien quiere ver algun video de youtube, pues se va a la web y busca el video. Una vez ahi tenemos una url algo asi :
http://youtube.com/watch?v=Fa6r4Y2eGzQ
puede haber otros parametros extra en la url, pero de momento solo nos interesa el parametro v.
Este parametro indica el id del video. Sin embargo, si alguien penso que con solo eso basta, pues se equivoco.
Youtube tiene varios servidores, donde almacena el contenido de los videos y desde donde los sirve cuando estos son solicitados. Sin embargo, y muy al contrario de lo que se podria creer estos servidores no son espejos, es decir, no todos tienen todos los videos.
Asi es que para encontrar el servidor exacto donde se encuentra el video, youtube usa un simpatico truco.
Recuerdan que antes mencione el parametro t ?. Pues bien este parametro se encuentra oculto en la pagina web del video, pero una vez que lo obtenemos lanzamos una consulta al servidor de esta forma
http://youtube.com/get_video?video_id=Fa6r4Y2eGzQ&t=HUKMuhu23678thu
El servidor nos responde con una pagina de error, que dice 303 “See Others “. Hasta ahi nosotros hemos visto una simple pagina de error, y hubieramos abortado nuestros intentos por conseguir el video. Pero el truco de youtube, consiste en que no hay que buscar en el mensaje o la pagina que responde youtube, sino dentro de la cabecera de la respuesta.
En dicha cabecera hay un parametro llamado location. Este parametro contiene la verdadera URL desde la cual es posible descargar el video.
Bueno ahi les dejo el script en cuestion, espero lo disfruten. OJO, es la primera version y no es un modelo de seguridad, solo lo hice para entender como funcionaba youtube.
import urllib
import httplib
import re
import sysclass Video:
def __init__(self,WebURL):
WebURL = self.validateURI(WebURL)
self.WebURL = WebURL
self.VideoID = self.getVideoID()def validateURI(self,uri):
return uridef getVideoID(self):
rex = re.compile(”.*(video_id=[a-zA-Z0-9]*).*&(t=[a-z_A-Z0-9]*)&”)
match = rex.search(self.getWebData())
if match is None :
print “Error: Patrones no coinciden”
sys.exit(0)
return str(match.group(1))+”&”+str(match.group(2))def getWebData(self):
youtube = urllib.urlopen(self.WebURL)
return youtube.read()def getVideoURI(self):
youtube = httplib.HTTPConnection(”www.youtube.com”,80)
youtube.request(”GET”, “/get_video?”+self.getVideoID())
r1 = youtube.getresponse()
return r1.getheader(’location’)def download(self,filename):
data = urllib.urlopen(self.getVideoURI())
f = open(filename,”w”)
f.write(data.read())params = sys.argv
if ( len(params )) <= 2:
print “Error: Numero de parametros incorrectos”
sys.exit(0)video = Video(params[1])
video.download(params[2])
UPDATE: Aca la ultima version del script: youtube



June 5th, 2007 at 4:00 am
También puedes bajar el código del Democracy player, que hace eso mismo y además está escrito también en python.
PD: Vale, mola más cuando uno “se ensucia las manos”
PPD: s/Haber, expliquemos/A ver, expliquemos/
June 5th, 2007 at 6:43 am
No lo conocia maeghith, pero si como decis mola mas cuando uno se ensucia. Ademas ahora ya se como lo hace youtube
June 7th, 2007 at 6:10 am
ese script ya no funciona ahora usan la cache de google, sin necesidad de un codigo “tan” complejo
June 7th, 2007 at 7:40 pm
Muy interesante o del parametro t, no conocia de eso.
Habia visto este script en python (ya viene con edgy) para hacer esto, aun no me lo bajo para ver como funciona, pero guard alos videos en .ogg
http://www.fabianrodriguez.com/blog/archives/2007/05/10/free-those-youtube-videos/
June 7th, 2007 at 7:47 pm
Ahorita le estoy haciendo algunas modificaciones menores al sistema, pero el tema de conversion no lo habia visto, porque el formato de flv es mucho mas chico que otro formato de video, e igual se reproduce desde el mplayer.
June 7th, 2007 at 9:41 pm
Bueno le hice una pequeña correccion en el script, para que muestre mas informacion acerca del video, y en la expresion regular. Habia veces en las que no queria descargar el video, y era xq la expresion regular no habia sido correctamente formulada, y el t ( que es un parametro aleatorio jeje ) no siempre coincidia.
Aca el script en su ultima version
http://necudeco.googlepages.com/youtube
June 23rd, 2007 at 6:19 pm
[...] The New Cult of Dead Cow » Jugando con Youtube y Python def getVideoURI(self): youtube = httplib.HTTPConnection(â€www.youtube.comâ€,80) youtube.request(â€GETâ€, “/get_video?â€+self.getVideoID()) r1 = youtube.getresponse() return r1.getheader(’location’) (tags: python youtube sample code) [...]
July 19th, 2007 at 1:14 pm
[...] quiero hacer algun hack para alguna pagina, esta herramienta es indispensable. El script de youtube lo hice apoyandome en esta [...]
August 29th, 2007 at 11:43 pm
[...] Temas interesantes que me interesa revisar Cómo ver vídeos de Stage6 con Mplayer en GNU/Linux Descargar de Stage6.divx.com con Python Jugando con Youtube y Python [...]
January 1st, 2008 at 11:12 pm
[...] Jugando con youtube En este post, analizamos como maneja youtube el almacenamiento y la [...]