RUC SUNAT

HMG en Español

Moderator: Rathinagiri

Post Reply
User avatar
edufloriv
Posts: 139
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB
Location: PERU
Has thanked: 1 time
Been thanked: 4 times

RUC SUNAT

Post by edufloriv » Sat Sep 30, 2017 5:08 pm

Saludos amigos,

Estoy tratando de compilar un ejemplo que compartieron hace algunos meses para hacer consultas de RUC acá en Perú:

Code: Select all

* ------------------------------------------------------ *
* SISTEMA     :                                          *
* PRG         :                                          *
* CREADO      :                                          *
* ACTUALIZADO :                                          *
* AUTOR       :                                          *
* COMENTARIOS :                                          *
* ------------------------------------------------------ *

#include <minigui.ch>

FUNCTION MAIN

   DEFINE WINDOW Win_1;
      AT 0,0 ;
      WIDTH 640 HEIGHT 460 ;
      TITLE 'Consulta RUC' ;
      ON INIT INISETS() ;
      MAIN

      DEFINE MAIN MENU
         POPUP "&Operaciones"
            ITEM '&1. Bajar captcha SUNAT'              ACTION BajarCaptcha()
         END POPUP
      END MENU

   END WINDOW

   CENTER WINDOW Win_1
   ACTIVATE WINDOW Win_1

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
* FUNCION...: INISETS
* COMENTARIO: INICIALIZA LOS SETEOS DEL SISTEMA.
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC INISETS

SET BELL       Off
SET CONSOLE    Off
SET CURSOR     Off
SET DATE TO BRIT
SET DELETED    On
SET DELIMITERS Off
SET ECHO       Off
SET EPOCH TO 1990
SET MESSAGE TO 22 CENTER
SET SAFETY     Off
SET SCOREBOARD Off
SET TALK       Off
SET WRAP       On
SETMODE(25,80)
ALTD(0)

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

Func BajarCaptcha

LOCAL cOrigen := "www.sunat.gob.pe/cl-ti-itmrcosruc/captcha?accion=image"
LOCAL cDestin := "c:\infofarma\tmp\ruc_capcha.jpg"

   IF URLDownLoad( cOrigen , cDestin )
      MsgInfo('Descarga exitosa')
   ENDIF

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

Func BuscaInfoRUC(cRuc,cCapcha)

local r
local i
local s
local nPos
local cN
local cD
local xL   := ''
local cF   := "test.txt"
local cUrl := "http://www.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias?accion=consPorRuc&nroRuc="+cRuc+" &codigo="+cCapcha+" &tipdoc=1"

if empty(cRuc)
   MsgStop("no ha ingresado RUC valido para consultar","Error")
else
   URLDownLoad(cUrl, cF)
   if file(cF)
      r:=MemoRead(cF)
      if at('El numero Ruc ingresado es invalido',r) > 0
         Msgwait("El numero Ruc ingresado es invalido o no existe",,1)
      else
         Do while .t.
            i:=At( CRLF, r )
            If i=0
               exit
            Endif
            s:=Left( r, i-1)

            r:=Subs( r, i+2)
            If (nP := at('N&#xFA;mero Ruc.', s ) ) > 0
               cN := substr(s, nP+16)
               If (nP := at(trim(cRuc), cN ) ) > 0
                  cN := substr(cN, nP+14)
                  cN := strtran(cN,"<br/>","")
                  cN := strtran(cN,"</small>","")
                  cN := STRTRAN(cN,"&#209;", "Ñ")
                  cN := STRTRAN(cN,"&#xD1;", "Ñ")
                  cN := STRTRAN(cN,"&#193;", "Á")
                  cN := STRTRAN(cN,"&#201;", "É")
                  cN := STRTRAN(cN,"&#205;", "Í")
                  cN := STRTRAN(cN,"&#211;", "Ó")
                  cN := STRTRAN(cN,"&#218;", "Ú")
                  cN := STRTRAN(cN,"&#xC1;", "Á")
                  cN := STRTRAN(cN,"&#xC9;", "É")
                  cN := STRTRAN(cN,"&#xCD;", "Í")
                  cN := STRTRAN(cN,"&#xD3;", "Ó")
                  cN := STRTRAN(cN,"&#xDA;", "Ú")
               endif
               MsgInfo(cN)  // muestro la informacion que me interesa
               exit
            Endif
         Enddo
      endif
   endif
