CEP dos correios on line

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

CEP dos correios on line

Mensagem por bencz »

Puxando o assunto deste outro tópico http://pctoledo.com.br/forum/viewtopic.php?f=4&t=12408, onde você mencionou este tópico, segue minha solução para pegar as informações do site.

Código: Selecionar todos

#define _SITE_ "http://www.jpatecnologia.com.br/cep.asp?cep="

function main()
   local oHttp
   local cHtml
   local oHtmlDoc
   local oHtmlIter
   
   local oNodeCep
   local oNodeLogradouro
   local oNodeCidade
   local oNodeBairro
   local oNodeUF
   
   LOCAL CEP := "87300-080"
   
   oHttp := TIpClientHttp():new(_SITE_ + CEP)
   
   if .not. oHttp:open()
      ? "Erro ao se conectar com o site :("
      ? _SITE_,CEP
      quit
   endif
   
   cHtml := oHttp:readAll()
   oHttp:close()
   
   oHtmlDoc := THtmlDocument():new(cHtml)
   
   oNodeCep := oHtmlDoc:getnode("cep")
   ? oNodeCep:gettext("")
   oNodeLogradouro := oHtmlDoc:getnode("logradouro")
   ? oNodeLogradouro:gettext("")
   oNodeCidade := oHtmlDoc:getnode("cidade")
   ? oNodeCidade:gettext("")
   oNodeBairro := oHtmlDoc:getnode("bairro")
   ? oNodeBairro:gettext("")
   oNodeUF := oHtmlDoc:getnode("uf")
   ?oNodeUF:gettext("")
return nil
Imagem
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

CEP dos correios on line

Mensagem por alxsts »

Olá!

Este código compila em Harbour (hbmk2 teste -lHbTip) mas não roda.

Na linha 30, oHtmlDoc:getnode("cep") retorna NIL, resultando no erro "Error BASE/1004 No exported method: GETTEXT" na linha 31.

Alguma ideia?
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

CEP dos correios on line

Mensagem por Toledo »

alxsts escreveu:resultando no erro "Error BASE/1004 No exported method: GETTEXT" na linha 31
Aqui também ocorreu o mesmo erro, então fiz algumas alterações no código:

Código: Selecionar todos

/************************************************
* Compilar: hbmk2 democep.prg -lhbtip -lxhb
************************************************/

#define _SITE_ "http://www.jpatecnologia.com.br/cep.asp?cep="

REQUEST HB_CODEPAGE_PTISO

function main()
   local oHttp
   local cHtml
   local oHtmlDoc
   local oHtmlIter
   
   local oNodeCep
   local oNodeLogradouro
   local oNodeCidade
   local oNodeBairro
   local oNodeUF
   
   LOCAL CEP := "87300-080"

   HB_CDPSELECT("PTISO")
   
   oHttp := TIpClientHttp():new(_SITE_ + CEP)
   
   if .not. oHttp:open()
      ? "Erro ao se conectar com o site :("
      ? _SITE_,CEP
      quit
   endif
   
   cHtml := oHttp:readAll()
   oHttp:close()
   
   oXmlDoc := TXmlDocument():new(cHtml)

   oNodeCep := oXmlDoc:findFirst( "cep" )
   ? oNodeCep:cData
   oNodeLogradouro := oXmlDoc:findFirst( "logradouro" )
   ? HB_AnsiToOem(oNodeLogradouro:cData)
   oNodeCidade := oXmlDoc:findFirst( "cidade" )
   ? HB_AnsiToOem(oNodeCidade:cData)
   oNodeBairro := oXmlDoc:findFirst( "bairro" )
   ? HB_AnsiToOem(oNodeBairro:cData)
   oNodeUF := oXmlDoc:findFirst( "uf" )
   ? oNodeUF:cData

return nil
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

CEP dos correios on line

Mensagem por JoséQuintas »

Só uns números do webservice.
Isso é salvo pra controle de bloqueio.
A diferença de quantidade de consultas por IP é grande.
cep.png
Acho que se juntar todas, não chega a quantidade de CEPs totais do arquivo.

Por isso digo sempre: não compensa ficar atualizando tudo, é perda de tempo.
Melhor ir consultando conforme precisa.

Considerando que a base de CEPs possui 800.000 CEPs, atualizar tudo isso seria equivalente a muitos anos de consultas.
E estaria desatualizado antes mesmo de terminar.
Seria só sobrecarga de webservice, e nada mais.

Lembrando:
Meu webservice tem uma base de dados que vai sendo atualizada conforme as consultas vão sendo feitas.
Se o mesmo CEP é consultado num prazo curto, é usada a informação da base de dados.
Então, de certa forma, estou ajudando os correios.
E se os correios sairem do ar, é usada a base de dados que foi sendo atualizada.

