Página 3 de 3

CEP dos correios on line

Enviado: 26 Fev 2014 12:05
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

CEP dos correios on line

Enviado: 28 Fev 2014 02:28
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?

CEP dos correios on line

Enviado: 02 Mar 2014 10:39
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,

CEP dos correios on line

Enviado: 03 Fev 2016 00:08
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.

CEP dos correios on line

Enviado: 03 Fev 2016 00:24
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.

CEP dos correios on line

Enviado: 09 Set 2016 13:34
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

CEP dos correios on line

Enviado: 09 Set 2016 14:13
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.

CEP dos correios on line

Enviado: 09 Set 2016 14:18
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>

CEP dos correios on line

Enviado: 09 Set 2016 17:12
por lugab
Ah, é uma pena não poder se livrar 100% de "ç" e acentos......

Obrigado, Quintas

CEP dos correios on line

Enviado: 09 Set 2016 19:18
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.

CEP dos correios on line

Enviado: 09 Set 2016 19:23
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.