endif

return nil


function URLDownLoad(cUrl, cSaveAs)
if ! URLDownloadToFile( 0, cUrl, cSaveAs, 0, 0 ) == 0
   retu.f.
endif
retu.t.
 
DLL32 FUNCTION URLDownloadToFile(pCaller AS LONG,szURL AS STRING, szFileName AS STRING, dwReserved AS LONG, lpfnCB AS LONG);
AS LONG PASCAL;
FROM "URLDownloadToFileA";
LIB "urlmon.dll"  // <-- Linea 151
El compilador me lanza error :
ruc-error.jpg
ruc-error.jpg (92.3 KiB) Viewed 1570 times
Les agradeceré su ayuda amigos.


Saludos cordiales,

Eduardo Flores Rivas


LIMA - PERU

User avatar
danielmaximiliano
Posts: 2090
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Has thanked: 115 times
Been thanked: 15 times
Contact:

Post by danielmaximiliano » Mon Oct 02, 2017 1:06 am

Hola Edu:
Dll32 FUNCTION es una función dentro de la librería contrib xhb .
Es necesario #include "hbdll.ch" y #require "xhb"
Y adicionar en el IDE de Hmg las rutas donde se encuentran los .ch de xharbour
Incpath
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`.HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. : +54901169026142
Telegram Name : DaNiElMaXiMiLiAnO

User avatar
edufloriv
Posts: 139
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB
Location: PERU
Has thanked: 1 time
Been thanked: 4 times

Post by edufloriv » Mon Oct 02, 2017 2:31 pm

Hola Daniel,

Gracias por tu respuesta. Revisando el HMG no existe en harbour\include el archivo hbdll.ch, lo descargue de un post del año 2012 que encontré en un grupo pero parece no funcionar:
hbdll.jpg
hbdll.jpg (143.7 KiB) Viewed 1498 times
Te agradeceré me lo hagas llegar por favor. Me parece que no viene en la distribución del HMG.


Saludos cordiales y nuevamente gracias por tu tiempo amigo.

Eduardo Flores Rivas


LIMA - PERU

User avatar
danielmaximiliano
Posts: 2090
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Has thanked: 115 times
Been thanked: 15 times
Contact:

Post by danielmaximiliano » Mon Oct 02, 2017 3:12 pm

Está dentro de harbour\contrib\xhb.
También en \harbour64\contrib\xhb
Sería mejor que descargues con la librería HBTip lo que necesitas
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`.HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. : +54901169026142
Telegram Name : DaNiElMaXiMiLiAnO

User avatar
edufloriv
Posts: 139
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB
Location: PERU
Has thanked: 1 time
Been thanked: 4 times

Post by edufloriv » Wed Oct 04, 2017 5:49 pm

Hola Daniel,

Estoy revisando la documentación de hbtip. Dime, el ejemplo tipwget.prg serviría para mi caso de descargar desde el site de SUNAT ("http://www.sunat.gob.pe/cl-ti-itmrcosru ... cion=image") ? solo tengo experiencia trabajando con FTP no he trabajado aún con http.


Agradecido por tu tiempo,



Att.

Eduardo Flores Rivas


LIMA - PERU

User avatar
edufloriv
Posts: 139
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB
Location: PERU
Has thanked: 1 time
Been thanked: 4 times

Post by edufloriv » Wed Oct 04, 2017 5:58 pm

Hola Daniel,

Creo que esto es lo que necesito cierto, lo encontré aca en el foro:

Code: Select all

