Problema al utilizar la función $WinHttpReq.send()

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
edgariyu
Mensajes: 6
Registrado: 26 Mar 2011, 12:00

Problema al utilizar la función $WinHttpReq.send()

Mensaje por edgariyu »

Hola a todos!

Mi problema es que estoy usando la función $WinHttpReq.send(), y cuando esta genera un error el script se detiene. El código utilizado seria simplemente:

Código: Seleccionar todo


$WinHttpReq = ObjCreate("winhttp.winhttprequest.5.1")	;Realizamos la peticion HTTP
$WinHttpReq.open("GET",$page)
$WinHttpReq.send()
Cuando la página esta caída o tiene problema al cargar la función genera un error y el script se detiene. He buscado en la página del " object reference" y creo que la sulución tiene que tener una pinta como la siguiente:

Código: Seleccionar todo

Global $g_eventerror = 0 

$WinHttpReq = ObjCreate("winhttp.winhttprequest.5.1")	;Realizamos la peticion HTTP
$WinHttpReq.open("GET",$page)
if $g_eventerror = 1 then
  $WinHttpReq.send()
else
  consolewrite("Error on page")
endif

Func MyErrFunc() 
local $HexNumber= hex($oMyError.number,8) 
If $HexNumber<> (80020009 or 80070005) Then
   ConsoleWrite("On Load error")
   $g_eventerror = 1 ; something to check for when this function returns 
EndIf
Endfunc
, pero no consigo hacer que funcione ya que no se qué numero es el que esta generando mi error, Simplemente quiero que al hacer esta llamada me printe un error por pantalla en lugar de pararme la ejecución (que es el comportamiento por defecto).

Agradeceria a alguien que tenga experiencia con este tema si me pudiera echar una mano con etse problema

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

Re: Problema al utilizar la función $WinHttpReq.send()

Mensaje por Chefito »

Hola.
Para tratar errores de objetos en autoit tienes que hacerlo llamando a ObjEvent("AutoIt.Error","MiFuncion"). Busca en la ayuda que te pone algún ejemplo.
Un ejemplo en tu caso podría ser:

Código: Seleccionar todo

Global $page="hola.com"    ;pagina que no existe
$oMyError = ObjEvent("AutoIt.Error","MyErrFunc") ; Install a custom error handler

$WinHttpReq = ObjCreate("winhttp.winhttprequest.5.1")   ;Realizamos la peticion HTTP
$WinHttpReq.open("GET",$page)
$WinHttpReq.send()
Exit 


; This is my custom error handler 
Func MyErrFunc() 
MsgBox(0,"Error en objeto COM","Ha habido algún tipo de error en el objeto COM")
Exit
Endfunc
Puedes ver el error que te produce mirando y comparando los errores que te devuelve el objeto. Eso lo tienes que mirar en la página web de microsoft.
También puedes evitar este tipo de errores de otras formas, como por ejemplo haciendo un ping a la página web a ver si te devuelve algo.

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 ;).
edgariyu
Mensajes: 6
Registrado: 26 Mar 2011, 12:00

Re: Problema al utilizar la función $WinHttpReq.send()

Mensaje por edgariyu »

Muchisimas gracias Chefito. No se me habia ocurrido la idea del ping y es buenisima! Sencilla de implementar y eficaz :) Mil gracias!
edgariyu
Mensajes: 6
Registrado: 26 Mar 2011, 12:00

Re: Problema al utilizar la función $WinHttpReq.send()

Mensaje por edgariyu »

La idea de utilizar el comando Ping() me pareció muy buena, pero me he dado cuenta que con una gran cantidad de páginas el resultado que se obtiene de realizar el ping es 0 con un error de tipo 4 (other error,es decir, un error de nada en concreto...).

Me devuelve error al realizar Ping a página que estan activas, de manera que parece que el comnado Ping no me sirve para separar entre páginas que estan caidas o tienen problemas de carga y las páginas que estan OK.

Un ejemplo de ello es la página www.dempresa.es (página elegida al azar), página que está activa pero al hacer ping devuelve error.

Entonces, ¿paso del comando ping y intento implementar la solución del handdler? O se te ocurre alguna otra solución para este problema??

Muchísimas gracias!!!
blityon
Mensajes: 2
Registrado: 21 Nov 2010, 07:48

Re: Problema al utilizar la función $WinHttpReq.send()

Mensaje por blityon »

Quizas esto pueda ayudarte

$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("POST", $Url, False)
$oHTTP.Send()
$EstadoPagina = $oHTTP.Status ; Esto por si quieres hacer algo con ello
ConsoleWrite($oHTTP.Status & @CRLF) ; Devuelve el codigo de estado de la pagina 200 es correcto
ConsoleWrite($oHTTP.StatusText & @CRLF) ; Devuelve el mensaje de estado de la pagina
ConsoleWrite(@CRLF)
$response = $oHTTP.ResponseText

Suerte