Essa contagem começou quando implementei bloqueio de abuso.
Acho que ainda é aquele no topo, consultou num único mês mais do que todos os outros durante vários anos.
Não fico olhando isso não, tá tudo automático, tanto o bloqueio quanto o desbloqueio.
Até esqueço dele.... rs.... é a primeira vez no ano que lembro dele e dou uma olhada.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

CEP dos correios on line

Mensagem por JoséQuintas »

E os últimos CEPs atualizados, de tudo que é lugar do Brasil.
cephis.png
Só comentário: essa foi minha primeira base de dados em MySQL, há muitos anos atrás, foi a cobaia... rs

E usando ADO !!!
Igual uso no Harbour... rs

Só que o webservice é em ASP, até hoje.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

CEP dos correios on line

Mensagem por lugab »

Pessoal, eu usei o TiraAcento() do Quintas na Mensagem de retorno do ACBR "XMotivo=Serviço em Operação" e não tive sucesso...
O retorno da Função ficou assim:
http://www.zimagez.com/full/a20af6ba24 ... 896f.php
( Desculpem, mas, não sei postar imagem direto no tópico)

Código: Selecionar todos

*---------------------------
Function TiraAcento(mTexto)
*---------------------------
Local mLetras := {}
Local nCont := 0
Local nPosicao := 0
Aadd( mLetras, { "€", "C" } )
Aadd( mLetras, { "‡", "C" } )
Aadd( mLetras, { "", "A" } )
Aadd( mLetras, { "µ", "A" } )
Aadd( mLetras, { "Æ", "A" } )
Aadd( mLetras, { "Ç", "A" } )
Aadd( mLetras, { "¡", "I" } )
Aadd( mLetras, { "Ö", "I" } )
Aadd( mLetras, { "¢", "O" } )
Aadd( mLetras, { "à", "O" } )
Aadd( mLetras, { "£", "U" } )
Aadd( mLetras, { "é", "E" } )
Aadd( mLetras, { "‚", "E" } )
Aadd( mLetras, { "", "E" } )
Aadd( mLetras, { "º", "." } )
Aadd( mLetras, { "'", " " })
Aadd( mLetras, { "ã", "A" } )
Aadd( mLetras, { "á", "A" } )
Aadd( mLetras, { "ç", "C" } )
Aadd( mLetras, { "é", "E" } )
Aadd( mLetras, { "ê", "E" } )
Aadd( mLetras, { "í", "I" } )
Aadd( mLetras, { "ó", "O" } )
Aadd( mLetras, { "ô", "O" } )
Aadd( mLetras, { "ú", "U" } )
Aadd( mLetras, { "â", "A" } )
Aadd( mLetras, { "Á", "A" } )
Aadd( mLetras, { "õ", "O" } )
Aadd( mLetras, { "É", "E" } )
Aadd( mLetras, { "Í", "I" } )
Aadd( mLetras, { "Ç", "C" } )
Aadd( mLetras, { "Ê", "E" } )
Aadd( mLetras, { "Ó", "O" } )
Aadd( mLetras, { "Ô", "O" } )
Aadd( mLetras, { "Õ", "O" } )
Aadd( mLetras, { "Ú", "U" } )
Aadd( mLetras, { "¥", "N" } )
Aadd( mLetras, { "Ã", "A" } )
Aadd( mLetras, { "Á", "A" } )
Aadd( mLetras, { "Â", "A" } )
Aadd( mLetras, { "À", "A" } )
Aadd( mLetras, { "â", "A" } )
Aadd( mLetras, { "Ü", "U" } )
Aadd( mLetras, { "ü", "U" } )
Aadd( mLetras, { "+", " " } )
Aadd( mLetras, { "`", " " } )
Aadd( mLetras, { "Ñ", "N" } )
Aadd( mLetras, { "È", "E" } )
Aadd( mLetras, { "ª", "A" } )
Aadd( mLetras, { "º", "O" } )
Aadd( mLetras, { "ª", "." } )
Aadd( mLetras, { "§", "" } )

For nCont = 1 To Len(mLetras)
 Do While mLetras[nCont,1] $ mTexto
   nPosicao := At(mLetras[nCont,1],mTexto)
   mTexto := Substr(mTexto, 1, nPosicao-1 ) + mLetras[nCont,2] + Substr(mTexto,nPosicao+1)
 Enddo
Next
mTexto := Upper(mTexto) // Acrescentado
Return mTexto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

CEP dos correios on line

Mensagem por JoséQuintas »

Infelizmente os retornos não são padrão.
Tem UF que retorna em ASCII, tem UF que retorna em UTF8.
A tal codepage, aí as letras não batem, e a conversão falha.

Mas se não me engano, além do motivo tem o status, que é um número, e pelo status não vai ter esse problema.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