PROCEDURE DownloadFromWWW
   param cURL, cLocalFileName
   LOCAL oCon, oUrl, i

   cLocalFileName := alltrim(cLocalFileName)
   
   oUrl := tURL():New( cUrl )
   IF Empty( oUrl )
      MsgBox("Invalid url " + cUrl)
      return
   ENDIF

   IF oUrl:cProto != "http"
      MsgBox('This is a header test for http. Use an http address.')
      return
   END
   
   oCon := TipClientHttp():New( oUrl )
   oCon:nConnTimeout := 20000
   MsgBox("Connecting with "+ oUrl:cServer)
   IF oCon:Open( cUrl )

   MsgBox("Connection eshtablished." +chr(10)+"Press OK to retrieve" + oUrl:cPath +oUrl:cFile)
   oCon:WriteAll(cLocalFileName)
   MsgBox("Downloaded...")
    oCon:Close()
   ELSE
      MsgBox("Can't connect with "+ oUrl:cServer)
      IF oCon:SocketCon == NIL
         MsgBox("Connection not initiated")
      ELSEIF hb_InetErrorCode( oCon:SocketCon ) == 0
         MsgBox("Server sayed: "+ oCon:cReply)
      ELSE
         MsgBox("Error in connection: " + hb_InetErrorDesc( oCon:SocketCon ))
      ENDIF
   END
RETURN
Confirmame, pero creo que voy a hacer pruebas, saludos.

Eduardo Flores Rivas


LIMA - PERU

User avatar
edufloriv
Posts: 139
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB
Location: PERU
Has thanked: 1 time
Been thanked: 4 times

Post by edufloriv » Wed Oct 04, 2017 8:08 pm

Daniel saludos,

Voy progresando. Ya logré descargar el captcha, al principio no podia porque la dirección de la Sunat habia cambiado, ahora tengo así mi código:

Code: Select all

* ------------------------------------------------------ *
* SISTEMA     :                                          *
* PRG         :                                          *
* CREADO      :                                          *
* ACTUALIZADO :                                          *
* AUTOR       :                                          *
* COMENTARIOS :                                          *
* ------------------------------------------------------ *

#include <minigui.ch>

FUNCTION MAIN

   DEFINE WINDOW Win_1;
      AT 0,0 ;
      WIDTH 640 HEIGHT 460 ;
      TITLE 'Consulta RUC' ;
      ON INIT INISETS() ;
      MAIN

      DEFINE MAIN MENU
         POPUP "&Operaciones"
            ITEM '&1. Bajar captcha SUNAT'         ACTION BajarCaptcha()
            ITEM '&2. Captcha a .TXT'              ACTION CaptchaToTxt()
         END POPUP
      END MENU

   END WINDOW

   CENTER WINDOW Win_1
   ACTIVATE WINDOW Win_1

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
* FUNCION...: INISETS
* COMENTARIO: INICIALIZA LOS SETEOS DEL SISTEMA.
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC INISETS

SET BELL       Off
SET CONSOLE    Off
SET CURSOR     Off
SET DATE TO BRIT
SET DELETED    On
SET DELIMITERS Off
SET ECHO       Off
SET EPOCH TO 1990
SET SAFETY     Off
SET SCOREBOARD Off
SET TALK       Off
SET WRAP       On
ALTD(0)

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

Func BajarCaptcha

//LOCAL cOrigen := "http://www.sunat.gob.pe/cl-ti-itmrcosruc/captcha?accion=image"
LOCAL cOrigen := "http://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/captcha?accion=image"
LOCAL cDestin := "c:\infofarma\tmp\captcha.jpg"

   URLDownLoad( cOrigen , cDestin )

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

Func CaptchaToTxt

LOCAL cEjecutable := chr(34)+'c:\Tes\tesseract.exe'+chr(34)
LOCAL cParameters := chr(34)+'c:\infofarma\tmp\captcha.jpg c:\infofarma\tmp\captcha -psm 7'+chr(34)

   ShellExecute( 0 , "open" , cEjecutable , cParameters )
   MsgInfo('Transformación realizada.')

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

Func BuscaInfoRUC(cRuc,cCaptcha)

local r
local i
local s
local nPos
local cN
local cD
local xL   := ''
local cF   := "test.txt"
local cUrl := "http://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias?accion=consPorRuc&nroRuc="+cRuc+" &codigo="+cCaptcha+" &tipdoc=1"
//local cUrl := "http://www.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias?accion=consPorRuc&nroRuc="+cRuc+" &codigo="+cCapcha+" &tipdoc=1"

if empty(cRuc)
   MsgStop("no ha ingresado RUC valido para consultar","Error")
