Petición de un script de una página web

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Petición de un script de una página web

Mensaje por jamaro »

A raíz del hilo http://www.emesn.com/autoitforum/viewtopic.php?f=3&t=2866#p11696 y citando parte del mismo:
Jonny
Para conocer la petición de un script de una página WEB, podemos capturar el tráfico que se genera entre nuestro ordenador e internet. Así podremos ver con todo detalle entre otras cosas, como es la petición HTTP que hemos de hacer para acceder a un script de una web.
Sabiendo esto, solo nos quedará construir una petición igual y enviarla al servidor, que nos devolverá la respuesta generada por el script, que luego deberemos tratar para extraer la información que necesitemos.
Jonny ayer mismo estuve utilizando FireBug (complemento de Firefox) para ver la petición que se hacía al pulsar en un icono de un mapa de google maps (concretamente en la web http://www.bicing.cat de bicicletas públicas de Barcelona). Con Firebug reproduje la dirección de enlace (con sus parámetros) y no hubo manera, ni siquiera utilzando otro complemento de Firefox (Referer) y diciendo que el REFERER fuera http://www.bicing.cat.

¿Cómo "capturas el tráfico"? ¿sabrías decirme cómo averiguar la manera de obtener los datos? Antes estaban en otra página, pero han cambiado el sistema y ayer no conseguí "encontrarlos"

Saludos
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Petición de un script de una página web

Mensaje por Jonny »

Hola

Imagino, que intentaste hacer algo como:
www.bicing.cat/login.php?user=xxxx&password=yyyy
¿no?.

Por eso dije, que es mejor enviar los datos directamente mediante sockets, con las funciones TCP() de AutoIt.

No se si permitirán en el foro hablar de la captura del tráfico, puesto que puede usarse para fines ... fraudulentos, que no digo que sea tu caso. Por eso lo he mencionado así por encima.

No conozco ese complemento de Firefox, uso poco ese navegador. Pero te adelanto, que la página de bicing de Barcelona (www.bicing.cat) como muchas otras, no pasa los parámetros mediante GET, que es lo sencillo a la hora de construir un boot, sino mediante post, que por lo menos hace más entretenido la creación de este.

Aquí te dejo la petición que se hace para el login en www.bicing.cat. No se qué querrás hacer exactamente, pero te dejo una idea de por donde van los tiros. Por lo menos sabes que tienes que pasar los parámetros mediante POST, que ya es algo. Y si pretendías loguearte, ya tienes los parámetros que has de pasar y el script al que has de invocar:

Código: Seleccionar todo

POST /usuarios/login/validar_usuario.php HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://www.bicing.cat/
Accept-Language: es
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: www.bicing.cat
Content-Length: 38
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: PHPSESSID=778l0d5rsukng9bjum9t0tvsl3; __utma=201942018.686055322.1316699705.1316699705.1316699705.1; __utmb=201942018.1.10.1316699705; __utmc=201942018; __utmz=201942018.1316699705.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)

p_txtLogin=usuario&&p_txtPass=password
como dije en el otro hilo, no siempre son necesarias todas las cabeceras. Capturando el tráfico entre tu ordenador y el servidor (sea cual sea) verás que siempre aparecen las mismas cabeceras (todas, o casi todas). Esto es, porque los navegadores las incluyen para cumplir estríctamente con el protocolo HTTP, que es como debe ser. Pero en este caso, en que no pretendemos dibujar la web en una ventana (hacer un navegador), no es necesario incluir muchas de ellas, pues algunas sólo dan información acerca de las tecnologías que soportan, información del usuario etc etc.
Por otra parte, hay algunas que pueden ser utilizadas como trampa por los servidores. No es lo habitual, pero alguien que quiera medio proteger su página de boots puede hacerlo.
Si te fijas, (lo que te he puesto es la petición HTTP que hace IE 8) está hasta la cabecera referer, que seguramente no es usada por el script php...

Depende de ti como lo hagas. Si quieres ir quitando cabeceras innecesarias, enviarás menos código y por tanto se supone que la comunicación será más ligera (aunque ni notarás la diferencia) y tendrás menos código. Si prefieres dejar la petición así para asegurarte que funcione, también puedes hacerlo. Ojo, que esa petición no va a funcionar para cualquier web. Si esa misma la envías a www.google.com por ejemplo, no obtendrás seguramente el código de la página de Google, pues ni el host, ni los parámetros, ni el método de envío son los de Google...

Pero vamos, como podrás ver, modificarlo es un pliss, sin complicación alguna.

Por cierto, si quieres que tu script AutoIt termine rápido cuando haya obtenido los datos del servidor, cambia:

