Problema al loguearme en una página con autoit

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Problema al loguearme en una página con autoit

Mensaje por Jonny »

Hola,

Tras ver que no hay solución alguna al problema que planteo en éste post:
http://www.emesn.com/autoitforum/viewto ... f=3&t=1509
He decidido como último recurso, probar lo que me sugirió Chefito, que se trata de refrescar la página en la que estoy logueado y caduca la sesión. No se si funcionará, pero imagino que debería...
Así pues, me he puesto manos a la obra, y he empezado a hacer un timer, que cada x segundos actualiza la página, pero antes comprueba mediante el valor de una variable si se está logueado en ésta, para si no es así loguearse.

La página sobre la que tengo que trabajar es:
http://www.lacaixa.es
En ésta,todo funciona bien. Se introduce el usuario y la contraseña en los campos correspondientes y se cliquea sobre el botón entrar.
Pero, como no´, tenía que haber un problema....

Resulta, que al refrescar la página con F5, aparece el típico mensaje de Internet explorer, que dice que no puede actualizarse la página sin reenviar la información, etc.
Esto no me convence para lo que tengo que hacer, así que he buscado otra solución. ésta es:
mobil.lacaixa.es
(Versión wap de la página de la caixa).
en realidad, me gusta más ésta pagina, pues al ser la versión wap es más reducida y por tanto se supone que más ligera de procesar a la hora de extraer la información necesaria.

Tengo hecho el siguiente código para el login en ésta web:

Código: Seleccionar todo


_IELinkClickByText($IeObj, "Castellano", 0, 1)
_IeLoadWait($IeObj)
_IELinkClickByText($IeObj, "Línea Abierta", 0, 1)
_IeLoadWait($IeObj)
$InpUs=_IEGetObjByName($IeObj, "E")
$InpPass=_IEGetObjByName($IeObj, "B")
$Button=_IEGetObjByName($IeObj, "Entrar")
_IeFormElementSetValue($InpUs, "usuario")
_IeFormElementSetValue($InpPass, "contraseña")
_IeAction($Button, "CLICK")
_IeLoadWait($IeObj)

Los campos de usuario y contraseña se rellenan correctamente, el problema está a la hora de pulsar sobre el botón "Entrar".
No funciona. Creo que se el porqué, y es porque no tiene el atributo name...

¿Como puedo hacerlo entonces?

Muchas gracias de antemano.

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

Re: Problema al loguearme en una página con autoit

Mensaje por Chefito »

Hay muchas muchas soluciones :smt003 .
Te doy dos:
Una con funciones de AutoIt:

Código: Seleccionar todo

#include <IE.au3>

$IeObj=_IECreate("https://loc12.lacaixa.es/WAP/SPDServlet?PN=LGN&PE=1&IDIOMA=02&CANAL=Y&PASSTHROUGH=ALWAYS&ORIGEN=50008&DEMO=0&ENTORNO=L&URL_DESC=/jsp/elolgnplogoff02.jsp")
$ieform=_IEFormGetCollection($IeObj,0)
$InpUs=_IEGetObjByName($ieform, "E")
$InpPass=_IEGetObjByName($ieform, "B")
_IeFormElementSetValue($InpUs, "usuario")
_IeFormElementSetValue($InpPass, "contraseña")
_IEFormSubmit($ieform)
_IeLoadWait($IeObj)
Y otra tratando el objeto directamente:

Código: Seleccionar todo

#include <IE.au3>

$IeObj=_IECreate("https://loc12.lacaixa.es/WAP/SPDServlet?PN=LGN&PE=1&IDIOMA=02&CANAL=Y&PASSTHROUGH=ALWAYS&ORIGEN=50008&DEMO=0&ENTORNO=L&URL_DESC=/jsp/elolgnplogoff02.jsp")
$InpUs=_IEGetObjByName($IeObj, "E")
$InpPass=_IEGetObjByName($IeObj, "B")
_IeFormElementSetValue($InpUs, "usuario")
_IeFormElementSetValue($InpPass, "contraseña")
$IeObj.document.forms(0).submit
_IeLoadWait($IeObj)
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 ;).
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Problema al loguearme en una página con autoit

Mensaje por Jonny »

Hola

