In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Operaciones automatizadas con Xailer

Foro público de Xailer en español
Responder
ryder1912
Mensajes: 29
Registrado: Jue Jul 09, 2015 8:17 pm

Operaciones automatizadas con Xailer

Mensaje por ryder1912 »

Buenas a todos. Necesito ayuda para realizar operaciones administrativas automatizadas con xailer.
He visto este topico: viewtopic.php?f=26&t=11848&p=46579&hili ... ser#p46579
donde se puede ingresar a una web y completar campos de ingreso (User y Password).

La idea es mas o menos la misma, ingresar a la pagina de la AFIP, ir a un determinado servicio, descargar comprobantes de manera automatica y salir (LogOut).
Segui el ejemplo pero no me salió, y no sé como trabajar el InnerText y el Inner HTML.
Puedo ingresar el usuario pero no puedo hacer que siga para adelante (Submit), para que vaya al siguiente formulario donde pide el password.
Por ahora tengo esas dudas, si funciona, despues tengo que ingresar a algun servicio descargar comprobantes.

Aqui dejo el codigo y un algunas imagenes para darles una idea. (El password no lo publico salvo por msje privado).
Desde yá, gracias.

Código: Seleccionar todo


#include "Xailer.ch"
CLASS TForm1 FROM TForm

   COMPONENT oOcx

   METHOD CreateForm()
   METHOD FormInitialize( oSender )
   METHOD FillVar( cVar, xValue )

ENDCLASS

#include "Form1.xfm"

//------------------------------------------------------------------------------

METHOD FormInitialize( oSender ) CLASS TForm1
local cResult1, cResult2

   ::lCentered:=.T.
   ::Maximize()

   WITH OBJECT ::oOcx := TWebBrowser():New( self )
      :nAlign := alCLIENT
      :Create()
      :Navigate( "https://auth.afip.gob.ar/contribuyente/" )
      WHILE :busy
         ProcessMessages()
      END
   END

   ::FillVar( "F1:username", "27926504512" )

   ::oOcx:Document:getElementById("F1:btnSiguiente"):Focus()
   ::oOcx:Document:Forms[0]:Submit()

   WHILE ::oOcx:Busy
      ProcessMessages()
   END

   cResult1 := ::oOcx:Document:Body:InnerText
   cResult2 := ::oOcx:Document:Body:Innerhtml

RETURN Nil

//------------------------------------------------------------------------------
METHOD FillVar( cVar, xValue ) CLASS TForm1
LOCAL oField
   // F1:username,
   // F1:btnSiguiente
   IF ! Empty( ::oOCX )
      oField := ::oOcx:Document:GetElementByID( cVar )
      oField:Value := xValue
   ENDIF

RETURN Nil
Ingreso del Usuario
Login01.png
Login01.png (20.61 KiB) Visto 1126 veces
Ingreso del Password
Login02.png
Login02.png (19.26 KiB) Visto 1126 veces
Algunos servicios al cual se quiere acceder
Servicios01.png
Servicios01.png (38.82 KiB) Visto 1126 veces
ryder1912
Mensajes: 29
Registrado: Jue Jul 09, 2015 8:17 pm

Re: Operaciones automatizadas con Xailer

Mensaje por ryder1912 »

Buenas a todos. Hasta ahora solo pude hacer la primera parte, ingresar el usuario. Pero no puedo hacer que complete el campo de la contraseña, siempre lo deja en blanco.
Aqui dejo el codigo, esta hecho con el timer, se puede mejorar, aclaro que a veces tira error pq tarda en cargar la pagina.
Tengo dos consultas, como puedo hacer que complete el campo F1:password ?
y la otra, hay lguna manera de correr el programa con Firefox?
Slds.

Código: Seleccionar todo

#include "Xailer.ch"

CLASS TForm1 FROM TForm

   COMPONENT oOcx
   COMPONENT oTimer1

   METHOD CreateForm()
   METHOD FormInitialize( oSender )
   METHOD FillVar( cVar, xValue )
   METHOD Timer1Timer( oSender )

ENDCLASS

#include "Form1.xfm"

//------------------------------------------------------------------------------