CEP dos correios on line

Mensagem por JoséQuintas »

Já no caso do webservice de CEP, tem a opção clipper=1, pra retornar tudo em maiúsculas sem acento.

Código: Selecionar todos

http://www.jpatecnologia.com.br/cep.asp?cep=03676080
<jpacep><cep>03676-080</cep><logradouro>Rua Maestro Alfredo Beviláqua</logradouro><bairro>Jardim Três Marias</bairro><cidade>São Paulo</cidade><uf>SP</uf><altitude>760.0</altitude><latitude>-23.548</latitude><longitude>-46.8445247808</longitude><ddd>11</ddd><ibge>3550308</ibge><infinc>2016/08/22 09:30 </infinc><tot>3</tot></jpacep>

Código: Selecionar todos

http://www.jpatecnologia.com.br/cep.asp?cep=03676080&clipper=1
<jpacep><cep>03676-080</cep><logradouro>RUA MAESTRO ALFREDO BEVILAQUA</logradouro><bairro>JARDIM TRES MARIAS</bairro><cidade>SAO PAULO</cidade><uf>SP</uf><altitude>760.0</altitude><latitude>-23.548</latitude><longitude>-46.8445247808</longitude><ddd>11</ddd><ibge>3550308</ibge><infinc>2016/08/22 09:30 </infinc><tot>6</tot></jpacep>
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

CEP dos correios on line

Mensagem por lugab »

Ah, é uma pena não poder se livrar 100% de "ç" e acentos......

Obrigado, Quintas
lugab
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

CEP dos correios on line

Mensagem por JoséQuintas »

E no webservice de CEP, eu uso um algo mais, no caso de clientes, identifico quem é, só pra curiosidade.... rs
De certa forma, serve pra identificar usuários "diferentes" do aplicativo.

Código: Selecionar todos

FUNCTION WebCep( cCep )

   LOCAL cTexto

   cTexto := DownloadTexto( ;
      "http://www.jpatecnologia.com.br/cep.asp" + ;
      "?cep=" + cCep + ;
      "&usuario=" + Trim( AppUserName() ) + ;
      "&maquina=" + DriveSerial() + ;
      "&empresa=" + Trim( AppEmpresaApelido() ) )
   cTexto := iif( ValType( cTexto ) == "C", cTexto, "" )

   RETURN cTexto

FUNCTION DownloadTexto( cUrl )

   LOCAL oSoap, cRetorno, aRetorno, nAscii

   cRetorno := ""
   BEGIN SEQUENCE WITH __BreakBlock()
      oSoap := Win_OleCreateObject( "MSXML2.ServerXMLHTTP" )
      oSoap:Open( "GET", cUrl, .F.)
      oSoap:Send()
      aRetorno := oSoap:ResponseBody()
      IF ValType( aRetorno ) == "C"
         cRetorno := aRetorno
      ELSE
         cRetorno := ""
         FOR EACH nAscii IN aRetorno
            cRetorno += Chr( nAscii )
         NEXT
      ENDIF
   END SEQUENCE

   RETURN cRetorno
Nota:
Se pra baixar algo da internet é sempre igual, pra que multiplicar rotinas iguais?
No Windows/VB existe um tipo de variável BYTE ARRAY. Teve uma época que o Harbour retornava um array de Ascii, e até hoje mantenho a conversão disso, nunca mais confirmei se ainda acontece.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

CEP dos correios on line

Mensagem por JoséQuintas »

Ah sim, uso isso no get, pra que complicar:

Código: Selecionar todos


@ 5, 5 SAY "CEP:" GET cCep PICTURE "@R 99999-999" VALID CepOk( cCep, @cEndereco, @cBairro, @cCidade, @cUF, ::cOpc == "I"  )
@ 6, 5 SAY "Endereco:" GET cEndereco
@ 7, 5 SAY "Bairro:" GET cBairro
@ 8, 5 SAY "Cidadë:" GET cCidade
@ 9, 5 SAY "UF:"  GET cUF
READ


FUNCTION CepOk( mCep, mEndereco, mBairro, mCidade, mUf, mPesquisa )

   LOCAL mTexto

   hb_Default( @mPesquisa, .T. )
   IF Val( SoNumeros( mCep ) ) == 0 .OR. ! mPesquisa
      RETURN .T.
   ENDIF
   mTexto := WebCep( mCep )
   mUf       := Pad( XmlNode( mTexto, "UF" ), 2 )
   mCidade   := Pad( XmlNode( mTexto, "CIDADE" ), Len( mCidade ) )
   mBairro   := Pad( XmlNode( mTexto, "BAIRRO" ), Len( mBairro ) )
   mEndereco := Pad( XmlNode( mTexto, "LOGRADOURO" ), Len( mEndereco ) )

   RETURN .T.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder