Problemas con javascript al obtener enlaces

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Problemas con javascript al obtener enlaces

Mensaje por arkcrew »

Hola a todos,

Bien, como soy guitarrista pues me paso el día buscando tablaturas de canciones que me gustan para poder tocarlas en mis ratos de aburrimiento asi que se me ocurrión hacer un programita que me permita buscar las tablaturas en las páginas y descargar o bien todas las tablaturas de ese artista o solo todas las pertenecientes a la canción especificada.

Por ahora tengo lo siguiente, sé que faltan muchas cosas, que creo que si las sabré hacer, el problema es que obtengo la lista de canciones (perfectamente), accedo a la lista de enlaces de cada canción (genial) pero, el problema lo tengo a la hora de obtener el link de descargar del archivo guitar pro (extensiones: *.gp3, *.gp4, *.gp5 y *.gpx) ya que en una de las webs a las que recurre, el enlace de descarga se genera por un botón que llama a una función javascript.

Dejo un ejemplo;

Uno de los links que obtiene puede ser "http://www.911tabs.com/link/?2228691" probado y funcional, ahora, que hay en ese link?, es un iframe que engloba a la página real, pues se obtiene el link de ese iframe y se analiza la página, nos sale este link: http://tabs.ultimate-guitar.com/g/gamma ... ar_pro.htm

De aqui, podemos ver el problema que tengo, el código por el que se genera el enlace está dentro de la página y la estructura no es complicada, es solo que no entiendo como puedo obtener el link, que como resultado es este
http://www.ultimate-guitar.com/tab_down ... e494687da7

Saludos!
Gracias

Codigo:

Código: Seleccionar todo

#include <inet.au3>
#include <IE.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <Array.au3>
#include <File.au3>
#include <String.au3>
#include <Misc.au3>
#include <GuiMenu.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>


#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("GuitarProTab Downloader", 539, 424, 192, 124)
$Label1 = GUICtrlCreateLabel("Artista", 32, 24, 33, 17)
$Input1 = GUICtrlCreateInput("", 80, 22, 305, 21)
$Group1 = GUICtrlCreateGroup("Tablaturas", 8, 48, 521, 329)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Buscar", 416, 18, 75, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Descargar", 8, 384, 75, 25, $WS_GROUP)
$Button3 = GUICtrlCreateButton("Descargar todas", 96, 384, 99, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$hListView = GUICtrlCreateListView("Titulo|Enlace", 14,70, 500, 300)
_GUICtrlListView_SetColumnWidth($hListView, 0, 220)
_GUICtrlListView_SetColumnWidth($hListView, 1, 260)

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			rellenar(StringLeft(GUICtrlRead($Input1),1),Stringreplace(GUICtrlRead($Input1)," ","_"))
		Case $Button2
			$total = _GUICtrlListView_GetItemCount($hListView)
			For $a = 0 To $total
				If _GUICtrlListView_GetItemSelected($hListView, $a) = True Then
					$artista = _GUICtrlListView_GetItemText($hListView, $a)
					$url = _GUICtrlListView_GetItemText($hListView, $a, 1)
					download($url,$name,GUICtrlRead($Input1))
				EndIf
			Next
	EndSwitch
WEnd

Func rellenar($inicial,$artista)
	$dir = "http://www.911tabs.com/tabs/"&$inicial&"/"&$artista&"/guitar_pro_tabs/"
	$code = _INetGetSource($dir)
	$cuerpo = StringRegExp($code, '(?s)<td><a href="(.*?)">(.*?)</a></td>(?s)', 3)
	For $a = 0 To UBound($cuerpo) Step 2
		If $a == UBound($cuerpo) - 2 Then ExitLoop
		GUICtrlCreateListViewItem(Decod($cuerpo[$a + 1]) & "|http://www.911tabs.com/" & $cuerpo[$a], $hListView)
	Next
EndFunc   ;==>rellenar

Func Decod($text)
	$text = StringReplace($text, "&#147;", Chr(82220))
	$text = StringReplace($text, "&#153;", Chr(8482))
	$text = StringReplace($text, "&#148;", Chr(8221))
	$text = StringReplace($text, "&#137;", Chr(8240))
	$text = StringReplace($text, "&#140;", Chr(338))
	$text = StringReplace($text, "&#131;", Chr(402))
	$text = StringReplace($text, "&#135;", Chr(82225))
	$text = StringReplace($text, "&#134;", Chr(82224))
	$text = StringReplace($text, "&", Chr(38))
	$text = StringReplace($text, """, Chr(34))
	$text = StringReplace($text, "Á", Chr(193))
	$text = StringReplace($text, "À", Chr(192))
	$text = StringReplace($text, "É", Chr(201))
	$text = StringReplace($text, "È", Chr(200))
	$text = StringReplace($text, "Í", Chr(205))
	$text = StringReplace($text, "Ì", Chr(204))
	$text = StringReplace($text, "Ó", Chr(211))
	$text = StringReplace($text, "Ò", Chr(210))
	$text = StringReplace($text, "Ú", Chr(218))
	$text = StringReplace($text, "Ù", Chr(217))
	$text = StringReplace($text, "á", Chr(225))
	$text = StringReplace($text, "à", Chr(224))
	$text = StringReplace($text, "é", Chr(233))
	$text = StringReplace($text, "è", Chr(232))
	$text = StringReplace($text, "í", Chr(237))
	$text = StringReplace($text, "ì", Chr(236))
	$text = StringReplace($text, "ó", Chr(243))
	$text = StringReplace($text, "ò", Chr(242))
	$text = StringReplace($text, "ú", Chr(250))
	$text = StringReplace($text, "ù", Chr(249))
	$text = StringReplace($text, "Ä", Chr(196))
	$text = StringReplace($text, "Â", Chr(194))
	$text = StringReplace($text, "Ë", Chr(203))
	$text = StringReplace($text, "Ê", Chr(202))
	$text = StringReplace($text, "Ï", Chr(207))
	$text = StringReplace($text, "Î", Chr(206))
	$text = StringReplace($text, "Ö", Chr(214))
	$text = StringReplace($text, "Ô", Chr(212))
	$text = StringReplace($text, "Ü", Chr(220))
	$text = StringReplace($text, "Û", Chr(219))
	$text = StringReplace($text, "ä", Chr(228))
	$text = StringReplace($text, "â", Chr(226))
	$text = StringReplace($text, "ë", Chr(235))
	$text = StringReplace($text, "ê", Chr(234))
	$text = StringReplace($text, "ï", Chr(239))
	$text = StringReplace($text, "î", Chr(238))
	$text = StringReplace($text, "ö", Chr(246))
	$text = StringReplace($text, "ô", Chr(244))
	$text = StringReplace($text, "ü", Chr(252))
	$text = StringReplace($text, "û", Chr(251))
	$text = StringReplace($text, "Ã", Chr(195))
	$text = StringReplace($text, "å", Chr(229))
	$text = StringReplace($text, "Ñ", Chr(209))
	$text = StringReplace($text, "Å", Chr(197))
	$text = StringReplace($text, "Õ", Chr(213))
	$text = StringReplace($text, "Ç", Chr(199))
	$text = StringReplace($text, "ã", Chr(227))
	$text = StringReplace($text, "ç", Chr(231))
	$text = StringReplace($text, "ñ", Chr(241))
	$text = StringReplace($text, "Ý", Chr(221))
	$text = StringReplace($text, "õ", Chr(245))
	$text = StringReplace($text, "ý", Chr(253))
	$text = StringReplace($text, "Ø", Chr(216))
	$text = StringReplace($text, "ÿ", Chr(255))
	$text = StringReplace($text, "ø", Chr(248))
	$text = StringReplace($text, "Þ", Chr(222))
	$text = StringReplace($text, "Ð", Chr(208))
	$text = StringReplace($text, "þ", Chr(254))
	$text = StringReplace($text, "ð", Chr(240))
	$text = StringReplace($text, "&AELIG;", Chr(198))
	$text = StringReplace($text, "ß", Chr(223))
	$text = StringReplace($text, "æ", Chr(230))
	$text = StringReplace($text, "¼", Chr(188))
	$text = StringReplace($text, " ", Chr(160))
	$text = StringReplace($text, "½", Chr(189))
	$text = StringReplace($text, "¡", Chr(161))
	$text = StringReplace($text, "¾", Chr(190))
	$text = StringReplace($text, "£", Chr(163))
	$text = StringReplace($text, "©", Chr(169))
	$text = StringReplace($text, "¥", Chr(165))
	$text = StringReplace($text, "®", Chr(174))
	$text = StringReplace($text, "§", Chr(167))
	$text = StringReplace($text, "ª", Chr(170))
	$text = StringReplace($text, "¤", Chr(164))
	$text = StringReplace($text, "²", Chr(178))
	$text = StringReplace($text, "¦", Chr(166))
	$text = StringReplace($text, "³", Chr(179))
	$text = StringReplace($text, "«", Chr(171))
	$text = StringReplace($text, "¹", Chr(185))
	$text = StringReplace($text, "¬", Chr(172))
	$text = StringReplace($text, "¯", Chr(175))
	$text = StringReplace($text, "­", Chr(173))
	$text = StringReplace($text, "µ", Chr(181))
	$text = StringReplace($text, "º", Chr(186))
	$text = StringReplace($text, "¶", Chr(182))
	$text = StringReplace($text, "´", Chr(180))
	$text = StringReplace($text, "·", Chr(183))
	$text = StringReplace($text, "¨", Chr(168))
	$text = StringReplace($text, "°", Chr(176))
	$text = StringReplace($text, "±", Chr(177))
	$text = StringReplace($text, "¸", Chr(184))
	$text = StringReplace($text, "»", Chr(187))
	$text = StringReplace($text, "¿", Chr(191))
	$text = StringReplace($text, "×", Chr(215))
	$text = StringReplace($text, "¢", Chr(162))
	$text = StringReplace($text, "÷", Chr(247))
	$text = StringReplace($text, "€", Chr(8364))
	$text = StringReplace($text, "–", Chr(8211))
	Return $text
EndFunc   ;==>Decod

func download($link,$nombrearchivo,$artista)
	$code = _INetGetSource($link)
	$cuerpo = StringRegExp($code, '(?s)<td><a href="(.*?)" rel="nofollow">.*?</a></td>(?s)', 3)
	For $a = 0 To UBound($cuerpo)-1

		$link = "www.911tabs.com" & $cuerpo[$a]
        ;$enlacearchivo =
		;DirCreate(@DesktopDir&"\"&$artista)
	Next
endfunc
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Problemas con javascript al obtener enlaces

Mensaje por jamaro »

Hola arkcrew:

En el enlace de una canción (por ejemplo el que has puesto tú):
http://tabs.ultimate-guitar.com/g/gamma ... ar_pro.htm

tenemos una parte en la página con un botón para descargar la canción que genera el segundo enlace que has puesto.
En este segundo enlace tenemos dos partes importantes y variables, en función del archivo que tenemos que bajar:

http://www.ultimate-guitar.com/tab_down ... =[b]219825[/b]&token=50f223c254517c3dba75ad74839cc3e494687da7

Utilizando el complemento FireBug en el navegador FireFox vemos que el recuadro donde está el botón para bajar el archivo está el siguiente código HTML:

<div class="textversbox" style="width:283px;">
<input id="tab_id" type="hidden" value="219825" name="tab_id">
<button class="red prosubmit" type="submit">Download "Razorblade Sigh" Guitar Pro Tab</button>
<br>
<b class="verd fs-10 gray">
For text version of this tab please
<a class="blue verd fs-10" target="_blank" href="http://www.ultimate-guitar.com/search.p ... 952">click here</a>
</b>
<span id="tok">
<embed id="token" width="1" height="1" allowscriptaccess="always" quality="high" bgcolor="#FFFFFF" name="token" style="undefined" src="http://img.ultimate-guitar.com/swf/Token.swf" type="application/x-shockwave-flash">
</span>
<input type="hidden" name="token" value="50f223c254517c3dba75ad74839cc3e494687da7">
</div>


Como vemos, hay dos input ocultos con los valores en negrita que son el tab_id y el token del enlace del archivo.

Ahora bien, si en el mismo navegador pongo "Ver código fuente de la página" (es lo mismo que en Autoit InetGetSource, en lugar del input token tengo esto:

<script type="text/javascript">
var s2 = new SWFObject("http://img.ultimate-guitar.com/swf/Toke ... "1","9.0.0", "#FFFFFF");
s2.addParam("allowScriptAccess", "always");
s2.write("tok");
</script>

Pero si en Autoit utilizamos _IEDocReadHTML:

Código: Seleccionar todo

#include <IE.au3>
;$oIE = _IE_Example ("basic")
$oIE = _IECreate('http://tabs.ultimate-guitar.com/g/gamma_ray/razorblade_sigh_ver2_guitar_pro.htm',0,0)
$sHTML = _IEDocReadHTML ($oIE)
ConsoleWrite($sHTML)
en el código HTML que muestra en la consola sí que aparece el "token" generado:

<SPAN id=tok>
<OBJECT id=token classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=1 height=1><PARAM NAME="_cx" VALUE="26"><PARAM NAME="_cy" VALUE="26"><PARAM NAME="FlashVars" VALUE=""><PARAM NAME="Movie" VALUE="http://img.ultimate-guitar.com/swf/Token.swf"><PARAM NAME="Src" VALUE="http://img.ultimate-guitar.com/swf/Token.swf"><PARAM NAME="WMode" VALUE="Window"><PARAM NAME="Play" VALUE="0"><PARAM NAME="Loop" VALUE="-1"><PARAM NAME="Quality" VALUE="High"><PARAM NAME="SAlign" VALUE=""><PARAM NAME="Menu" VALUE="-1"><PARAM NAME="Base" VALUE=""><PARAM NAME="AllowScriptAccess" VALUE="always"><PARAM NAME="Scale" VALUE="ShowAll"><PARAM NAME="DeviceFont" VALUE="0"><PARAM NAME="EmbedMovie" VALUE="0"><PARAM NAME="BGColor" VALUE="FFFFFF"><PARAM NAME="SWRemote" VALUE=""><PARAM NAME="MovieData" VALUE=""><PARAM NAME="SeamlessTabbing" VALUE="1"><PARAM NAME="Profile" VALUE="0"><PARAM NAME="ProfileAddress" VALUE=""><PARAM NAME="ProfilePort" VALUE="0"><PARAM NAME="AllowNetworking" VALUE="all"><PARAM NAME="AllowFullScreen" VALUE="false"></OBJECT></SPAN><INPUT value=50f223c254517c3dba75ad74839cc3e494687da7 type=hidden name=token></DIV>

A partir de ahí es simplemente sacar ese contenido del HTML.

Espero haberte ayudado.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Problemas con javascript al obtener enlaces

Mensaje por Ximorro »

jamaro eres una máquina.

¡arkcrew me has asustado con tanto include! :smt005
Supongo que es cosa del copy-paste, pero a veces es mejor quitar algunos que sobren para que no vaya más lento al compilar.

Eso es una tontería que me ha hecho gracia, pero una cosa que sí es más importante son los errores de la función de decodificación. ¿Cómo pones códigos ASCII tan grandes?, de más de 80000 incluso. El código ASCII sólo llega hasta 255, y eso el extendido, que el básico es de 7 bits (hasta 127).
Fíjate en la ayuda de CHR():
Parámetros
código ASCII: Un código ASCII en el rango entre 0-255


De hecho la función da error si le pasas un número mayor de 255.

Quizás estás intentando poner el código unicode, pero tampoco entiendo la conversión.
Si por ejemplo te encuentras un caráctes de "€" (ASCII 128, por cierto), ¿por qué carácter estás intentando sustituirlo? ¿y por qué, no te vale "€" directamente?
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Problemas con javascript al obtener enlaces

Mensaje por arkcrew »

JAJAJAJAJA

Si lo de los includes es cosa de copy paste, cuando tengo el código listo borro los innecesarios, y bueno, si, la función CHR sé que va de 0 a 255, solo que la función no recuerdo de donde demonios la copié xD ya la miraré y la dejaré funcional.

Muchas gracias Jamaro, esta misma tarde le doy un repaso a todo! saludos!!
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Problemas con javascript al obtener enlaces

Mensaje por arkcrew »

Vale, al final no me he podido resistir y lo he estado mirando.

Efectivamente usando la librería "IE.au3" con la función _IEDocReadHTML es posible obtener el texto y trabajar desde ahi, solo que debería buscar alguna manera de poder hacerse sin recurrir a la librería ya que el porceso debe ser lo más rápoido posible, ya que sino, el programa de poco sirve si se tarda menos entrando a la web y buscando que esperando que el programa trabaje...

Por eso quería mirar la parte del javascript... alguna idea?

Saludos
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Problemas con javascript al obtener enlaces

Mensaje por jamaro »

Gracias Ximorro, lo de indagar en el HTML viene de las otras aplicaciones que he ido/estoy haciendo.

arkcrew la velocidad no creo que sea por la librería, sino porque se tiene que cargar la página, aunque con el parámetro cero le decimos que la ventana del navegador esté oculta.

De todos modos, en cuanto a velocidad, Ximorro es el experto en ensayos/pruebas y comparaciones.

Saludos.
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Problemas con javascript al obtener enlaces

Mensaje por jamaro »

Releyendo algunos hilos de este foro (con ideas de Chefito) y buscando cosas similares para un "reto" de echar una mano a unos amigos con una conocida página para descargar series de televisión, veo que lo comentado arriba se obtiene facilmente con _IETagNameGetCollection.

Además, en el foro inglés, explican como obtener el nombre de un archivo que se descarga; y tras un rato leyendo y probando (nunca me salen las cosas a la primera) he llegado a esto:

Código: Seleccionar todo

#include <IE.au3>

; Abrimos la página
$oIE = _IECreate("http://tabs.ultimate-guitar.com/g/gamma_ray/razorblade_sigh_ver2_guitar_pro.htm",0,0)	; Poniendo el tercer parámetro a 0 hace que la ventana esté oculta

; Buscamos todos los input
$oInputs = _IETagNameGetCollection ($oIE, "input")

; Recorremos todos los input y guardamos los valores de los deseados
For $oInput In $oInputs
	if $oInput.name="tab_id" then Local $tab_id=$oInput.value
	if $oInput.name="token" then Local $token=$oInput.value
Next

; Creamos la URL con los valores obtenidos de los inputs
Local $url="http://www.ultimate-guitar.com/tab_download.php?tab_id="& $tab_id & "&token="& $token


; Obtenemos el nombre del archivo que nos devuelve la URL
$filename = HTTPFileName($url)
ConsoleWrite("El archivo es:" & $filename & @CRLF)

; Descargamos el archivo con su nombre
InetGet($url, $filename)
msgbox(0,"Aviso", "La descarga ha terminado.")

; Función del foro inglés
Func HTTPFileName($sUrl)
    $oHTTP = ObjCreate('winhttp.winhttprequest.5.1')
    $oHTTP.Open('POST', $sUrl, 1)
    $oHTTP.SetRequestHeader('Content-Type','application/x-www-form-urlencoded')
    $oHTTP.Send()
    $oHTTP.WaitForResponse
	ConsoleWrite($oHTTP.GetResponseHeader("Content-Disposition"))
	$ContentDisposition = StringRegExp($oHTTP.GetResponseHeader("Content-Disposition"), 'filename=\"?(\w*\.\w*)\"?',3)	; He modificado el patrón de la función del foro inglés (era sólo filename=(.*) )para que sirva tanto para ...filename=archivo.ext como para ...filename="archivo.ext" ya que he visto que hay páginas que devuelven el nombre de archivo entre comillas.
    Return     $ContentDisposition[0]
EndFunc
Con este código, una vez que tenemos el enlace a la página de la canción deseada, obtenemos tab_id y token (con la colección de tags), creamos la URL de descarga y la guardamos con el mismo nombre que nos da la página (función HTTPFilename())

arkcrew, insisto en que en mi opinión, el tiempo de espera es principalmente por lo que tarda en descargarse la página, no creo que por la librería en sí.

¡Saludos!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Problemas con javascript al obtener enlaces

Mensaje por Chefito »

Mmmmm....deciros que ultimamente he probado algunos códigos expuestos aquí en windows 7 y dan fallo. Por ejemplo, a mi no me sale el valor de token de ninguna forma con el w7, en cambio ejecutando el código que puso jamaro en un xp si aparece.

Tened cuidado con estas cosas. Si son para uso general teneis que probar los códigos en varios windows. No os podeis estancar en el xp. Pensad que w7 es un sistema operativo que se está extendiendo muchísimo.

Con esto digo, que estas soluciones no valen para uso general. Tendriais que buscar otra cosa que funcionase en w7.

Ahora que lo pienso, puede que solo me pase a mi con mi configuración de w7 y internet explorer. Si alguien lo puede probar en un w7 y confirmar mis sospechas que lo diga.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Problemas con javascript al obtener enlaces

Mensaje por arkcrew »

Cierto, en windows 7 tira error la función.. mal asunto , aunque igualmente pueda ser por el tiempo que tarda en cargar la página, vereis mi conexión es extremadamente lenta por eso intento siempre evitarme las funciones _IE, pero probaré en otro ordenador con una más rápida.

Pero mi idea era algún proceso más automático que permita bajar todas las tablaturas del tirón obteniendo la lista de enlaces sin tener que cargar muchas páginas, pero eso lo investigaré yo ya que hay muchas más páginas de tablaturas.

En breves os posteo más código!

Saludos!
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Problemas con javascript al obtener enlaces

Mensaje por arkcrew »

Gracias a todos,

esto está solucionado y terminado, os enlazo a donde programé la aplicación, ahi podeis ver el código fuente, capturas y bajar la apli!

http://www.emesn.com/autoitforum/viewto ... f=5&t=3061

Espero que os guste,

Saludos!
Responder