METHOD FormInitialize( oSender ) CLASS TForm1
local cResult1, cResult2

   ::lCentered:=.T.
   ::Maximize()

   WITH OBJECT ::oOcx := TWebBrowser():New( self )
      :nAlign := alCLIENT
      :Create()
      :Navigate( "https://auth.afip.gob.ar/contribuyente/" )
      WHILE :busy
         ProcessMessages()
      END
   END

   WHILE ::oOcx:Busy
      ProcessMessages()
   END

   cResult1 := ::oOcx:Document:Body:InnerText
   cResult2 := ::oOcx:Document:Body:Innerhtml

   ::Timer1Timer()

RETURN Nil

//------------------------------------------------------------------------------
METHOD FillVar( cVar, xValue ) CLASS TForm1
LOCAL oField

   IF ! Empty( ::oOCX )
      oField := ::oOcx:Document:GetElementByID( cVar )
      oField:Value := xValue
   ENDIF

RETURN Nil

//------------------------------------------------------------------------------

METHOD Timer1Timer( oSender ) CLASS TForm1
local cCUILT, cBtnSgte, cPass, cBtnIng
Local oShell := CreateObject( "WScript.Shell" )

   ::oTimer1:lEnabled:=.T.

   cCUILT  :=::oOcx:Document:getElementById("F1:username")
   cBtnSgte:=::oOcx:Document:getElementById("F1:btnSiguiente")

   cPass   :=::oOcx:Document:getElementById("F1:password")
   cBtnIng :=::oOcx:Document:getElementById("F1:btnIngresar")

   // Ingreso de Usuario
   if ValType(cCUILT) <> Nil .and. ValType(cBtnSgte) <> Nil
      //empty(cCUILT:Value) .and. (cBtnSgte:Name="F1:btnSiguiente" .and. cBtnSgte:Value=="SIGUIENTE")

      ::FillVar( "F1:username", "27926504512" )

      oShell:SendKeys( Chr(9) )
      oShell:SendKeys( Chr(13))

   // Ingreso de Password
   elseif ValType(cPass) <> Nil .and. ValType(cBtnIng) <> Nil

      //empty(cPass:Value) .and. (cBtnIng:Name="F1:btnIngresar" .and. cBtnSgte:Value=="INGRESAR")

      ::FillVar( "F1:password", "prueba" )

     // ::oOcx:Document:GetElementByID( "F1:password" ):Value:="prueba"

      oShell:SendKeys( Chr(9) )
      oShell:SendKeys( Chr(9) )
      oShell:SendKeys( Chr(13))

      ::oTimer1:lEnabled:=.F.
   endif

   oShell := Nil

RETURN Nil
ryder1912
Mensajes: 29
Registrado: Jue Jul 09, 2015 8:17 pm

Re: Operaciones automatizadas con Xailer

Mensaje por ryder1912 »

Buenas a todos. Pude avanzar en la primera parte en cuanto al usuario y login. Le mande un timer y funciona bien.
3 - Mis Retenciones.png
3 - Mis Retenciones.png (153.58 KiB) Visto 883 veces
El problema ahora es que no puedo hacer que entre a algunos de los servicios. Es mas, al hacer click con el mouse en los servicios sale de la aplicacion y abre una pagina con el explorer mostrando el error 401.
Como puedo hacer para que haga click de manera automatica en uno de los servicios y no salga de la apllicacion?

Este es el codigo del formulario de los Servicios

Código: Seleccionar todo