Muchísimas gracias Chefito!
Utilicé el segundo código que pusiste y va perfecto!.
Esque la librería Ie.au3 se me atraganta un poco...
Y el tema de los objetos, pues como nunca lo he entendido del todo en ningún lenguaje, en autoit mucho menos, que no ví documentación (en castellano) así, que nunca imagino usarlos...

Además, me has hecho ver algo, y es que podía ahorrarse código, pues no es necesario cliquear en los dos primeros enlaces tal y como yo lo hacía, antes de poner los datos de acceso.

Gracias.

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

Re: Problema al loguearme en una página con autoit

Mensaje por Jonny »

Se me olvidó ...

¿Como compruebo si realmente se hizo el login?, no me refiero a si la página devolvió algún error por haber puesto mal la contraseña, o algo así, sinó si las funciones que intervienen en el proceso del logueo fallaron o no...
¿Que debería comprobar exactamente?
¿La línea $IeObj.document.forms(0).submit?

Espero, que ahora funcione el tema del refresh que es lo que falta. Aunque, si no funciona no me preocupará, pues en el timer que he hecho para intentar tener siempre la página que necesito cargada en $IeObj, hice que si no puede refrescarse ponga la variable que controla si se está logueado a 0 (no logueado) y se vuelva a llamar así mismo, de forma que volverá a loguearse...
a ver que os parece:

Código: Seleccionar todo

#Include <Ie.au3>
Global $BankUser="usuario"
Global $BankPassword="contraseña"
Global $Conn=0
$SmsLyteBuyVerifyThread=_Timer_SetTimer($WindowHandler, 0, "SmsLyteBuyVerifyThread")
Func SmsLyteBuyVerifyThread($hWnd, $Msg, $iIDTimer, $dwTime)
_Timer_KillTimer($WindowHandler, $SmsLyteBuyVerifyThread)
If $IeConn==0 Then
$IeObj=_IECreate("https://loc12.lacaixa.es/WAP/SPDServlet?PN=LGN&PE=1&IDIOMA=02&CANAL=Y&PASSTHROUGH=ALWAYS&ORIGEN=50008&DEMO=0&ENTORNO=L&URL_DESC=/jsp/elolgnplogoff02.jsp", 0, 0)
If @Error<>0 Then
$SmsLyteBuyVerifyThread=_Timer_SetTimer($WindowHandler, 1800, "SmsLyteBuyVerifyThread")
Return
EndIf
$InpUs=_IEGetObjByName($IeObj, "E")
$InpPass=_IEGetObjByName($IeObj, "B")
_IeFormElementSetValue($InpUs, $BankUser)
_IeFormElementSetValue($InpPass, $BankPassword)
$IeObj.document.forms(0).submit
$IeConn=1
$SmsLyteBuyVerifyThread=_Timer_SetTimer($WindowHandler, 1800, "SmsLyteBuyVerifyThread")
Return
Else
$IeRefresh=_IEAction($IEObj, "refresh")
If $IeRefresh==0 Then
$IeConn=0
_IeQuit($IeObj)
EndIf
$SmsLyteBuyVerifyThread=_Timer_SetTimer($WindowHandler, 1800, "SmsLyteBuyVerifyThread")
Return
EndIf
EndFunc
Se supone, que esta función se ejecuta al iniciar el programa, y se loguea en la página de la caixa, pues $IeConn vale 0. Una vez logueado, $IeConn se iguala a 1 y se llama nuevamente a la función a los ... 3 minutos, para no dar mucha caña al servidor de la web (seguramente podía dejarse más tiempo entre las llamadas, pero prefiero quedarme corto).
En la próxima llamada se comprueba que $IeConn vale 1 y únicamente se refresca la página. Si se puede refrescar, se llama nuevamente a la función, si no se puede se iguala $IeConn a 0 y se llama nuevamente a la función, para que se realice el logueo nuevamente.
Únicamente falta comprobar que realmente se realizó el login y lo que no se, si en caso de caducar la sesión y por tanto la url de la página la función _IeAction() devolvería 1 de todas formas, o 0 por no poderse recargar ésta...

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

Re: Problema al loguearme en una página con autoit

Mensaje por Chefito »

