Archive for July, 2009
De captchas y gotchas
Tuesday, July 21st, 2009Diario de Rorschach, 20 de Julio de 2009:
Me cuentan que en el panorama de las descargas directas hay tres actores principales: MegaUpload, GigaSize y RapidShare. Todos proporcionan un uso gratuito (y limitado) y otro de pago (y sin restricciones). Aunque varía con la localización geográfica, normalmente sólo permiten una descarga simultánea, y algunos tiempos de espera entre descargas. Por ejemplo, los dos primeros te fuerzan a esperar cosa de un minuto antes de poder comenzar la descarga. El último es mucho más estricto: aparte de esa espera, te exige un tiempo de nada más y nada menos que 15 minutos para realizar una segunda descarga.
Como ocurre en estos casos, el amigo de un amigo quería bajarse precisamente de RapidShare (el de los 15 minutos entre descargas) varios ficheros. Con paciencia y unas cañas no hay problema… pero si el número de ficheros asciende a nada más y nada menos que 400, la cosa se convierte en inmanejable. En realidad, si no hay prisa para la descarga, de nuevo, no hay problema por hacerla… pero es demasiado laborioso. Además, mi amigo me contaba que le resultaba muy agobiante tener que andar pendiente de si habían ya pasado los 15 minutos de espera y podía poner el siguiente.
De modo que me pidió ayuda…
De un rápido vistazo es fácil darse cuenta de que RapidShare es el único de los tres que no tiene captcha, esos pequeños retos de letras retorcidas que sirven para averiguar si el solicitante de la página (o servicio) es o no humano. A si es que… gotcha! ¿Habría alguna manera de automatizar las descargas? Dado que no hay prisa (mi amigo no necesitaba esquivar la limitación de los 15 minutos) ¿podría hacerse algún programita para conseguir que los 400 enlaces se bajaran solos?
Con mi sombrero de analizador de aplicaciones Web y un diccionario de alemán, me cargué de paciencia y empecé…
Cuando se introduce la URL de la descarga directa, RapidShare nos saluda con:

Si se analiza el .html veremos que el botón “Free user” está en un formulario, que invoca a una URL de un mirror de RapidShare con el parámetro dl.start=Free. Por tanto, el primer paso de nuestro programilla es ir a la página del enlace original, buscar la URL del formulario (un simple grep servirá), y llamar a la URL usando el método Post de HTTP con el parámetro anterior.
Tras pulsar el botón, un usuario normal, verá la segunda página:

En ella se exige una espera determinada, cuya longitud depende del tamaño del fichero solicitado. Si miramos en Matrix (esto… en el html) veremos que toda esta página está programada con JavaScript. Cuanto termina el contador, el html se automodifica y nos deja ver un botón de descarga, e incluso elegir el servidor espejo del que descargárnoslo. El código del botón, y las opciones de los servidores lo tenemos en realidad desde el principio en el .html, por lo que nuestro programilla podría leerlo sin la espera. Sin embargo, los servidores se comunican entre sí, y si nos vamos directamente al servidor del fichero éste nos dirá que necesitamos JavaScript en nuestro navegador al haber podido pulsar el botón sin hacer la espera
Por tanto, lo que tenemos que hacer en nuestro programa es sacar el tiempo y esperar. Para eso basta buscar var c= y mirar el valor asignado, que será justo el tiempo inicial de espera en segundos. De nuevo, un grep y un poco de magia de expresiones regulares son suficiente para sarcalo.
Una vez hecha la espera, un usuario normal verá la página completa, para realizar la descarga:

Si se pulsa el “+” a la izquierda de “Advanced download settings” aparecen un grupo de botones de radio para elegir el servidor espejo del que descargarse el fichero, aunque normalmente el marcado automáticamente (elegido por RapidShare) será el que se use.
Nuestro programa debe extraer del .html (y de los botones de radio) la URL para comenzar la descarga. Para eso, lo sacamos de las líneas:
‘<input type=”radio” name=”mirror” onclick=”… [mirror] … ” >
del formulario de elección del servidor. Si queremos escoger el que RapidShare nos ha propuesto, podemos buscar la cadena checked para saber cual estaba marcado.
Una vez elegido, saltamos a él. Pero, de nuevo, el botón está en un formulario, y la solicitud de descarga debe hacerse con Post. Ahora los parámetros son mirror=on&x=32&y=64 y listo. El servidor nos enviará sin más problemas el fichero.
Ten en cuenta, que en ocasiones la segunda página (la de la cuenta atrás) no nos llega así, sino con un error, bien porque tenemos que esperar 15 minutos hasta la siguiente descarga, bien porque no tenemos “slot de descarga” libre y nos toca esperar dos minutos a ver si hay más suerte la próxima vez. En ambos casos, nuestro programa debería salir limpiamente.
Una vez terminado, es suficiente con invocarlo un montón de veces, uno por cada URL que tengamos. Lo metemos en un script que espere 15 minutos entre invocaciones, y nos vamos a dormir.
Mi amigo me dice que anoche se bajó ya los 30 primeros enlaces.

