Autor Tema: [Tutorial] Obtener todos los torrents de una web  (Leído 8317 veces)

0 Usuarios y 1 Visitante están viendo este tema.

vk496

  • Visitante
[Tutorial] Obtener todos los torrents de una web
« en: 12-08-2014, 17:28 (Martes) »
Antes de nada, avisar que esto no tiene que ver nada con descargas de contenido ni nada por el estilo. Simplemente es una sencilla introducción a lo que se puede hacer desde Linux.



Estos dias, sin nada que hacer, me entró la curiosidad por saber cuantos torrents tiene la página Mejortorrent.com. Decidí entrar para ver que sucede...



A la izquierda se puede ver la cantidad de torrents que hay, pero yo quería ir un poco mas lejos.... Me picaba la curiosidad por saber si realmente era así. Decidí buscar la forma de sacar un listado de todas las peliculas que había, y obtener su link. La primera parte era fácil:

http://www.mejortorrent.com/peliculas-buscador.html

Simplemente ponía en el formulario + Descargas que con valor 0.

Ya estaba allí. El problema viene ahora...

Para acceder al link del torrent, necesitaba entrar en cada uno de ellos, luego a donde pone descargar, y luego a pulsar en aquí. Un auténtico coñazo si tienes que hacerlo 10000 veces!!!

Por eso decidí usar Linux... Esa cosa que la gente cree que solo pueden usar auténticos cracks. Vamos a desmentir eso... :)

Estando dentro del terminal (Si, esa cosa negra que parpadea y te suelta cosas raras), haremos uso del comando curl

Citar
cURL es una herramienta para usar en un intérprete de comandos para transferir archivos con sintaxis URL, soporta FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE y LDAP



El parámetro -s oculta mensajes del progreso de descarga

Con este comando, nos devolverá el contenido de la web, pero.... SORPRESA!! Solo te devuelve código HTML sin ninguna peli...

Donde están los casi 10000 resultados?

Esto se debe a que la página tiene un formulario... y hay que rellenarlo para que nos devuelva la respuesta....



Utilizaremos una herramienta GNU: formfind



Aquí introducimos nuevas cositas:

Citar
> = Redirige la salida a un fichero. En este caso, todo el contenido de https://raw.githubusercontent.com/bagder/curl/master/perl/contrib/formfind lo gaurdará en el archivo formfind

chmod +x = Con esto daremos permisos de ejecución a un archivo. En nuestro caso, a formfind

Bien, teniendo esto, necesitamos el formulario, para que formfind busque todas las variables que nos interese. Simplemente, bajamos la pagina:



Una vez guardada nuestra página, vamos a analizarla con formfind



Citar
< = Si antes redirigíamos la salida a un fichero, esto hace el proceso contrario. Es decir, redirigir el contenido de pagina.html a formfind

Nos devuelve esto:

Citar
--- FORM report. Uses 'GET' to URL "secciones.php"
Input: NAME="sec" VALUE="buscador" (HIDDEN)
Input: NAME="valor" (TEXT)
Button: "Buscar" (SUBMIT)
--- end of FORM
--- FORM report. Uses 'POST' to URL "/peliculas-buscador.html"
Select: NAME="campo"
  Option VALUE="letra" (SELECTED)
  Option VALUE="titulo"
  Option VALUE="genero"
  Option VALUE="anyo"
  Option VALUE="director"
  Option VALUE="actores"
  Option VALUE="contador_total"
  Option VALUE="ultimos_dias"
[end of select]
Input: NAME="valor" (TEXT)
Select: NAME="valor2"
  Option VALUE="" (SELECTED)
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
[end of select]
Select: NAME="valor3"
  Option VALUE="" (SELECTED)
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE=""
  Option VALUE="[0-9]"
  Option VALUE=""
[end of select]
Select: NAME="valor4"
  Option VALUE="3" (SELECTED)
  Option VALUE="7"
  Option VALUE="30"
  Option VALUE="90"
[end of select]
Input: NAME="submit" VALUE="Buscar" (SUBMIT)
Input: NAME="videoclub" VALUE="1" (CHECKBOX)
--- end of FORM


WUALA! Todas las opciones que se utiliza en el formulario! . Se podría hacer manualmente, es decir, analizando todo el código fuente de la página, pero esto es mucho mas cómodo :)

Vamos al lío...

Primera variable:

Citar
Select: NAME="campo"
Y sus posibles valores... (solo nos interesa una)

Citar
  Option VALUE="letra" (SELECTED)
  Option VALUE="titulo"
  Option VALUE="genero"
  Option VALUE="anyo"
  Option VALUE="director"
  Option VALUE="actores"
  Option VALUE="contador_total"
  Option VALUE="ultimos_dias"
Segunda variable:

Citar
Input: NAME="valor"
Y como valor, se pone un número.

Resumiendo....

Debemos hacer una petición con cURL rellenando el formulario con campo=contador_total y valor=0

Pues vamos a probar:



Citar
-d = Utiliza variables del formulario. En este caso, lo hemos usado dos veces, porque necesitabamos rellenar campo y valor

Eureka!!! La pantalla no para de parpadear con muchas letras, seuro que ha funcionado... Y efectivamente, asi es ;)