PD: No posteo a penas pero se agradece muchisimo todo lo que aportas Chefito en tantos mensajes aunque no se respondan.
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Problema al utilizar la función $WinHttpReq.send()

Mensaje por Chefito »

blityon, en este caso esa solución no vale, ya que quiere tratar un error interno que provoca el objeto COM. Habría que intentar tratar el problema antes de utilizar el objeto.
blityon escribió:PD: No posteo a penas pero se agradece muchisimo todo lo que aportas Chefito en tantos mensajes aunque no se respondan.
Gracias hombre :smt023 . Siempre se intenta ayudar en lo posible. Aunque si os habeis fijado ya no participo tantísimo como antes. Tengo demasiados mensaje, y ya hay gente que sabe mucho, lo mismo o incluso más que yo (si veis el foro sabreis quienes son sin decir nombres :smt002 ). Hay que dejar participarles. Además, estoy algo vago también :smt005 .
edgariyu escribió:Entonces, ¿paso del comando ping y intento implementar la solución del handdler? O se te ocurre alguna otra solución para este problema??
Como dije, haber hay varias soluciones para evitar un error en el objeto.
Una puede ser utilizando la función Inetgetsize. Si existe la página, te devolverá el tamaño en bytes, sino te devolverá 0 y @error un número de error.

Otra puede ser Inetread. Si existe te devolverá una cadena no vacía.

Otra muy buena solución es con _INetGetSource. Te devuelve el código fuente directamente (sin necesidad de archivo temporar) de la página.

Hay otras posibilidades, pero con alguna de las que te he dicho creo que tienes suficiente.

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 ;).
edgariyu
Mensajes: 6
Registrado: 26 Mar 2011, 12:00

Re: Problema al utilizar la función $WinHttpReq.send()

Mensaje por edgariyu »

Muchas gracias a los dos por vuestras respuestas.

Probare alguna de las opciones que me comentas Chefito. Mil gracias de nuevo, es un lujazo que estes en este foro ayudando y contestando tan rápido con solución para todo :)

Un saludo!
edgariyu
Mensajes: 6
Registrado: 26 Mar 2011, 12:00

Re: Problema al utilizar la función $WinHttpReq.send()

Mensaje por edgariyu »

Buenas a todos de nuevo,

Conseguí resolver el problema con _InetGetSource así que genial :)
Me gustaria preguntaros por algo que me pasa y que no se si es normal ya que no le encuentro la lógica.

Tengo un código que utiliza la llamada

$WinHttpReq = ObjCreate("winhttp.winhttprequest.5.1")
$WinHttpReq.open("GET",$link1)
$WinHttpReq.send()

muchas veces. No se porque pero algunas veces se produce un error al realizar el $WinHttpReq.send() y se para la ejecución. El error no es demasiado explicativo...simplemente te dice que hay error con la llamada (Requested action has failed). Aparentemente la página esta bien y no hay problema. Lo extraño es que si realizó solo esa llamada en un script aparte el resultado es correcto y no produce error, de hecho, una misma llamada a veces falla y volviendolo a ejecutar ya no falla, pero da error otra.
Estos errores se producen de forma aleatoria, en diferentes página, cosa que me tiene totalmente intrigado (mi código realiza del orden de centenares de estas llamadas)

¿A alguien se le ocurre el motivo por el que puede suceder esto?
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Problema al utilizar la función $WinHttpReq.send()

Mensaje por Chefito »

Mmmmm....que raro. No suele ir mal esto :smt017 . Puede que sea el tiempo de respuesta de la página, que tarda más de la cuenta y sigue el script para alante. No se :smt017 .
Y si metes algo de tiempo de espera entre las funciones? Un sleep.
Esta no es la mejor forma pero bueno. Lo suyo es tratar el error y volver a intentarlo. Mira la página web de microsoft que te informa de las propiedades, métodos y eventos de este objeto: http://msdn.microsoft.com/en-us/library/aa384106.aspx. Esta página está en la ayuda en Gui reference>Obj/COM Reference.

Puedes tratar los errores de los objetos con:

Código: Seleccionar todo

ObjEvent("AutoIt.Error","MyErrFunc")
Mira el ejemplo que hay en la ayuda, en la sección que te dije anteriormente, un poco más abajo. Mira objevent también.

Si no te quieres complicar, te adjunto las funciones creadas por trancexx and ProgAndy, dos máquinas del foro de habla inglesa. Hay funciones para todo y trata y devuelve los errores.

Saludos.
Adjuntos
WinHttp_1.6.1.7.zip
Funciones para el objeto WinHttp
(99.59 KiB) Descargado 214 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 ;).
edgariyu
Mensajes: 6
Registrado: 26 Mar 2011, 12:00

Re: Problema al utilizar la función $WinHttpReq.send()

Mensaje por edgariyu »

Mil gracias Chefito!! Probaré lo del sleep y le echaré un vistazo a las fucniones :)
Responder