else
   URLDownLoad(cUrl, cF)
   if file(cF)
      r:=MemoRead(cF)
      if at('El numero Ruc ingresado es invalido',r) > 0
         Msginfo("El numero Ruc ingresado es invalido o no existe",,1)
      else
         Do while .t.
            i:=At( CRLF, r )
            If i=0
               exit
            Endif
            s:=Left( r, i-1)

            r:=Subs( r, i+2)
            If (nP := at('N&#xFA;mero Ruc.', s ) ) > 0
               cN := substr(s, nP+16)
               If (nP := at(trim(cRuc), cN ) ) > 0
                  cN := substr(cN, nP+14)
                  cN := strtran(cN,"<br/>","")
                  cN := strtran(cN,"</small>","")
                  cN := STRTRAN(cN,"&#209;", "Ñ")
                  cN := STRTRAN(cN,"&#xD1;", "Ñ")
                  cN := STRTRAN(cN,"&#193;", "Á")
                  cN := STRTRAN(cN,"&#201;", "É")
                  cN := STRTRAN(cN,"&#205;", "Í")
                  cN := STRTRAN(cN,"&#211;", "Ó")
                  cN := STRTRAN(cN,"&#218;", "Ú")
                  cN := STRTRAN(cN,"&#xC1;", "Á")
                  cN := STRTRAN(cN,"&#xC9;", "É")
                  cN := STRTRAN(cN,"&#xCD;", "Í")
                  cN := STRTRAN(cN,"&#xD3;", "Ó")
                  cN := STRTRAN(cN,"&#xDA;", "Ú")
               endif
               MsgInfo(cN)  // muestro la informacion que me interesa
               exit
            Endif
         Enddo
      endif
   endif
endif

return nil


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROCEDURE URLDownLoad
   param cURL, cLocalFileName
   LOCAL oCon, oUrl, i

   cLocalFileName := alltrim(cLocalFileName)
   
   oUrl := tURL():New( cUrl )
   IF Empty( oUrl )
      MsgBox("Invalid url " + cUrl)
      return
   ENDIF

   IF oUrl:cProto != "http"
      MsgBox('This is a header test for http. Use an http address.')
      return
   ENDIF
   
   oCon := TipClientHttp():New( oUrl )
   oCon:nConnTimeout := 20000
   MsgBox("Connecting with "+ oUrl:cServer)
   IF oCon:Open( cUrl )
      MsgBox("Connection eshtablished." +chr(10)+"Press OK to retrieve" + oUrl:cPath +oUrl:cFile)
      oCon:WriteAll(cLocalFileName)
      MsgBox("Downloaded...")
      oCon:Close()
   ELSE
      MsgBox("Can't connect with "+ oUrl:cServer)
      IF oCon:SocketCon == NIL
         MsgBox("Connection not initiated")
      ELSEIF hb_InetErrorCode( oCon:SocketCon ) == 0
         MsgBox("Server sayed: "+ oCon:cReply)
      ELSE
         MsgBox("Error in connection: " + hb_InetErrorDesc( oCon:SocketCon ))
      ENDIF
   ENDIF

RETURN
Ahora tengo el problema con el TESSERACT, no me genera el .TXT, (FUNC CaptchaToTxt) agradeceré su ayuda.


Saludos cordiales a todos,

Eduardo Flores Rivas


LIMA - PERU

gvaronas
Posts: 108
Joined: Wed Aug 06, 2008 5:21 pm

Post by gvaronas » Thu Oct 05, 2017 1:04 am

Hola:

El año pasado intente hacer algo de esto.

El hilo lo puse en el foro de harbour-users aqui:
https://groups.google.com/forum/#!msg/h ... bour-users
Aqui tambien puse el PRG con el que estuve probando.

Me base en esta pagina:
https://tisoft.wordpress.com/category/consultas-sunat/

El código se ejecuta bien, el Tessearct hace bien su trabajo y me devuelve el captcha en formato txt plano para poder armar mi consulta a
traves del TipClientHttp().

El problema es que la pagina que recojo en "datos.xml", siempre me trae los datos de la pagina de error, como si le hubiese dado mal el captcha.

Si hago la consulta en el navegador con el captcha que me da el Tessearct funciona perfectamente

