Página 1 de 2

Ayuda: Sacar el link de una web (mediafire)

Publicado: 13 Abr 2011, 16:36
por arkcrew
Hola amigos, como conozco la eficacia de este foro, recurroa vosotros porque estoy terminando una aplicación y tengo un problema a la hora de conseguir el link de un archivo, os describo la situación:

La busqueda de enlaces se realizará en dos páginas, http://www.mediafire.com y sourceforge, ambas supongo que son conocidas para todos.

Bien, la primera, mediafire, una vez accedemos a un enlace, esperamos hasta que aparezca el link de descarga, pues ese link es el que necesito obtener... una vez lo tenga le paso una funcion inetget y descargo el archivo, pero el problema lo tengo al obtener el link.

esto tengo por ahora:

Código: Seleccionar todo

#include <IE.au3>
$link = "http://www.mediafire.com/?ck1iu5uggvg4adz"
$oIE = _IECreate($link,0,0)
$oLinks = _IELinkGetCollection ($oIE)
For $oLink In $oLinks
	if StringLeft($oLink.href , 15) = "http://download" then  MsgBox(0, "Link Info", $oLink.href)
Next
Este codigo me da varios resultados, y solo necesito uno, pero ese no es el problema, el problema es que tarda demasiado y no puedo permitir una demora semejante en la aplicacion...

Si os fijais, he añadido la comparacion en el stringleft para que la url sea la de descarga del archivo, ya que si paso la funcion sin condicion, me devuelve un monton de links invalidos.

Espero con impaciencia vuestras ideas!!

Un saludo a todos!

Att, @Gm15

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 15 Abr 2011, 21:58
por BasicOs
Buenas,
creo que debes parcelar cada parte de la aplicación a ver en que función se hace "lenta" me imagino que quieres bajar de un par de segundos a centesimas de segundo? Tendrías que trabajar sobre la línea que "enlentece" a tu programa. :smt021 :smt021

Puedes usar directamene inetgetsource para bajar el fuente de la página, con lo que tendrías una variable que contiene la página, y luego en un for next ir eliminando o cogiendo lo que necesites de la página con las funciones StringInStr() u otras de String.

Salu22:)

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 16 Abr 2011, 01:00
por Chefito
No puede utilizar esa técnica BasicOs, ya que el enlace que le interesa no está en el código de la página. Si os fijais, tarda un poco al cargar la página, y también al recuperar el enlace del fichero (antes de que salga el enlace con la dirección del fichero que te interesa "Click here to start download from MediaFire", te sale un poco de tiempo el mensaje "Processing download request"). Te tocaría intentar enganchar ese enlace de alguna otra forma. Tendrías que analizar el código de la página para ver como lo hace. Puede que no sea facil.

Saludos.

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 16 Abr 2011, 10:31
por arkcrew
Gracias a ambos, BasicOs, Chefito, siempre estais cuando hace falta y os lo agradezco de veras...

Mirad, como bien dice chefito, el link tarda un poco en mostrarse, pero eso no es de los peores problemas, es cosa de poner un sleep y a partitr de ahi enganchar el link.
Por ahroa lo que sé es que se gerera dentro de una etiqueta div que se genera con un nombre aleatorio, pero a su vez esta integrada dentro de otra de nombre fijo, asi creo yo que si depurase un poco, con una funcion inetget o con un objeto para sacar el source podria conseguirlo, de todas formas, si se os ocurre algo más, comunicadmelo porfavor.

Un saludo a todos y muchas gracias!

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 05 Nov 2011, 13:11
por arkcrew
Hola,

He vuelto a este asunto porque no consigo solucionarlo...

Los datos del enlace estandar son:

<div class="XXXXXXX" style="position: absolute; top: -250px;" id="XXXXXXXXXX" name="XXXXXXXXXXXXXX">
<a onclick="XXXXXXXX"href="link">Click here to start download from MediaFire..</a>
</div>

La idea que tengo es extraer el contenido que hay entre <div ...................> </div> y esos ería de hacerlo con la función StringRegExp , el problema está en que no se por donde agarrarlo, he probado varias veces pero no obtengo el resultado deseado:

Código: Seleccionar todo