<form id="j_idt49" name="j_idt49" method="post" action="/contribuyente_/menu.xhtml" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_idt49" value="j_idt49" />
<div class="units-row">
<div class="unit-65 ">
	<h5 class="arrowBlue  marginTop-25">Servicios Habilitados</h5>
	<div class="unit-50">
		<ul class="arrowCeleste2 marginLeft-20">
			<li class="marginTop-10"><a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt63:0:j_idt66':'j_idt49:j_idt63:0:j_idt66','serviceName':'siap_web_f762','userId':'20301445626'},'_blank');return false">
						<p class="azul bold font-size-14">Bienes Personales Web</p>
						</a>
						<p>Presentación de la declaración jurada de bienes personales mediante servicio Web </p>
			</li>
			<li class="marginTop-10"><a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt63:2:j_idt66':'j_idt49:j_idt63:2:j_idt66','serviceName':'curriculum','userId':'20301445626'},'_blank');return false">
						<p class="azul bold font-size-14">ASPA - Aplicación para Selección de Personal AFIP</p>
						</a>
						<p>Carga de Currículum Vitae en AFIP</p>
			</li>
			<li class="marginTop-10"><a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt63:4:j_idt66':'j_idt49:j_idt63:4:j_idt66','serviceName':'mis_aportes','userId':'20301445626'},'_blank');return false">
						<p class="azul bold font-size-14">Aportes en línea</p>
						</a>
						<p>Consulta de la situación personalobra social, riesgo del trabajo) respecto al destino</p>
			</li>
			 <li class="marginTop-10"><a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt63:6:j_idt66':'j_idt49:j_idt63:6:j_idt66','serviceName':'rcel','userId':'20301445626'},'_blank');return false">
						<p class="azul bold font-size-14">Comprobantes en línea</p>
                                                </a>
						<p>Sistema de emisión de comprobantes electrónicos</p>
                        </li>
			<li class="marginTop-10"><a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt63:8:j_idt66':'j_idt49:j_idt63:8:j_idt66','serviceName':'fenix_f1746','userId':'20301445626'},'_blank');return false">
						<p class="azul bold font-size-14">Devolución de percepciones</p>
						</a>
						<p>Solicitud para devolución de la percepción del 35% Bienes Personales - F.1746</p>
			</li>
			<li class="marginTop-10"><a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt63:10:j_idt66':'j_idt49:j_idt63:10:j_idt66','serviceName':'ivr','userId':'20301445626'},'_blank');return false">
						<p class="azul bold font-size-14">Fiscalización Electrónica</p>
						</a>
						<p>Fiscalización Electrónica</p>
			</li>
			<li class="marginTop-10"><a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt63:12:j_idt66':'j_idt49:j_idt63:12:j_idt66','serviceName':'mis_retenciones','userId':'20301445626'},'_blank');return false">
						<p class="azul bold font-size-14">Mis Retenciones</p>
						</a>
						<p>Mis Retenciones / Percepciones</p>
			</li>
			<li class="marginTop-10"><a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt63:14:j_idt66':'j_idt49:j_idt63:14:j_idt66','serviceName':'minmodernizacion-paec','userId':'20301445626'},'_blank');return false">
						<p class="azul bold font-size-14">PAEC</p>
						</a>
						<p>PAEC - Plataforma de Autenticación Electrónica Central del Gobierno de la Nación</p>
			</li>
			<li class="marginTop-10"><a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt63:16:j_idt66':'j_idt49:j_idt63:16:j_idt66','serviceName':'setidj','userId':'20301445626'},'_blank');return false">
						 <p class="azul bold font-size-14">Presentación de DDJJ y Pagos</p>
						</a>
						<p>Presentaciones de declaraciones juradas y pagos por medio de transferencia electrónica de datos</p>
			</li>
			<li class="marginTop-10"><a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt63:18:j_idt66':'j_idt49:j_idt63:18:j_idt66','serviceName':'regespcontribuyente','userId':'20301445626'},'_blank');return false">
						<p class="azul bold font-size-14">Registros Especiales de Seguridad Social</p>
						</a>
			                        <p>Registros Especiales de la Seguridad Social</p>
                        </li>
		</ul>
	 </div>
<input type="hidden" name="javax.faces.ViewState" id="j_id1:javax.faces.ViewState:2" value="6417567651541022326:-4385698076839662546" autocomplete="off" />
</form>
Lo mas importante es esta parte del codigo que hace referencia a los distinto tipos de servicios como se ve en la foto, y que se respite salvo por el id del servicio.
Nose mucho de javascript.

<a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt51:2:j_idt53':'j_idt49:j_idt51:2:j_idt53','serviceName':'arfe_certificado','userId':'20301445626'},'_blank');return false">
<p class="naranja bold font-size-14">Administración de Certificados Digitales</p>
</a>

Tambien dejo el codigo en xailer, como hice la primera parte, a ver si me pueden dar una mano.

Código: Seleccionar todo

/*
 * Proyecto: rpa
 * Fichero: Form2.prg
 * Descripción:
 * Autor:
 * Fecha: 19/03/2021
 */

#include "Xailer.ch"