Lamentablemente tengo problemas con el idioma y ya no pude preguntar y dar mas detalles de mi problema en el foro.

Te sugiero revises el PRG y lo pruebes, lo mas probable es que se trate de algún problema tonto que no soy capaz de descubrir.

Salu2,
GVS

User avatar
edufloriv
Posts: 139
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB
Location: PERU
Has thanked: 1 time
Been thanked: 4 times

Post by edufloriv » Thu Oct 05, 2017 3:50 pm

Gvaronas, gracias por tu respuesta, me sirvió mucho tu código.

Aqui te lo paso con los nuevos links funcionales de la SUNAT. Efectivamente siempre devuelve la página de error, pero si pego la query directamente en el navegador devuelve los datos en el navegador sin problemas. Tendré que indagar más.

Code: Select all

* ------------------------------------------------------ *
* SISTEMA     :                                          *
* PRG         :                                          *
* CREADO      :                                          *
* ACTUALIZADO :                                          *
* AUTOR       :                                          *
* COMENTARIOS :                                          *
* ------------------------------------------------------ *

#include <minigui.ch>

FUNCTION MAIN

   DEFINE WINDOW Win_1;
      AT 0,0 ;
      WIDTH 640 HEIGHT 460 ;
      TITLE 'Consulta RUC' ;
      ON INIT INISETS() ;
      MAIN

      DEFINE MAIN MENU
         POPUP "&Operaciones"
            ITEM '&1. Buscar RUC'                  ACTION TestRuc()
         END POPUP
      END MENU

   END WINDOW

   CENTER WINDOW Win_1
   ACTIVATE WINDOW Win_1

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
* FUNCION...: INISETS
* COMENTARIO: INICIALIZA LOS SETEOS DEL SISTEMA.
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC INISETS

SET BELL       Off
SET CONSOLE    Off
SET CURSOR     Off
SET DATE TO BRIT
SET DELETED    On
SET DELIMITERS Off
SET ECHO       Off
SET EPOCH TO 1990
SET MESSAGE TO 22 CENTER
SET SAFETY     Off
SET SCOREBOARD Off
SET TALK       Off
SET WRAP       On
SETMODE(25,80)
ALTD(0)

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

Proc TestRuc

LOCAL cQueRUC  := '10074902419'

   ConsRUC( cQueRuc )

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

FUNCTION ConsRUC( cRuc )

LOCAL lOk := .T.
LOCAL oHttp
LOCAL cHtml
LOCAL qHttp
LOCAL cCaptcha := ''
   //
   oHttp:= TIpClientHttp():new( "http://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/captcha?accion=image" )
   // Connect to the HTTP server
   IF oHttp:open()
      cHtml   := oHttp:readAll()
      Memowrit( "captcha.jpg" , cHtml )
      oHttp:close()
      // Convierto foto en texto
      cFile := "captcha"
      hb_run( "c:\tes\tesseract.exe captcha.jpg captcha -psm 7")
      // Leo el TXT
      cfile += '.txt'
      IF file( cFile )
         cCaptcha := hb_MemoRead( cFile )
         cCaptcha := ALLTRIM( cCaptcha )
         cCaptcha := LEFT(cCaptcha,4)
      else
         Alert(cfile+' no existe')   
      ENDIF
      // Armo la consulta del RUC y Connect to the HTTP server
      qHttp:= "http://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias?accion=consPorRuc&nroRuc="+cRuc+"%20&codigo="+cCaptcha+"%20&tipdoc=1"
      MsgInfo(qHTTP)
      oHttp:= TIpClientHttp():new( qHttp )
      IF ! ( lOk := oHttp:open() )
         Alert( "Error de Conexión:; " + oHttp:lastErrorMessage() )
         RETURN lOk
      ENDIF
      /* download the pagina de respuesta con los datos del RUC */
      cHtml := oHttp:readAll()
      Memowrit( "datos.html" , cHtml )
      oHttp:close()
   ELSE
      Alert( "Error de Conexión:; " + oHttp:lastErrorMessage() )
   ENDIF

RETURN lOk
Te informaré si consigo la obtención de los datos.


Saludos cordiales,

Eduardo Flores Rivas


LIMA - PERU

Post Reply