#include <INET.au3>
Global $link = "http://www.mediafire.com/?b6qqn4c43a9c0cq"
getlink($link)
func getlink($link)
    $html = _INetGetSource($link)
	$links = StringRegExp($html,'<div class="(.*?)" style="position: absolute; top: -250px;" id="(.*?)" name="(.*?)"> </div>', 3)
	For $n = 0 To UBound($links) - 1
		 MsgBox(0,"", $links[$n])
	Next
endfunc
Ese stringregexp, la verdad no tengo ni la menor idea si es posible definir así, me lo he inventao haber que pasaba XD, pero he probado con:
'<a onclick="(.*?)"</a>', 3) y nada, también con 'href="(.*?)"</a>', 3) y sin resultados.

¿Alguna idea?

Gracias!

Saludos

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 06 Nov 2011, 23:25
por jamaro
Hola arkcrew ¿has echado un vistazo al hilo? Ahí recomiendo el uso de StringRegExp GUI for testing del foro inglés, con el que puedes hacer pruebas de expresiones regulares.

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 06 Nov 2011, 23:50
por arkcrew
Gracias Jamaro,

Le estoy echando una ojeada a la aplicación, espero solucionarlo de esta manera, ya publico el código cuando esté funcional.

Saludos!

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 07 Nov 2011, 10:10
por Ximorro
¿Pero qué datos quieres extraer exactamente? ¿TODO los que has puesto con las XXX?
La expresión regular está mal, pues después del "name" no viene el </div>, hay cosas enmedio que tienes que tratar.

Por ejemplo esta ER (no muy optimizada)
(?s)<div class="(.*?)".* id="(.*?)" name="(.*?)">.*<a onclick="(.*?)"

en esta cadena:
<div class="CLASE" style="position: absolute; top: -250px;" id="EL ID" name="EL NOMBRE">
<a onclick="ON CLICK"href="link">Click here to start download from MediaFire..</a>
</div>


Saca esto:
[0] = CLASE
[1] = EL ID
[2] = EL NOMBRE
[3] = ON CLICK


¿es eso lo que quieres?

El (?s) es para que el punto también se empareje con los retornos de carro, así también pasa líneas.
Naturalmente estas cosas son muy dependientes del formato original, los datos deben estar siempre en ese orden.

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 07 Nov 2011, 16:43
por arkcrew
En realidad solo necesito obtener el link, pero para ello debo depurar mucho la página y obtener solo ese resultado, ya una vez lo sé operar dentro..
Sigo invensigando..
Gracias

Saludos!

Editado:

La estructura de la página es la siguiente:

(contenido suelto con sus divs y sus cosas...)
<div class="dl_startlink" style="width:500px;margin:auto;">

(no solo hay un div, sino que hay muchos, pero ya una vez conseguido el contenido del div class="dl_startlink" podría trabajar con los demás datos...)

<div id="3db267aea3c00a696d2939a755df8d8a" class="c4432d466b836bb69f009492e33574299" name="3db267aea3c00a696d2939a755df8d8a" style="display: block;">
<a href="http://download1083.mediafire.com/apruz ... 010%29.zip" onclick="wd7jbucgc12='';d41=unescape('7f6e7d6a617b216b606c7a626a617b21686a7b4a636a626a617b4d76466b27283c6b6d3d39386e6a6e3c6c3f3f6e3936396b3d363c366e383a3a6b69376b376e2826216661616a7d475b42432f322f2856607a7d2f6b60786163606e6b2f667c2f7c7b6e7d7b66616821212834');wtjkygj93k=109;for(i=0;i<wtjkygj93k;i++)wd7jbucgc12=wd7jbucgc12+(String.fromCharCode(parseInt(d41.substr(i * 2, 2), 16)^11^4));eval(wd7jbucgc12);">Click here to start download from MediaFire..</a>
</div>


</div>
(más contenido)

Mi problema es que no me lee el código, osea, sabiendo todos los margenes, ya que estos no son aleatorios, sino que es fijo, debería sacar el código de dentro, pero no lo consigo...

Probé con esto

Código: Seleccionar todo

        #include <INET.au3>
        Global $link = "http://www.mediafire.com/?b6qqn4c43a9c0cq"
	$html = _INetGetSource($link)
	$cuerpo = StringRegExp($link, '<div class="dl_startlink" style="width:500px;margin:auto;">(.*?)</div>', 3)
	For $a = 0 To UBound($cuerpo) - 1
		MsgBox(0, "", $cuerpo[$a])
	Next
