martes, julio 10, 2007

Ingenieria inversa para la web 2.0

Ayer, buscando en google una canción en mp3, llegué a una curiosa página, mp3tube.net, que es web estilo estilo youtube pero para alojar mp3s, tiene un reproductor flash para reproducir las canciones y no permite descargar las canciones, pero claro yo aunque quizás hubiera sido mejor descargar la canción mediante p2p ya que me había encontrado con esto no quería dejarlo así, quería averiguar donde estaban guardados los mp3s para poder descargarmelo.

Lo primero que hice fue echarle un vistazo al código fuente, quizás estuviera la url del mp3 en él y me ahorraría tener que descompilar el reproductor flash y buscar en su código ActionScript. Busqué pero no encontré nada útil, excepto un detalle importante, el "id" del archivo, cada archivo tiene uno diferente, así que deduje que me sería útil para descargar las canciones una vez averiguara donde estaban alojadas. Esto fue lo único interesante que vi en el código fuente:

http://www.mp3tube.net/play.swf?id=772691db234dc0b62844eac87f3d21d5

Se ve perfectamente el id, y el nombre del reproductor flash. Luego intenté una tontería, pero a lo mejor funcionaba, puse mp3tube.net/id_del_archivo.mp3 pero no funciono, error 404, tras probar varias posibilidades mas pare probar, no sirvió ninguna de mis intuiciones. Próximo paso? descargar el reproductor flash, descompilarlo y ver que hace. Así que nada wget mp3tube.net/play.swf, apt-cache search swf decompiler, apt-get install flasm, flasm, flasm -d play.swf. Explico: descargo el archivo, busco un descompilador de archivos swf, instalo el que he encontrado (flasm), lo ejecuto sin argumentos para ver la sintaxis, y luego lo ejecuto con -d (descompilar) como parámetro y play.swf (archivo swf) como argumento. Tras mirar un poco veo que hay llama a otro archivo, a fmp3.swf, así que lo descargo igualmente y miro un poco el código de este archivo, no veo nada útil, así que me voy de nuevo al primero y repasándolo veo una cosa cuanto menos curiosa:

'mp3', 'http://matrix.mp3tube.net/tube/', 'id', '.tube'

Lo que me hace pensar que los archivos mp3 se pueden sacar de matrix.mp3tube.net/tube/id_del_archivo.tube, así que hago la prueba poniendo como id el de la canción que puse antes como ejemplo, Como el agua, de Camarón, y descargo mediante wget (si ya que se puede con firefox, pero a mi me gusta el terminal):

wget http://matrix.mp3tube.net/tube/772691db234dc0b62844eac87f3d21d5.tube

Vaya, son 3.5 MB tiene toda la pinta de ser una canción en mp3, cuando termino de descargarlo para ver que es ejecuto:

file 772691db234dc0b62844eac87f3d21d5.tube

Y efectivamente es un fichero mp3, así que intento reproducirlo:

mplayer 772691db234dc0b62844eac87f3d21d5.tube

Suena!! ya sabemos donde están los archivos, pero trabajo acabado?

No... es mucho trabajo hacer todo eso a mano, así que, se me ocurre que puedo hacer un script que haga el solo todo el trabajo, y de paso practico un poco shell scripting.

Blogger deforma un poco (en realidad mucho) es script, así que lo he colgado, podeis verlo aquí: http://neobiusnet.googlepages.com/mp3tube.sh

Voy a comentaros un poco el script, se que algunos lo entenderéis perfectamente, pero a alguien le interesará saber como funciona, así que lo explico un poco:

La primera línea: #!/bin/bash simplemente indica que es un script bash.

Después hay una comprobación mediante un if, si no se le ha puesto ningún argumento muestra en la pantalla mediante varios echo, para que sirve el script y como se usa, lo he puesto en inglés para que lo pueda usar mas gente aunque realmente dudo de la calidad de la pagina mp3tube.net, y de si tiene mucha audiencia o no, pero bueno, lo he puesto en inglés de todas formas.

En caso de que si se le haya pasado la url como argumento comienza descargando la pagina html (linea 17), y lo guarda como index.html.

La línea 18 asigna a la variable CANCION, el id de la canción, imprimiendo el archivo index.html, mediante grep se selecciona una línea y luego mediante cut se corta el id.

En condiciones normales cuando se descarga el archivo tiene un nombre absurdo, [id].tube, es imposible saber que canción es, así que para solucionar esto la línea 19 se encarga de tomar el nombre de la propia url:

http://www.mp3tube.net/es/musics/Camaron-Como-el-agua/4844/

En este caso sería Camaron-Como-el-agua.mp3. La forma de hacerlo es dividiendo con cut la url en partes usando como límites las "/" de la url, con -f6 se selecciona la parte que queremos, este es el dato que se asigna a $NOMBRE.

Por último se descarga el archivo, le cambia el nombre a $NOMBRE.mp3 y termina diciendo "El archivo $NOMBRE.mp3 ha sido guardado".

Una cosa que se me había olvidado, gracias a Castigador por su ayuda con el script, ya que tuve unos problemillas con cut.