CLASS TForm2 FROM TForm

   COMPONENT oOcx
   COMPONENT oTimer1
   COMPONENT oFolder1
   COMPONENT oFolderPage1
   COMPONENT oFolderPage2

   DATA lIngUsername   INIT .F.
   DATA lIngPassword   INIT .F.
   DATA lMenuPrincipal INIT .F.

   METHOD CreateForm()
   METHOD FormInitialize( oSender )
   METHOD Timer1Timer( oSender )

ENDCLASS

#include "Form2.xfm"

//------------------------------------------------------------------------------

METHOD FormInitialize( oSender ) CLASS TForm2
local cResult1, cResult2

   ::lCentered:=.T.
   ::Maximize()
   ::oFolder1:nIndex:=1

   WITH OBJECT ::oOcx :=  TWebBrowser():New( ::oFolderPage1 )
      :nAlign := alCLIENT
      :Create()
      :Navigate( "https://auth.afip.gob.ar/contribuyente/" )
      WHILE :busy
         ProcessMessages()
      END
   END

   WHILE ::oOcx:Busy
      ProcessMessages()
   END

   cResult1 := ::oOcx:Document:Body:InnerText
   cResult2 := ::oOcx:Document:Body:Innerhtml

   ::lIngUsername  :=.F.
   ::lIngPassword  :=.F.
   ::lMenuPrincipal:=.F.

   ::oTimer1:lEnabled:=.T.
   ::Timer1Timer()


RETURN Nil

//------------------------------------------------------------------------------

METHOD Timer1Timer( oSender ) CLASS TForm2
local cCUILT, cBtnSgte, cPass, cBtnIng, cForm
local oShell := CreateObject( "WScript.Shell" )
local cResult1, cResult2

   if !::lIngUsername .and. !::lIngPassword .and. !::lMenuPrincipal
      cCUILT  :=::oOcx:Document:getElementById("F1:username")
      cBtnSgte:=::oOcx:Document:getElementById("F1:btnSiguiente")
   endif

   if ::lIngUsername .and. !::lIngPassword .and. !::lMenuPrincipal
      cPass   :=::oOcx:Document:getElementById("F1:password")
      cBtnIng :=::oOcx:Document:getElementById("F1:btnIngresar")
   endif

   do case
      case !::lIngUsername .and. !::lIngPassword .and. !::lMenuPrincipal .and. ValType(cCUILT) <> Nil .and. ValType(cBtnSgte) <> Nil

           if empty(cCUILT:Value) .and. (cBtnSgte:Name="F1:btnSiguiente" .and. cBtnSgte:Value=="SIGUIENTE")

               ::oOcx:Document:getElementById("F1:username"):Value:="20301445626"  // CUIT o CUIL

               oShell:SendKeys( Chr(9) )
               oShell:SendKeys( Chr(13))

               ::lIngUsername:=.T.
               ::lIngPassword:=.F.

           endif

      case ::lIngUsername .and. !::lIngPassword .and. !::lMenuPrincipal .and. ValType(cPass) <> Nil .and. ValType(cBtnIng) <> Nil

           if empty(cPass:Value) .and. (cBtnIng:Name="F1:btnIngresar" .and. cBtnIng:Value=="INGRESAR")

               ::oOcx:Document:getElementById("F1:password"):Value:="Aqui va el password" // No lo comparto x cuestiones de seguridad

               oShell:SendKeys( Chr(9) )
               oShell:SendKeys( Chr(9) )
               oShell:SendKeys( Chr(13))

               ::lIngUsername  :=.T.
               ::lIngPassword  :=.T.
               ::lMenuPrincipal:=.F.

            endif
      case ::lIngUsername .and. ::lIngPassword .and. !::lMenuPrincipal
           ::lMenuPrincipal:=.T.
      case ::lIngUsername .and. ::lIngPassword .and. ::lMenuPrincipal
  
         // Aqui tengo problemas, la idea es que habra el servicio en la misma pagina o en la segunda pagina pero que no salga de la aplicacion
           ::oTimer1:lEnabled:=.F.
         
           cForm:=::oOcx:Document:getElementById("j_idt49") // Id del formulario de servicios
           cForm:OnClick:="mojarra.jsfcljs(document.getElementById('j_idt49'),{'j_idt49:j_idt63:12:j_idt66':'j_idt49:j_idt63:12:j_idt66','serviceName':'mis_retenciones','userId':'20301445626'},'_blank');return false"[/b]
 
   endcase
RETURN Nil

//------------------------------------------------------------------------------

Responder