sunset Posted November 30, 2022 Report Share Posted November 30, 2022 Bom dia. Uso aquele DLL de consulta ao site da receita federal junto com a classe que consulta e captura de dentro do html gerado os dados da empresa, mas há uns dias parou de funcionar a captura, alguém tem alguma dica do que mudou ? Após a tela do não sou um robô ela não finaliza. Grato por qualquer dica. Quote Link to comment Share on other sites More sharing options...
sygecom Posted November 30, 2022 Report Share Posted November 30, 2022 Aqui usamos: https://receitaws.com.br/ Quote Link to comment Share on other sites More sharing options...
Marca Posted November 30, 2022 Report Share Posted November 30, 2022 5 horas atrás, sunset disse: Bom dia. Uso aquele DLL de consulta ao site da receita federal junto com a classe que consulta e captura de dentro do html gerado os dados da empresa, mas há uns dias parou de funcionar a captura, alguém tem alguma dica do que mudou ? Após a tela do não sou um robô ela não finaliza. Grato por qualquer dica. Mostre como esta fazendo Quote Link to comment Share on other sites More sharing options...
macs Posted November 30, 2022 Report Share Posted November 30, 2022 Use desta forma: LOCAL oCNPJ := TCNPJ():New( cCNPJ ) IF oCNPJ:ConsultarCNPJ() cTELEFONE := oCNPJ:GetTelefone() cENDE_CAD := Upper( Pad( oCNPJ:GetLogradouro(), Len( ::aCampos[ "cENDE_CAD" ] ) ) ) cNUM__CAD := Pad( oCNPJ:GetNumero(), Len( ::aCampos[ "cNUM__CAD" ] ) ) cCOMP_CAD := Upper( Pad( oCNPJ:GetComplemento(), Len( ::aCampos[ "cCOMP_CAD" ] ) ) ) cBAIR_CAD := Upper( Pad( oCNPJ:GetBairro(), Len( ::aCampos[ "cBAIR_CAD" ] ) ) ) cCOD_MUNI := oCNPJ:GetCodigoIBGE() cEMAIL := Pad( oCNPJ:GetEmail(), Len( ::aCampos[ "cEMAIL" ] ) ) cCEP__CAD := oCNPJ:GetCEP() 1 cMUNI_CAD := Pad( oCNPJ:GetMunicipio(), Len( ::aCampos[ "cMUNI_CAD" ] ) ) nESTA_CAD := ::oCmbEstado:getIndex( oCNPJ:GetUF() ) cNOM_RAZA := Upper( Pad( oCNPJ:GetNome(), Len( ::aCampos[ "cNOM_RAZA" ] ) ) ) cNOM_FANT := Upper( Pad( oCNPJ:GetFantasia(), Len( ::aCampos[ "cNOM_FANT" ] ) ) ) oCNPJ:End() ENDIF Quote Link to comment Share on other sites More sharing options...
macs Posted November 30, 2022 Report Share Posted November 30, 2022 TCNPJ.Prg Theotokos 1 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted December 1, 2022 Report Share Posted December 1, 2022 Macs, # Include "ERPConfig.Ch" ??? Regards, saludos. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted December 1, 2022 Report Share Posted December 1, 2022 Macs, Error: Unresolved external '_HB_FUN_RETIRASIMBOLOS' Error: Unresolved external '_HB_FUN_SETINDEX' Error: Unresolved external '_HB_FUN_MSGERRO' Poste estas funcoes por favor. Obg. abs. Regards, saludos. Quote Link to comment Share on other sites More sharing options...
macs Posted December 1, 2022 Report Share Posted December 1, 2022 Olá Kapi... não é necessário. RetiraSimbolos --> Qualquer função para retirar caracteres especiais SetIndex -> Utilize o DbSetOrder() MsgErro -> Utilize o MsgStop() Quote Link to comment Share on other sites More sharing options...
kapiaba Posted December 1, 2022 Report Share Posted December 1, 2022 Macs, o que está errado? A classe não reconhece ::aCampos... ??? #Include "FiveWin.ch" FUNCTION Main() LOCAL CTELEFONE, CENDE_CAD, CNUM__CAD, CCOMP_CAD, CBAIR_CAD, CCOD_MUNI, ; CEMAIL, CCEP__CAD, CMUNI_CAD, NESTA_CAD, CNOM_RAZA, CNOM_FANT LOCAL cCNPJ LOCAL oCNPJ // := TCNPJ():New( cCNPJ ) LOCAL SELF cCNPJ := "42.905.527/0001-05" oCNPJ := TCNPJ():New( cCNPJ ) IF oCNPJ:ConsultarCNPJ() cTELEFONE := oCNPJ:GetTelefone() cENDE_CAD := Upper( Pad( oCNPJ:GetLogradouro(), Len( ::aCampos[ "cENDE_CAD" ] ) ) ) cNUM__CAD := Pad( oCNPJ:GetNumero(), Len( ::aCampos[ "cNUM__CAD" ] ) ) cCOMP_CAD := Upper( Pad( oCNPJ:GetComplemento(), Len( ::aCampos[ "cCOMP_CAD" ] ) ) ) cBAIR_CAD := Upper( Pad( oCNPJ:GetBairro(), Len( ::aCampos[ "cBAIR_CAD" ] ) ) ) cCOD_MUNI := oCNPJ:GetCodigoIBGE() cEMAIL := Pad( oCNPJ:GetEmail(), Len( ::aCampos[ "cEMAIL" ] ) ) cCEP__CAD := oCNPJ:GetCEP() cMUNI_CAD := Pad( oCNPJ:GetMunicipio(), Len( ::aCampos[ "cMUNI_CAD" ] ) ) nESTA_CAD := ::oCmbEstado:getIndex( oCNPJ:GetUF() ) cNOM_RAZA := Upper( Pad( oCNPJ:GetNome(), Len( ::aCampos[ "cNOM_RAZA" ] ) ) ) cNOM_FANT := Upper( Pad( oCNPJ:GetFantasia(), Len( ::aCampos[ "cNOM_FANT" ] ) ) ) oCNPJ:End() ENDIF RETURN NIL ******************************************************************************** ** SIMTECH SISTEMAS LTDA * ******************************************************************************** ** Sistema...: WERP - Sistemas Integrados de Gestão Empresarial * ******************************************************************************** ** Arquivo...: TCNPJ.Prg * ******************************************************************************** ** Classe....: TCNPJ() * ** Função....: TCNPJ() * ** Objetivo..: Criar Classe para Pesquisa de Um determinado CJPJ * ** Produto * ** Módulo....: Classes * ** Autor.....: Márcio Augusto Cezar * ** Data......: 21/01/2020 * ******************************************************************************** ** Parâmetros: * ******************************************************************************** ** Retorno...: NIL * ******************************************************************************** ** Observação: * ******************************************************************************** // # Include "ERPConfig.Ch" CLASS TCNPJ PRIVATE: DATA cCNPJ, cNome, cFantasia AS CHARACTER DATA cLogradouro, cNumero, cBairro, cComplemento, cBairro, cMunicipio, cUF, cCEP, cCodigoIBGE AS CHARACTER DATA cTelefone, cEmail AS CHARACTER DATA cNatureza, cAtividade, cNmAtividade, cSituacao, cMotivoSituacao AS CHARACTER DATA dDataAbertura AS DATE DATA aSocios AS ARRAY INIT {} DATA aAtividadesSec AS ARRAY INIT {} DATA nCapitalSocial AS NUMERIC INIT 0 PUBLIC: DATA lExito AS LOGICAL INIT .F. && -- Métodos para retorno das informações básicas da Empresa Pesquisada METHOD GetCNPJ() INLINE ::cCNPJ METHOD GetNome() INLINE ::cNome METHOD GetFantasia() INLINE ::cFantasia METHOD GetLogradouro() INLINE ::cLogradouro METHOD GetNumero() INLINE ::cNumero METHOD GetComplemento() INLINE ::cComplemento METHOD GetBairro() INLINE ::cBairro METHOD GetMunicipio() INLINE ::cMunicipio METHOD GetCodigoIBGE() INLINE ::cCodigoIBGE METHOD GetUF() INLINE ::cUF METHOD GetCEP() INLINE StrTran( Strtran( ::cCEP, "-" ), "." ) METHOD GetTelefone() INLINE ::cTelefone METHOD GetEmail() INLINE ::cEmail METHOD GetSituacao() INLINE ::cSituacao METHOD GetMotivoSituacao() INLINE ::cMotivoSituacao METHOD GetAbertura() INLINE ::dDataAbertura METHOD GetCapitalSocial() INLINE ::nCapitalSocial METHOD GetSocios() INLINE ::aSocios METHOD GetNaruzeza() INLINE ::cNatureza METHOD GetCodigoAtividade() INLINE ::cAtividade METHOD GetDescAtividade() INLINE ::cNmAtividade METHOD GetCapitalSocial() INLINE ::nCapitalSocial METHOD GetAtividadesSec() INLINE ::aAtividadesSec && -- Métodos para Tratamento do Saldo Anterior do Produto METHOD ConsultarCNPJ( cCNPJ ) METHOD New( cCNPJ ) CONSTRUCTOR METHOD End() METHOD SetCNPJ( cCNPJ ) INLINE ::cCNPJ := cCNPJ ENDCLASS ******************************************************************************** ** Método....: New() * ** Objetivo..: Construtor da Classe * ** Autor.....: Márcio Augusto Cezar * ******************************************************************************** METHOD New( cCNPJ ) CLASS TCNPJ ::cCNPJ := cCNPJ RETURN Self ******************************************************************************** ** Método....: End() * ** Objetivo..: Finalizar a classe * ** Autor.....: Márcio Augusto Cezar * ** Data......: 21/03/2017 * ******************************************************************************** METHOD End() CLASS TCNPJ PostMessage( Self, WM_CLOSE ) RETURN NIL ******************************************************************************** ** Método....: ConsultarCNPJ() * ** Objetivo..: Realizar a Consulta do CNPJ informado no Site da Receita Federal* ** Autor.....: Márcio Augusto Cezar * ******************************************************************************** METHOD ConsultarCNPJ( cCNPJ ) CLASS TCNPJ LOCAL cResult, hDados LOCAL cLink := "https://www.receitaws.com.br/v1/cnpj/" LOCAL cSetIndex DEFAULT cCNPJ := ::cCNPJ cCnpj := StrTran( cCnpj, ".", "" ) cCnpj := StrTran( cCnpj, "/", "" ) cCnpj := StrTran( cCnpj, "-", "" ) cCnpj := AllTrim( cCnpj ) cLink += cCnpj cResult := GetPesqHtml( cLink ) cResult := StrTran( cResult, "true", '"true"' ) hDados := My_JsonToHash( cResult ) IF Valtype( hDados ) == "C" .AND. Empty( hDados ) RETURN .F. ENDIF && -- Checar se o CNPJ e valido ou nao. ::lExito := ( hDados["status"] == "OK" ) IF ::lExito // CNPJ E VALIDO ::cNome := hDados["nome"] ::cFantasia := hDados["fantasia"] ::cSituacao := hDados["situacao"] ::cMotivoSituacao := hDados["motivo_situacao"] ::cLogradouro := hDados["logradouro"] ::cNumero := hDados["numero"] ::cComplemento := hDados["complemento"] ::cBairro := hDados["bairro"] ::cUF := hDados["uf"] ::cCEP := Pad( RetiraSimbolos( hDados["cep"] ), 8 ) ::cMunicipio := hDados["municipio"] ::dDataAbertura := ctod( hDados["abertura"] ) ::cNatureza := hDados["natureza_juridica"] ::cAtividade := hDados["atividade_principal"][1]["code"] ::cNmAtividade := hDados["atividade_principal"][1]["text"] ::aSocios := hDados["qsa"] ::nCapitalSocial := Val( hDados["capital_social"] ) ::aAtividadesSec := hDados["atividades_secundarias"] ::cTelefone := RetiraSimbolos( hDados["telefone"] ) ::cEmail := Lower( hDados["email"] ) TRY cSetIndex := MUNI->( setIndex( "UF+MUNICIPIO" ) ) IF MUNI->( dbSeek( ::cUF + alltrim( upper( ::cMunicipio ) ) ) ) ::cCodigoIBGE := MUNI->CODIGO ENDIF MUNI->( setIndex( cSetIndex ) ) CATCH ::cCodigoIBGE := space(07) END ENDIF RETURN ::lExito ******************************************************************************** ** Método....: GetPesqHtml() * ** Objetivo..: Retornar o HTML da pesquisa do CNPJ consultado * ** Autor.....: Márcio Augusto Cezar * ******************************************************************************** STATIC FUNCTION My_JsonToHash( cStringJson ) LOCAL oError LOCAL hJson := { => } cStringJson := Alltrim( cStringJson ) cStringJson := StrTran( cStringJson, ':[', '=>{' ) cStringJson := StrTran( cStringJson, '":"', '" => "' ) cStringJson := StrTran( cStringJson, '[', '{' ) cStringJson := StrTran( cStringJson, ']', '}' ) cStringJson := StrTran( cStringJson, '":null', '"=>nil' ) cStringJson := StrTran( cStringJson, '":true' , '"=>.t.' ) cStringJson := StrTran( cStringJson, '":false', '"=>.f.' ) cStringJson := StrTran( cStringJson, '": true' , '"=>.t.' ) cStringJson := StrTran( cStringJson, '": false', '"=>.f.' ) cStringJson := StrTran( cStringJson, '":', '"=>' ) cStringJson := StrTran( cStringJson, "\/", "/" ) cStringJson := StrTran( cStringJson, Chr( 13 ), "" ) cStringJson := StrTran( cStringJson, Chr( 10 ), "" ) Try hJSon := &( cStringJson ) Catch oError MsgStop( "Ocorreu Erro de Conexão com site da Receita Federal" ) hJson := "" // Throw( oError ) End RETURN hJson ******************************************************************************** ** Método....: GetPesqHtml() * ** Objetivo..: Retornar o HTML da pesquisa do CNPJ consultado * ** Autor.....: Márcio Augusto Cezar * ******************************************************************************** STATIC FUNCTION GetPesqHtml( cLink ) LOCAL oOle, cErro LOCAL cHtml := "" Try oOle := CreateObject( "Microsoft.XMLHTTP" ) oOle:Open( "GET", cLink, .F. ) oOle:Send() cHtml := oOle:ResponseBody oOle := nil Catch cErro := MsgErro( "Não foi possível realizar a Pesquisa do Site da Receita" ) End RETURN cHtml FUNCTION RETIRASIMBOLOS() RETURN NIL FUNCTION SETINDEX() RETURN NIL FUNCTION MSGERRO( cErro ) MsgInfo( cErro ) RETURN NIL // FIN / END Regards, saludos. Quote Link to comment Share on other sites More sharing options...
macs Posted December 1, 2022 Report Share Posted December 1, 2022 aCampos é uma variável tipo Hash(). Você tem que substituir pelas suas. Exemplo: LOCAL cENDE_CAD := Space(50) cENDE_CAD := Upper( Pad( oCNPJ:GetLogradouro(), Len( cENDE_CAD ) ) ) // Len( ::aCampos[ "cENDE_CAD" ] ) ) ) Ou cENDE_CAD := Upper( Pad( oCNPJ:GetLogradouro(), 50 ) ) Quote Link to comment Share on other sites More sharing options...
kapiaba Posted December 1, 2022 Report Share Posted December 1, 2022 Putz Macs, sua classe está com muita baytolagem. E eu não gosto de CLASSE, gosto assim: pego o FONTE compilo e PIMBA!! // C:\FWH..\SAMPLES\RECEITA2.PRG #include "FiveWin.ch" FUNCTION Main() LOCAL cOnde, cCnpj, cNome, cEndereco, cNro, cComplemento, cBairro, cCidade, ; cEstado, cCep, cTelefone cOnde := SPACE(10) cCnpj := "42905527000105" cNome := SPACE(50) cEndereco := SPACE(40) cNro := SPACE(10) cComplemento := SPACE(10) cBairro := SPACE(20) cCidade := SPACE(30) cEstado := SPACE(02) cCep := SPACE(08) cTelefone := SPACE(17) GetCNPJ( cOnde, cCnpj, cNome, cEndereco, cNro, cComplemento, cBairro, cCidade, cEstado, cCep, cTelefone ) RETURN NIL FUNCTION GetCNPJ( cOnde, cCnpj, cNome, cEndereco, cNro, cComplemento, cBairro, cCidade, cEstado, cCep, cTelefone ) LOCAL oServerWS, cUrl, aArray, x1, erro, oADODBStream IF Len( AllTrim( cCnpj ) ) < 14 MsgInfo( "Somente Pessoa Juridica para consultar os dados na Receita !!!", "Atenção " ) RETURN( .T. ) ENDIF cUrl := "https://www.receitaws.com.br/v1/cnpj/" + cCnpj // cUrl:= "https://publica.cnpj.ws/cnpj/" + cCnpj #ifdef __XHARBOUR__ // PERFEITO COM XHARBOUR( I Like ) Try Try oServerWS := CreateObject( 'MSXML2.XMLHTTP' ) Catch oServerWS := CreateObject( 'Microsoft.XMLHTTP' ) End Catch MsgInfo( 'Erro na Criação do Serviço' ) RETURN NIL End #else // PERFEITO COM HARBOUR. ( no Like. kkkkk ) Try Try oServerWS := win_OleCreateObject( 'MSXML2.XMLHTTP' ) Catch oServerWS := win_OleCreateObject( 'Microsoft.XMLHTTP' ) End Catch MsgInfo( 'Erro na Criação do Serviço! Com Harbour', 'Atenção!' ) RETURN NIL End #endif oServerWS:Open( 'GET', cUrl, .F. ) oServerWS:setRequestHeader( "Content-Type", "text/xml; charset=utf-8" ) oServerWS:Send() IF oServerWS:STATUS != 200 MsgStop( AllTrim( Str( oServerWS:Status ) ) + " - " + oServerWS:StatusText, "Erro" ) RETURN NIL ENDIF WHILE oServerWS:readyState != 4 SYSREFRESH() oServerWS:WaitForResponse( 1000 ) END x1 := hb_jsonDecode( oServerWS:responseText, @aArray ) IF aArray == nil MsgStop( "Erro ao retornar os dados. Tente novamente." ) RETURN NIL ENDIF IF aArray[ 'status' ] != 'OK' MsgStop( aArray[ 'message' ], "Erro" ) RETURN NIL ENDIF MsgInfo( "NOME: " + AllTrim( aArray[ 'nome' ] ) + CRLF + ; "FANTASIA: " + AllTrim( aArray[ 'fantasia' ] ) + CRLF + ; "ENDEREÇO: " + AllTrim( aArray[ 'logradouro' ] ) + ", " + AllTrim( aArray[ 'numero' ] ) + " " + AllTrim( aArray[ 'complemento' ] ) + CRLF + ; "BAIRRO: " + AllTrim( aArray[ 'bairro' ] ) + " CEP: " + AllTrim( aArray[ 'cep' ] ) + CRLF + ; "CIDADE: " + AllTrim( aArray[ 'municipio' ] ) + "-" + AllTrim( aArray[ 'uf' ] ) + CRLF + ; "TELEFONE: " + AllTrim( aArray[ 'telefone' ] ) + CRLF + CRLF + ; "NATUREZA JURÍDICA: " + AllTrim( aArray[ 'natureza_juridica' ] ) + CRLF + ; "TIPO: " + AllTrim( aArray[ 'tipo' ] ) + CRLF + ; "SITUAÇÃO: " + AllTrim( aArray[ 'situacao' ] ) + CRLF + ; "DATA SITUAÇÃO: " + AllTrim( aArray[ 'data_situacao' ] ) + CRLF + ; "ULTIMA ATUALIZAÇÃO: " + AllTrim( aArray[ 'ultima_atualizacao' ] ), "CNPJ CONSULTA" ) cNome = AllTrim( aArray[ 'nome' ] ) cEndereco = AllTrim( aArray[ 'logradouro' ] ) cNro = AllTrim( aArray[ 'numero' ] ) cNro = StrTran( cNro, ".", "", 1, 10 ) cNro = Val( cNro ) cComplemento = AllTrim( aArray[ 'complemento' ] ) cBairro = AllTrim( aArray[ 'bairro' ] ) cCep = AllTrim( aArray[ 'cep' ] ) cCidade = AllTrim( aArray[ 'municipio' ] ) cEstado = AllTrim( aArray[ 'uf' ] ) cTelefone = AllTrim( aArray[ 'telefone' ] ) IF cOnde = "T" cEndereco = cEndereco + " " + AllTrim( Str( cNro, 10 ) ) + " " + AllTrim( cComplemento ) ENDIF cNome := cNome + spac( 100 - Len( cNome ) ) cEndereco := cEndereco + spac( 100 - Len( cEndereco ) ) cComplemento := cComplemento + spac( 100 - Len( cComplemento ) ) cBairro := cBairro + spac( 100 - Len( cBairro ) ) cCep := cCep + spac( 10 - Len( cCep ) ) cCep := StrTran( cCep, ".", "", 1, 10 ) cCidade := cCidade + spac( 50 - Len( cCidade ) ) cTelefone := cTelefone + spac( 20 - Len( cTelefone ) ) RETURN NIL // FIN / END Teste ai e veja que simples, prático e seguro. Regards, saludos. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.