Pero esto no acaba aquí.... Recordemos que esto nos lleva a otra página, que luego esta misma nos llevará a otra, y, solo después, al link de nuestro torrent :(

Vamos a hacer una cosa...

Entramos en una página cualquiera, y vemos como es el enlace que nos lleva a la última página antes del link que necesitamos. Un ejemplo:

Yo usaré el primero de todos:

Citar
http://www.mejortorrent.com/peli-descargar-torrent-2444--3-colegas-y-una-salchicha.html

Analizando el enlace que tiene dentro, veo que es una cosa asi:

Citar
http://www.mejortorrent.com/secciones.php?sec=descargas&ap=contar&tabla=peliculas&id=2444&link_bajar=1

Os habeis fijado? El único elemento identificativo es un ID.

Vamos a buscar ese torrent en los resultados de curl (recordar que podeis redirigir la salida de curl a un fichero para tenerlo siempre a mano):

Citar
<a href='/peli-descargar-torrent-2444--3-colegas-y-una-salchicha.html' title='Descargas totales: 6931

Pues ya lo tenemos. Dentro de cada link se encuentra, en medio de él, un ID.

Y que pasa cuando entramos dentro para descargar el torrent?



Obtenemos esta página, la última antes de tener el link de descarga.

Pues bien, vamos a resumirlo, porque son muchas cosas de golpe...

cURL nos devuelve las páginas. En ellas, se encuentra las web con el ID dentro de ellas. Si entramos allí, vemos una página con info de la peli, una imágen, y un link que hace uso de ese ID para mandarlos a la última pagina antes de obtener el enlace.

Es decir, tenemos 2 niveles que superar para llegar a nuestro deseado link.

Pero antes, necesitamos "limpiar" lo que obtenemso de cURL. Para ello usaremos grep



Citar
| = Esta barra vertical nos srive para pasar la salida de un comando a otro (de forma resumida)

grep peli-descargar = Grep nos sirve para aislar texto que nos interesa del que no. En este caso, buscaremos solo las lineas que contengan peli-descargar



Obtenemos justo lo que queremos... Bien, vamos a intentar obtener el ID... para eso usaremos cut



Citar
cut = Lo que su nombre indica, cortar ;)
-d- = El parámetro -d indica el delimitador. En este caso, le hemos indicado que "corte" el texto en trozos delimitados por - (-d-)
-f4 = Una vez delimitado el texto, cogemos una fila. Cogemos la fila número 4 porque allí es donde se encuentra el ID.

Me explico:

Fila1-Fila2-Fila3-Fila4-Fil....
Citar
<a href='/peli-descargar-torrent-5012-Amityville-6.html' title='Descargas totales: 2307

Con esto, obtendremos el listado de todos los ID's :)

OK, es el momento de programar un script. Este paso es bastante dificil, y se recomienda buscar mucha info para familiazarte con los scripts.

Crearemos un archivo nuevo (el mio se llamará script), y lo abrimos con cualquier editor de textos:



Varias cosas que comentar:
Citar
WEB=$() = Hemos creado una variable. Se llama WEB, y cuando usemos $WEB, se usará lo que haya dentro (como hemos usado $(), se ejecutará un comando)

echo "X" = Muestra en pantalla X. Si es una variable, mostrará el contenido de la variable

for X in Y; do............done = Esto es un bucle. Lo que quiere decir es que se hará una determinada tarea tantas veces como elementos X haya en la variable Y. En nuestro caso, se ejecutará un comando echo por cada ID que haya dentro de la variable $(echo "$WEB" |grep peli-descargar | cut -d- -f4)

Guardamos el script y le damos permisos de ejecución con chmod +x script

Ejecutamos con:

./script

Nos devuelve todos los ID's :)

Hasta este punto tenemos todos los conocimientos necesarios para acabar el script:



Citar
#!/bin/bash

WEB=$(curl -s -d campo=contador_total -d valor=0 http://www.mejortorrent.com/peliculas-buscador.html)

for ID in $(echo "$WEB" |grep peli-descargar | cut -d- -f4); do


TORRENT=$(curl -s "http://www.mejortorrent.com/secciones.php?sec=descargas&ap=contar&tabla=peliculas&id=$ID&link_bajar=1" | grep Pincha | cut -d"'" -f2)
echo http://mejortorrent.com$TORRENT

done

Como podeis ver, hemos aprovechado que estamos en el bucle (es decir, tratamos a cada linea de forma individual con los comandos), para obtener con curl la última página antes del link y "limpiar" ese texto. Después van a buscar el link por medio de grep y cut.

Aquí el resultado:



Salu2



Desconectado Tki2000

  • *******
  • Mensajes: 1902
Re: [Tutorial] Obtener todos los torrents de una web
« Respuesta #1 en: 18-08-2014, 13:04 (Lunes) »
¡¡¡Muy bien explicado!!!  >:( >:( >:(
No habrás entendido algo, hasta que seas capaz de explicárselo a tu abuela...
Hacemos pantallas con píxeles casi invisibles, para luego ampliar la letra porque no la vemos... Bonita paradoja...
Creamos analfabetos tecnológicos con una velocidad pasmosa. Todo el mundo "maneja" tecnología, casi nadie sabe lo que tiene entre las manos, pero todo el mundo opina.
El analfabetismo, antes, pasaba desapercibido. Ahora, se transmite por Internet y las redes sociales.

emeryth

  • Visitante
Re: [Tutorial] Obtener todos los torrents de una web
« Respuesta #2 en: 08-09-2014, 09:52 (Lunes) »
Excelente!. Gracias por el aporte me a dados muchas ideas.   ;D