jueves, 7 de julio de 2016

Peticiones a Clientes Web en ASP Clásico



En esta entrada aprenderás a extraer datos de Sitios Webs haciendo peticiones al servidor utilizando el lenguaje de programación ASP clásico.

1) Inicializar las variables

Response.Buffer = True
Dim xml

2) Decidir cómo crear el objeto

Con:

Set xml = Server.CreateObject("Microsoft.XMLHTTP")

O con:

Set xml = Server.CreateObject("MSXML2.ServerXMLHTTP")

En mi caso utilizaré “MSXML2.ServerXMLHTTP” porque cuando utilicé “Microsoft.XMLHTTP” en una Web dónde había una redirección, me mostraba error y no podía obtener la nueva Web a la que estaba redireccionando.

A continuación veamos algunas diferencias entre XMLHTTP y ServerXMLHTTP

XMLHTTP se utiliza, generalmente, en la comunicación cliente-servidor (por ejemplo, en una petición a un Servicio Web), también en transferencias de datos, por ejemplo utilizando el protocolo FTP. También permite el almacenamiento automático de la url en la memoria caché. XMLHTTP utiliza WinInet (Windows Internet Explorer) para su funcionamiento.

Por su parte ServerXMLHTTP está destinado a la comunicación entre servidores, aplicaciones clientes y procesamiento de peticiones entre clientes. En ServerXMLHTTP el estado se mantiene “activo”, es decir, la información enviada/recibida desde/hacia un destino se retiene en la conexión actual para ser utilizada en futuras transacciones de datos
ServerXMLHTTP crea una pila de cliente http, es decir, una sesión independiente del cliente http, lo que implica que pueden existir varias instancias activas del objeto ServerXMLHTTP en función de la memoria y la disponibilidad de conexiones. El objeto ServerXMLHTTP puede ser utilizado además para hacer peticiones/envío de datos de una aplicación a otra, incluso cuando se requiere que sea en tiempo real.

3) Abrir la conexión, en mi caso utilizaré el método POST aunque puedes utilizar GET u otro en dependencia del caso.

·         - site es el sitio Web al cuál quieres hacerle la petición.
·         - False es un indicador booleano que muestra si la llamada es o no asíncrona.

xml.Open "POST", site, False

4) Hacemos la petición con:

xml.Send

3) Si al hacer la petición te da un error puedes controlarlo con el típico try-catch aunque en ASP clásico se hace de esta manera:

Colocas este código al inicio de tu .asp “On Error Resume Next

Y luego después del xml.Send capturas el error (como aparece a continuación), en mi caso obligo a que el estado sea “Error 404” aunque lo puedes programar de forma diferente.

dim webStatus: webStatus = vbNullString
If Err.Number <> 0 Then
webStatus = ERROR_404
response.write "Error:" & Err.Number & " " & "Desc:" & Err.Description
else
webStatus = xml.status
end if
On Error GoTo 0

5)  Si el estado es “200”

if (webStatus = 200) then
      'Aquí puedes coger todos los datos que necesites
End if

Datos que puedes extraer de la Web

xml.responseText 'Código Html del sitio Web, mostrándolo por pantalla de esta manera response.write "<xmp>" & xml.responseText & "</xmp>"

xml.getOption(-1) 'Extrae la url de la Web, lo que nos ayudaría en caso de una redirección a comprobar si el “site” ha cambiado

Si quieres tener información de las páginas que enlaza nuestro sitio web en cuestión, aquí te dejo el código

'Declaración de Variables

Dim responseT : responseT = vbNullString
Dim registroExpresion : registroExpresion = vbNullString
Dim matches : matches = vbNullString
Dim http : http = vbNullString
Dim match : match = vbNullString

Set http = Server.CreateObject("WinHttp.WinHttpRequest.5.1")    
'http.SetTimeouts resolveTimeout, connectTimeout, sendTimeout, receiveTimeout
http.SetTimeouts 60000, 60000, 600000, 60000
http.Open "GET", site, False
http.Send

'Esperamos unos segundos a que termine la operación de envío asincrónico.
If http.WaitForResponse(5) Then
responseT = http.ResponseText
End If

Set http = Nothing
Set registroExpresion = New RegExp
registroExpresion.IgnoreCase = True
registroExpresion.Global = True

'Creamos la expression regular para extraer la url
registroExpresion.Pattern = "<a href=""(http|https)://(?!" & site & ")(.*?)"""

Set matches = registroExpresion.Execute(responseT)
If matches.Count > 0 Then
For Each match In matches
response.write "URL= " & match.SubMatches(1) & "<br/>"
Next
Else
response.write “No matches”
End If

*Aquí algunos enlaces que pueden ser de utilidad para el desarrollo de este tema:

Para probar expresiones regulares: http://regexr.com/

Sobre expresiones regulares:

Códigos de estados http