Puffff...... que sepas que el código que pones no funciona :smt012 . Habría que hacerle varios retoques para que funcione :smt024 . Ya te ha pasado varias veces :smt021 .
Pero lo he mirado por encima (ojo!, no lo he podido probar....solo lo he mirado) y he visto algunos fallos.
Para empezar....porque llamas tantas veces a la función con _Timer_SetTimer???. Por que matas el timer si luego pase lo que pase lo vas a repetir???? Yo lo que haría es llamar a la función con _Timer_SetTimer una vez y ya está. Si tienes que comprobarlo continuamente......por que lo matas????. Matalo cuando verdaderamente ya no lo necesites más. En tu caso creo que sería justo antes de cerrar el programa.
Otra cosa....que sepas que 1800 milisegundos=1,8 sg. :smt005 . Si quieres ponerlo cada 3 minutos tienes que poner 180000 milisegundos.
Yo lo que haría sería cargar inicialmente la página y logearme. Despues llamar a la función con _Timer_SetTimer una vez, y dentro de ésta refrescaría la página. Y leyendo el texto de la página resultante del refresco, pondría una condición haciendo una cosa u otra: Si se refresca bien....pues no haría nada :smt005 (esperaría a que se ejecutase dentro del tiempo puesto, 3 minutos, otra vez la función y vuelta a empezar.), y si al refrescar la página a caducado o lo que sea (vamos...que no es la buena), pues me logearía de nuevo, comprobando que lo ha hecho bien. Esto lo podrías hacer dentro de un while, otro timer, lo que te interese. Haz pruebas.
Respecto a como detectar errores fuera de lo común, pues puedes mirar los resultados de la página, los errores que te dan las funciones (@error), etc.

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 ;).
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Problema al loguearme en una página con autoit

Mensaje por Jonny »

Hola,

puag. Es cierto lo de los segundos, es lo que tiene programar cuando no han puesto todabía las calles, o cuando las quitaron hace rato...

El parar el timer y volver a ejecutarlo pase lo que pase, es, porque primero, así podía probar bien lo que hacía sin necesidad de reiniciar el pc, como ya me pasó más de una vez. Y segundo, para evitar solapamientos....
Qería con eso evitar, que se refrescara la página dos veces simultáneamente, un lapsus con lo de los segundos, pues si se ejecuta cada 3 minutos no debe ocurrir esto.

Por lo demás, al poner el código aquí después, ví que efectivamente no funcionaba del todo bien. Tras mirarlo no tardé en darme cuenta de lo que pasaba...
Efectivamente, el timer se ejecuta cada poco menos de 2 segundos y no se esperaba a que se cargara la página despues de rellenar los campos del login y pulsar "Entrar", así pues, salía el mensaje de que no puede actualizarse la página sin reenviar la información, etc...

ahora lo arreglé, esperando que se carguen las páginas que lo requieran y cliqueando en los enlaces correspondientes para llegar a la cuenta corriente que deseemos (hay que poner el número).

Código: Seleccionar todo

#Include <Ie.au3>
Global $BankUser="usuario"
Global $BankPassword="contraseña"
Global $Conn=0
$SmsLyteBuyVerifyThread=_Timer_SetTimer($WindowHandler, 180000, "SmsLyteBuyVerifyThread")
Func SmsLyteBuyVerifyThread($hWnd, $Msg, $iIDTimer, $dwTime)
If $IeConn==0 Then
$IeObj=_IECreate("https://loc12.lacaixa.es/WAP/SPDServlet?PN=LGN&PE=1&IDIOMA=02&CANAL=Y&PASSTHROUGH=ALWAYS&ORIGEN=50008&DEMO=0&ENTORNO=L&URL_DESC=/jsp/elolgnplogoff02.jsp", 0, 0)
If @Error==0 Then
$InpUs=_IEGetObjByName($IeObj, "E")
$InpPass=_IEGetObjByName($IeObj, "B")
_IeFormElementSetValue($InpUs, $BankUser)
_IeFormElementSetValue($InpPass, $BankPassword)
$IeObj.document.forms(0).submit
_IeLoadWait($IeObj)
_IELinkClickByText($IeObj, "Cuentas", 0, 1)
_IELinkClickByText($IeObj, "aqui_la_cuenta_a_la_que_queremos_acceder", 0, 1)
$IeConn=1
EndIf
Else
$IeRefresh=_IEAction($IEObj, "refresh")
If $IeRefresh==0 Then
$IeConn=0
_IeQuit($IeObj)
EndIf
EndIf
EndFunc
a ver que tal está ahora, yo creo que mejor.

Salu2!
Responder