Código: Seleccionar todo

Connection: Keep-Alive
por:

Código: Seleccionar todo

Connection: close
Te recomiendo para usar esta manera de acceder a los servidores, conocer el protocolo HTTP, que no es muy complejo, y podrás hacer con más soltura estas cosas.

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

Re: Petición de un script de una página web

Mensaje por jamaro »

Hola de nuevo Jonny y gracias por tu pronta respuesta.

No pretendo entrar en la web como usuario, lo que pretendo es saber cuántas bicicletas libres hay en una estación la ciudad de Barcelona. Si entras en el mapa de bicing.cat en http://www.bicing.cat/localizaciones/localizaciones.php verás que sale un mapa con iconos ubicados en los puntos donde se puede recoger/dejar bicicletas. Al pinchar en un icono cualquiera se abre un "globo" indicando el nombre de la estación y las bicicletas libres. (Ver imagen de ejemplo)


Como te comenté antes, utilizando el complemento FireBug obtengo:

CABECERAS DE LA PETICIÓN (no tengo ni idea de cómo utilizarlo, salvo REFERER que ya lo utilizo en otras páginas que me exigen "venir" de una web en concreto)

Código: Seleccionar todo

Host: www.bicing.cat
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: text/html, */*
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://www.bicing.cat/
Content-Length: 84
Cookie: PHPSESSID=t61cn9k8edbjlds1ak4lpl3eu7; __utma=201942018.2145025300.1316701759.1316701759.1316701759.1; __utmb=201942018.2.10.1316701759; __utmc=201942018; __utmz=201942018.1316701759.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
DNT: 1
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
CABECERAS DE LA RESPUESTA (no tengo ni idea de si alguno de estos datos me sirve para algo)

Código: Seleccionar todo

Date: Thu, 22 Sep 2011 14:32:11 GMT
Server: Apache/2.2.3 (Red Hat)
X-Powered-By: PHP/5.2.17 ZendServer/5.0
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 569
Keep-Alive: timeout=5, max=50
Connection: Keep-Alive
Content-Type: text/html; charset=ISO-8859-15
UBICACIÓN CON PARÁMETROS (es, en principio la dirección donde se han generado los datos, recuperados del servidor, y los muestra)

Código: Seleccionar todo

http://www.bicing.cat/CallWebService/StationBussinesStatus_Cache.php?addressnew=MzE1IC0gQ0FSUkVSIERFTCBHVUlOQVJE0ywgMzItMzg%3D&idStation=315&s_id_idioma=ca
CUERPO DE LA RESPUESTA (el código que ha generado y que es precisamente lo que se muestra en el globo al pinchar en el icono de la estación)

Código: Seleccionar todo

<link rel="stylesheet" type="text/css" href="/general/estilos/estilos.css.php" />
<link rel="stylesheet" type="text/css" href="/general/estilos/estilos_interior.css.php" />

<div style="margin:10px">
<div style="font:bold 11px verdana;color:#DE0516;margin-bottom:10px">
	315 - CARRER DEL GUINARDÓ, 32-38<br>
</div>
<div style="text-align:right;float:left;font:bold 11px verdana">
Bicicletes : 13<br>
Espais buits : 9<br>
</div>
</div>
Con expresiones regulares he obtenido hasta ahora siempre los datos de las páginas web.
En este caso, los valores que tengo que obtener son 13 (que está entre Bicicletes: y <br> y 9 entre Espais buits: y <br>.

En principio a esta página llego sabiendo que necesito los datos de la estación 315, y por eso la ubicación con parámetros es:
http://www.bicing.cat/CallWebService/St ... ion=[b]315[/b]&s_id_idioma=ca

El tema está en que si pongo la URL que acabo de indicar en la barra de direcciones del explorador obtendo una página que sólo muestra dos líneas con dos puntos, vamos los que están detrás de bicicletes y espais buits, y no muestra los datos que debe recuperar del servidor.
Adjuntos
Capturar-1.jpg
Capturar-1.jpg (17.46 KiB) Visto 7541 veces
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Petición de un script de una página web

Mensaje por Jonny »

Bueno, lo del login era un ejemplo, que debería servir para casi cualquier caso.

Si no te funciona haciéndolo directamente, como te he dicho (cambiando POST por GET) y poniendo los parámetros que usas en la llamada (que tiene pinta de que no va a funcionar) debe ser, porque tiene que haber código JAVASCRIPT por medio que genere el globo que dices, y por eso no te funciona.

Lo que te he explicado, es para obtener datos generados por el servidor, pero estáticos una vez en el cliente (navegador). Lo que tú intentas capturar, es muy distinto. Si la información se muestra en un globo... ¿tooltip? de nada te servirá hacer la llamada de una u otra forma.

Lo que puedes hacer es, llamar a la URL que dices, como quieras: directamente como te he dicho, o como lo haces tú, y analizar y procesar el código JAVASCRIPT. No se mucho de ese lenguaje, así que no se si tratándolo podrías sacar la info que quieres. Sino, te quedará capturar el globo (en caso de que sea un tooltip) y extraer la información de ahí. Si tienes que hacer eso, suerte :), porque no se si la librería Ie.au3 o ff.au3 tendrán funciones para eso. Sino, la opción que mejor veo, es que busques el tooltip y extraigas la información de este.

Es un tema bastante complicado lo de los tooltips. Si siempre va a tener el mismo título, la misma posición etc, puede ser fácil de tratar, pero si varía te adelanto que tiene tela.
Espero que te sirva lo que te he dicho, y haberte entendido bien :P.

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

Re: Petición de un script de una página web

Mensaje por Chefito »

Mmmmmm.....no veis mis post y luego pasa lo que pasa :smt005 . Hace no tanto tiempo hablé de varios métodos para obtener los datos de una página por el método post. Supongo que entre todos alguno irá no?. Pues sí, ahí estaba la solución :smt002 .

Te dejo un ejemplo de lo que devuelve los datos de una estación. Como supongo que sabes, puedes conseguir estos datos de los códigos javascript (función load()) que genera la página web cuando cargas las estaciones. Estos datos los puedes obtener desde un objeto IE, hasta directamente bajando el código html de la página (mucho más rápido). También puedes con paciencia recolectar todas las estaciones y hacer una lista propia (parece que los datos son fijos). Lo que pasa que hay nada menos que 428 :smt005 :smt024 , y si encima te cambian los datos después de haberlo hecho es para matarlo :smt005 :smt005 . Tu verás.

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.bicing.cat")

; Simple-request it...
ConsoleWrite(_WinHttpSimpleRequest($hConnect, "POST", "/CallWebService/StationBussinesStatus_Cache.php", Default, "idStation=328&addressnew=MzYwIC0gQkFJTEVOLCA2Mg==&s_id_idioma=ca"))

; Close handles
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
Esta librería me gusta mucho. Es muy buena. Créditos a las máquinas ProgAndy y trancexx. Te la adjunto en un archivo zip.

Saludos.

Edito: Se me olvidaba. Te informo que puedes cambiar el parámetro de idiomas.....por si no te gusta el catalán :smt005 :smt005 . Yo he descubierto s_id_idioma=ca (catalan), s_id_idioma=es (español) y s_id_idioma=en (ingles). No se si habrá más :smt036 .
Adjuntos
Udf WinHttp 1.6.2.3.zip
Udf WinHttp versión 1.6.2.3
(107.44 KiB) Descargado 217 veces
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
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Petición de un script de una página web

Mensaje por Chefito »

Bueno, antes de acostarme se me ha ocurrido hacerlo también con la udf http de Greg "Overload" Laabs. Lo bueno de hacerlo así es que todo lo hace con funciones nativas de autoit, las que empiezan por tcp. No necesita ninguna librería externa. Y como veo que para hacer esto no se necesita liarse mucho, pues puede ser muy válida :smt023 .

Código: Seleccionar todo

#include <http.au3>
$sck=_HTTPConnect("www.bicing.cat")
$oinet=_HTTPPost("www.bicing.cat","/CallWebService/StationBussinesStatus_Cache.php",-1,_HTTPEncodeString("idStation=328&addressnew=MzYwIC0gQkFJTEVOLCA2Mg==&s_id_idioma=es"))
ConsoleWrite(_HTTPRead())
_HTTPClose()
Adjunto la udf.

Se puede hacer de más formas (wininet, objetos, etc), pero eso os lo dejo....si os interesa :smt024 .

Saludos.
Adjuntos
HTTP.au3
Udf http.au3
(15.28 KiB) Descargado 511 veces
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 ;).
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Petición de un script de una página web

Mensaje por jamaro »

Chefito escribió:Mmmmmm.....no veis mis post y luego pasa lo que pasa :smt005 . Hace no tanto tiempo hablé de varios métodos para obtener los datos de una página por el método post. Supongo que entre todos alguno irá no?. Pues sí, ahí estaba la solución :smt002 .
Chefito ¡no te enfades hombre! Muchas veces el tema no está en que no leamos, sino que no sabemos que las cosas se pueden hacer con algo que ya hemos visto e incluso utilizado.

En el programa MiBiciPública, gracias a vuestros comentarios, utilicé la UDF winHttp.au3 para obtener datos de una web que necesitava REFERRER:

Código: Seleccionar todo

Func OnRollLibres($marquesina)
	; El acceso a DomoBlue OnRoll para leer marquesinas se realiza con esta función para poder enviar un REFERRER que exige la página web que proporciona los datos
	; Necesario #include "WinHttp.au3"

	Global $Url="www.domoblue.com"
	Global $QueryString="/info_marquesina.php?id_marquesina="&$marquesina
	Global $Referrer = "www.domoblue.com"
	; Inicializa y obtiene el handle de la sesión
	Global $hOpen = _WinHttpOpen()
	; Obtiene el handle de la conexión
	Global $hConnect = _WinHttpConnect($hOpen, $Url)
	; Especifica la petición
	Global $hRequest = _WinHttpOpenRequest($hConnect, "GET", $QueryString, "HTTP/1.1", $Referrer)
	; Envía la petición
	_WinHttpSendRequest($hRequest)

	; Espera respuesta
	_WinHttpReceiveResponse($hRequest)

	; Comprueba si hay datos disponibles...
	If _WinHttpQueryDataAvailable($hRequest) Then
		;MsgBox(64, "OK", "Datos de "& $Url&" disponibles")
		Local $DatosDisponibles=_WinHttpReadData($hRequest,1)	; 0=ANSI, 1=UTF8, 2=Binary
		;MsgBox(64, "OK", $DatosDisponibles)
		local $Libres=StringRegExp($DatosDisponibles,"Hay (.*?) bicicletas",3)
		if @error=0 then
			;_ArrayDisplay($libres)
			;MsgBox(64,"OK", "Hay " & $Libres[0] & " bicis libres")
		Else
			Local $Libres[1]
			$Libres[0]=0
			;MsgBox(64,"OK", "No hay bicis libres")
		EndIf

	Else
		MsgBox(48, "Error", "Hay problemas con el sitio web de OnRoll para leer marquesina.")
	EndIf

	; Limpia
	_WinHttpCloseHandle($hRequest)
	_WinHttpCloseHandle($hConnect)
	_WinHttpCloseHandle($hOpen)

		return $Libres[0]
EndFunc

En aquél momento necesitaba entrar en la página de "domoblue" con el tema del REFERRER, pero no imaginaba ahora que también necesitaba esa UDF para entrar en la web de "bicing.cat", eso es... desconocimiento :smt002

Por cierto, gracias. Seguramente utilice el código de WinHTTP ya que utiliza la misma UDF y ya está en "includes", pero desde luego, la otra opción, de _HTTPPost es mucho más breve y cómoda.

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

Re: Petición de un script de una página web

Mensaje por Chefito »

jamaro escribió:Chefito ¡no te enfades hombre! Muchas veces el tema no está en que no leamos, sino que no sabemos que las cosas se pueden hacer con algo que ya hemos visto e incluso utilizado.
Tranquilo, no me enfado :smt005 . Casi nunca me enfado :smt002 .
jamaro escribió:pero no imaginaba ahora que también necesitaba esa UDF para entrar en la web de "bicing.cat", eso es... desconocimiento
Para eso está el foro, para hacernos conocer :smt002 . Bueno, pues ya lo sabes :smt005 .
jamaro escribió:Por cierto, gracias. Seguramente utilice el código de WinHTTP ya que utiliza la misma UDF y ya está en "includes", pero desde luego, la otra opción, de _HTTPPost es mucho más breve y cómoda.
De nada.
Lo de utilizar winhttp es muy buena opción.
No hay que fiarse de las apariencias. Puede que con winhttp sea mejor. Aunque veas menos código con la udf http, puede que las funciones que se utilizan tengan mucho más código que las de winhttp. Esto pasa con todo. Incluso con más código, puede que el largo sea mucho más rápido que el corto. La mejor manera que hay para saber cual es más rápido, es midiendo su velocidad de ejecución. Aunque en este caso no hace falta. Los dos son muy rápidos.

Por cierto, he editado el código del post anterior, el cual utilizaba la udf http, ya que no cerré la conexión :smt030 (_HTTPClose).

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 ;).
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Petición de un script de una página web

Mensaje por jamaro »

Chefito escribió:Por cierto, he editado el código del post anterior, el cual utilizaba la udf http, ya que no cerré la conexión :smt030 (_HTTPClose).
Ya decía yo que hacía mucho fresco por aquí. ¡Se quedó abierto el http! :smt003
Responder