Creo que la estructura es correcta, pero aún así, no lo consigo...

Saludos!

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 08 Nov 2011, 09:50
por Ximorro
Como te dije en el ejemplo anterior, debes usar (?s) para que el punto también se empareje con los retornos de carro. Así ya te debería funcionar mejor, aunque aún hay que mejorarla para pillar los div de dentro.

Recuerda que los grupos que StringRegExp recupera son los que están entre paréntesis.

Yo ampliaría la ER para tomar sólo las referencias, así no hay que postprocesar los div independienters, StringRegExp ya te daría directamente los enlaces. (De todas maneras haz primero lo de los div si así te aclaras mejor, con las ER es mejor ir paso a paso)

Que por cierto, supongo que lo que quieres es lo que está en <a href="http://download1083.mediafire.com.........zip" ¿no?

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 08 Nov 2011, 10:26
por arkcrew
Exacto, lo que necesito es el enlace de descarga, pero claro la página es muy goda en cuanto a código, ya que muchas cosas se generan aleatoriamente, por eso solo se puede meter mano en algunas estructuas, que son las únicas que se mantienen estables, como ya digo, las demás etiquetas "<div>" llevan "id" aleatoria y demás datos también...

Esta tarde probaré haber como puedo hacerlo.

Gracias

Saludos!

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 08 Nov 2011, 22:38
por Chefito
arkcrew no te molestes. En el código html que recuperas no está lo que buscas. Pega el código en el bloc de notas e intenta buscar el texto que dices, verás que no está.
Ese código lo has tenido que ver examinando el objeto, como he hecho yo con el Opera, el cual tiene esa opción. Es un código distinto al de la página principal. Se debe cargar de alguna forma.

He mirado por encima (solo por encima....ligeramente) el código html de la página y no es moco de pavo. Es bastante voluminoso y parece que tiene partes complicadas. A primera vista no he visto como carga ese enlace. Por ejemplo, busqué frames pero no encontré nada.....o se me pasó. Tengo la impresión que lo debe hacer con javascript o algo así. Habría que analizar muy detenidamente la página, cosa que ocuparía mucho tiempo :smt024 .

Saludos.

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 08 Nov 2011, 23:03
por arkcrew
Vaaya por dios! y yo que quería hacerme un gestorcillo de descargas apañao con autoit .. bueno que remedio, a buscarse otra cosa XD

Muchas gracias a todos!

Saludos!

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 09 Nov 2011, 09:30
por Ximorro
¿Ya te rindes? Lo que tienes que hacer es analizar el código para ver cómo obtener ese html que te interesa.

Mirando así también rápido parece que las funciones de gestión de archivos y carpetas están aquí:
http://cdn.mediafire.com/js/master_45144.js

Una vez lo tengas te puedo decir que los enlaces se pueden extraer bien con expresiones regulares, aunque me parece que eso que decía de hacerlo en un solo paso será bastante complicado (cuando hay backtracking sólo se almacena el último grupo contemplado, con lo que sólo se recuperaría la última referencia), creo que habrá que hacerlo en dos pasos, pero en principio es fácil.

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 14 Nov 2011, 21:34
por arkcrew
No no me rindo, sigo investigando, pero uno de los problemas es que el link no se muestra hasta pasados unos segundos, así que sería lo suyo hacer el inet get cuando pasen unos segundos desde que cargue la página, lo cual sería recurrir ya a la librería IE.au3 que no me gusta nada porque necesita abrir el navegador y es un proceso que ralentiza bastante.. sigo investigando

Saludos!

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 15 Nov 2011, 00:41
por Chefito
Mmmmm....pues no investigas lo suficiente :smt005 . No te encierres en una única idea, y más cuando ésta puede que sea un trabajo de locos. Intenta encontrar otra....si la hay claro, sino, machacate con el código html de la página hasta intentar encontrar la solución.
Como dije anteriormente, parece bastante dificil investigar el código html. Se tardaría bastante tiempo, y quien sabe si al final se podría sacar algo.

Yo he tenido otra idea....y es intentar buscar una sección para desarrolladores (alguna api, código o algo). Encontré esto: http://support.mediafire.com/index.php? ... -agent-api

El resumen de esto, es que enviando unos datos específicos (parámetros) a la dirección http://www.mediafire.com/basicapi/premiumapi.php por el método post, nos puede devolver una página en formato xml con el nombre del fichero, el tamaño y la dirección url para descargarlo. Muy rápido y eficaz :smt002 .
Lo malo es que necesitas una premium_key. Puede que gratuítamente no se pueda conseguir...o puede que sí. Eso lo tendrías que investigar. En el apartado Sinopsis parece que habla algo respecto a esto. No se si dice que en una cuenta tuya, en el apartado "Mi cuenta", en las "opciones de descarga" puedes encontrar el DownloadAgentKey (premium_key).

Yo voy a poner una premium_key para que veais un ejemplo de como se hace, pero no utilizarla para realizar programas, ya que no es mía. Si los administradores o moderadores averiguan algo respecto a este tema y creen que no se debe poner esta premium_key, que editen el post o me lo digan para editarlo yo mismo.
Editado: He quitado la clave premium ya que no era mía ni de nadie que conozca. Si alguien necesita este método, ya sabe lo que debe hacer.

Código: Seleccionar todo

#include "WinHttp.au3"

Opt("MustDeclareVars", 1)

; Initialize and get session handle
Global $hOpen = _WinHttpOpen()
; Get connection handle
Global $hConnect = _WinHttpConnect($hOpen, "www.mediafire.com")

; Simple-request it...
ConsoleWrite(_WinHttpSimpleRequest($hConnect, "POST", "/basicapi/premiumapi.php", Default, "premium_key=aquí hiría una clave premium&files=zt6go51btbni8wg,ohdwmkex3me70kw"))

; Close handles
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
Por cierto, se necesita la udf winhttp. La podeis encontrar por ejemplo en este post: http://www.emesn.com/autoitforum/viewto ... ttp#p11703

Saludos.

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 15 Nov 2011, 10:30
por arkcrew
Genial, una api es todo lo que necesito, aunque si necesito una premium key, supongo que habrá que pagar algo, a no ser que exista alguna manera de lanzar la api gratis.. me centraré en ese aspecto ya que quiero programar una especie de gestor de descargas y no es plan de chupar de la premium key de un tercero...
Muchas gracias por la infomación Chefito!

Saludos!

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 15 Nov 2011, 10:33
por Ximorro
"No utilicéis la premium key que no es mía"

¿Crees que todos te harán caso? :smt003
Depende de dónde la has sacado, si está por los ejemplos de uso de la API que no lo hubieran puesto :smt002 pero si es de otro usuario creo que no se debería usar, podemos estar perjudicándole bajando archivos en su nombre (o haciendo otras cosas que se programen, a saber).

Si es una clave genuina de un usuario que ha pagado por ella creo que lo justo es no ponerla. En lo que respecta al ejemplo no es problema, se entiende perfectamente bien con un "aquí va la clave premium".

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 15 Nov 2011, 19:32
por arkcrew
Jajaja, Ximorro tiene razón, has hecho bien en eliminar la premium key, el caso es que he investigado un poco la api.. hayq ue pagar, así que intentaré buscar alternativas aunque la idea de obtener un xml era muy apetitosa.. que pena

Saludos!

Re: Ayuda: Sacar el link de una web (mediafire)

Publicado: 16 Nov 2011, 09:55
por Ximorro
Por cierto, fijaros en la url:
www.mediafire.com/basicapi/premiumapi.php

Antes de la premiumapi hay una basicapi. Seguramente esto quiere decir que hay una API de pago, sí, pero también una gratuita que permitirá menos cosas, pero a lo mejor descargar archivos sí es posible, porque al fin y al cabo es la operación básica de Mediafire que puede hacer cualquier usuario de internet, incluso sin serlo de mediafire.

Yo tengo una cuenta de mediafire (gratuita, no premium), probablemente la clave permium me permita acceder a mi cuenta con las opciones extendidas que dan un usuario premium, pero con la API básica es muy probable que pueda hacer las cosas para las que no se requiera usuario premium, es que encima para descargar no hace falta ni ser usuario gratuito, si el que lo ha subido lo hace público lo puede descargar cualquiera.