Jump to content
Fivewin Brasil

Buscar endereço pelo CEP - GRATUITO


emotta

Recommended Posts

Pessoal encontrei um site que permite buscar o endereço pelo CEP de maneira gratuita, desde que não se faça chamadas em massa para a WebService, caso isso aconteça eles bloqueiam o seu IP e ai o serviço para de funcionar. 

Montei um exemplo simples de como obter as informações. Espero que seja util

 

Function U_BuscaCep()
Local cCep := "13380-003"
Local cCodCid

cCep := StrTran(cCep,"-","")
cRet := WebGetCep(cCEP)
hCep := u_JsonToHash(cRet)
Try
	cCodCid := StrZero(Val(SubStr(hCep["ibge"],3)),6)
Catch
	hCep := NIL
End

If hCep # nil
   MsgStop(Upper(SemAcento(hCep["logradouro"]))+Chr(13)+Chr(10)+;
      Upper(SemAcento(hCep["bairro"]))+Chr(13)+Chr(10)+;
      Upper(SemAcento(hCep["localidade"]))+Chr(13)+Chr(10)+;
      Upper(SemAcento(hCep["ibge"]))+Chr(13)+Chr(10)+;
      Upper(SemAcento(hCep["uf"])))

Else
   MsgStop("CEP não encontrado ou serviço fora do ar")
EndIf
Return hCep


Static Function Emt_GetHtml(cLink)
Local oOle
Local cHtml := ""

Try
   oOle := CreateObject( "Microsoft.XMLHTTP" )
   oOle:Open( "GET", cLink, .f. )
   oOle:Send()
   cHtml := oOle:ResponseBody
   oOle := nil
Catch
End

Return cHtml

STATIC Function WebGetCep(cCEP)
Local cUrl
cUrl := 'http://viacep.com.br/ws/'+cCEP+'/json'
cJsonRet := Emt_GetHtml(cUrl)
cJsonRet := OemToAnsi(hb_UTF8ToStr(cJsonRet))
Return cJsonRet


Static Function u_JsonToHash(cStringJson)
Local hJson := {=>}

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,'":','"=>')
cStringJson := StrTran( cStringJson,"\/","/" )
cStringJson := StrTran( cStringJson,Chr(13),"" )
cStringJson := StrTran( cStringJson,Chr(10),"" )
Try
   hJSon := &( cStringJson )
Catch
   hJSon := Hash()
End
Return hJson

Static Function SemAcento(cStr)
Local cRet := ""
Local nI
Local cCar
Local nPos
Local aCar := {} 

cRet := cStr
cRet := StrTran(cRet,"á","a")
cRet := StrTran(cRet,"à","a")
cRet := StrTran(cRet,"ã","a")
cRet := StrTran(cRet,"â","a") 
cRet := StrTran(cRet,"é","e")
cRet := StrTran(cRet,"è","e")
cRet := StrTran(cRet,"ê","e")
cRet := StrTran(cRet,"í","i")
cRet := StrTran(cRet,"ì","i")
cRet := StrTran(cRet,"î","i")
cRet := StrTran(cRet,"ó","o")
cRet := StrTran(cRet,"ò","o")
cRet := StrTran(cRet,"õ","o")
cRet := StrTran(cRet,"ô","o")
cRet := StrTran(cRet,"ú","u")
cRet := StrTran(cRet,"ù","u")
cRet := StrTran(cRet,"û","u")
cRet := StrTran(cRet,"ç","c")
cRet := StrTran(cRet,"Á","A")
cRet := StrTran(cRet,"À","A")
cRet := StrTran(cRet,"Ã","A")
cRet := StrTran(cRet,"Â","A")
cRet := StrTran(cRet,"É","E")
cRet := StrTran(cRet,"È","E")
cRet := StrTran(cRet,"Ê","E")
cRet := StrTran(cRet,"Í","I")
cRet := StrTran(cRet,"Ì","I")
cRet := StrTran(cRet,"Î","I")
cRet := StrTran(cRet,"Ó","O")
cRet := StrTran(cRet,"Ò","O")
cRet := StrTran(cRet,"Õ","O")
cRet := StrTran(cRet,"Ô","O")
cRet := StrTran(cRet,"Ú","U")
cRet := StrTran(cRet,"Ù","U")
cRet := StrTran(cRet,"Û","U")
cRet := StrTran(cRet,"Ç","C")

Return cRet

 

Link to comment
Share on other sites

Eu utilizo esta url: http://cep.republicavirtual.com.br/web_cep.php?cep="+numero do cep+"&formato=xml, a diferença é que não tem o código ibge, o qual eu pesquiso em modo secundário, mas é bastante confiável e vc pode ter o retorno nos seguintes formatos: f (string, pode ser: xml, query_string, ou jsonp ou javascript) .

[]s,

 

Link to comment
Share on other sites

 

Eu utilizo esta url: http://cep.republicavirtual.com.br/web_cep.php?cep="+numero do cep+"&formato=xml, a diferença é que não tem o código ibge, o qual eu pesquiso em modo secundário, mas é bastante confiável e vc pode ter o retorno nos seguintes formatos: f (string, pode ser: xml, query_string, ou jsonp ou javascript) .

[]s,

 

Como captura via FiveWin Jorge? abs.

Link to comment
Share on other sites

opa!!!

Tem uma rotina que peguei acho que aqui no fórum, este código está meio marreta, mas me atende em tempo de cadastro do cliente num valid de um get.

FUNCTION BUSCA_CEP(wcep, oDlgDialog)
LOCAL GetList := {}
LOCAL oHttp, cXML, cCep := wcep, ODLG_c
LOCAL cRes, cUf, cCidade, cTipo, cEnde, cBairro
oHttp:= TIpClientHttp():new( "http://cep.republicavirtual.com.br/web_cep.php?cep="+cCep+"&formato=xml" )

IF ! oHttp:open()
   ERRMSG1( "Erro na conexÆo: "+ oHttp:lastErrorMessage() )
   RETURN .F.
ENDIF

cXML := oHttp:readAll()
oHttp:close()

IF Empty(cXML)
   ERRMSG1("Ocorreu um erro inesperado. Tente outro CEP...")
   RETURN .F.
ENDIF

IF (cRes := Substr( cXML, At("<resultado>",cXML)+11, At("</resultado>",cXML)-At("<resultado>",cXML)-11 ) ) $ "1"
   cUf          := sAcento(Substr( cXML, At("<uf>",cXML)+4, At("</uf>",cXML)-At("<uf>",cXML)-4 ) )
   cCidade     := sAcento(Substr( cXML, At("<cidade>",cXML)+8, At("</cidade>",cXML)-At("<cidade>",cXML)-8 ) )
   cTipo         := sAcento(Substr( cXML, At("<tipo_logradouro>",cXML)+17, At("</tipo_logradouro>",cXML)-At("<tipo_logradouro>",cXML)-17 ) )
   cEnde         := sAcento(Substr( cXML, At("<logradouro>",cXML)+12, At("</logradouro>",cXML)-At("<logradouro>",cXML)-12 ) )
   cBairro     := sAcento(Substr( cXML, At("<bairro>",cXML)+8, At("</bairro>",cXML)-At("<bairro>",cXML)-8 ) )
   wendereco := LimpaStr( UPPER(cTipo) ) + " " + LimpaStr(UPPER(cEnde) )
   wbairro   := LimpaStr( UPPER(cBairro) )
   wcidade   := LimpaStr( UPPER(cCidade) )
   westado   := LimpaStr( UPPER(cUf) )
   /*
   //Esta parte eu implementei com meu cadastro IBGE e há variaveis não utilizadas que deixei pra excluir depois
   IF MsgYesNo( "Pesquisa código IBGE S/N?" )
      if SELECT("CADIBGEM") > 0
         DBSETORDER(3)
         DBGOTOP()
         SEEK westado+wcidade
         IF ! FOUND()
            DBGOTOP()
            SEEK UPPER(westado+wcidade)
            IF FOUND()
               wcodibge := codibge
               wcidade  := LimpaStr(UPPER(Cidade))
               westado  := LimpaStr( UPPER(sigla) )
            endif
         ELSE   
            wcodibge := codibge
            wcidade  := LimpaStr(UPPER(Cidade))
            westado  := LimpaStr( UPPER(sigla) )
         ENDIF
      ENDIF
      if ! (westado $ "EX")
         wcodpais := "1058"
      endif
   endif   
   */
ENDIF
oDlgDialog:update()
RETURN .T.
// -----------------[ EOF ]-----------------

 

 

Link to comment
Share on other sites

 

opa!!!

Tem uma rotina que peguei acho que aqui no fórum, este código está meio marreta, mas me atende em tempo de cadastro do cliente num valid de um get.

FUNCTION BUSCA_CEP(wcep, oDlgDialog)
LOCAL GetList := {}
LOCAL oHttp, cXML, cCep := wcep, ODLG_c
LOCAL cRes, cUf, cCidade, cTipo, cEnde, cBairro
oHttp:= TIpClientHttp():new( "http://cep.republicavirtual.com.br/web_cep.php?cep="+cCep+"&formato=xml" )

IF ! oHttp:open()
   ERRMSG1( "Erro na conexÆo: "+ oHttp:lastErrorMessage() )
   RETURN .F.
ENDIF

cXML := oHttp:readAll()
oHttp:close()

IF Empty(cXML)
   ERRMSG1("Ocorreu um erro inesperado. Tente outro CEP...")
   RETURN .F.
ENDIF

IF (cRes := Substr( cXML, At("<resultado>",cXML)+11, At("</resultado>",cXML)-At("<resultado>",cXML)-11 ) ) $ "1"
   cUf          := sAcento(Substr( cXML, At("<uf>",cXML)+4, At("</uf>",cXML)-At("<uf>",cXML)-4 ) )
   cCidade     := sAcento(Substr( cXML, At("<cidade>",cXML)+8, At("</cidade>",cXML)-At("<cidade>",cXML)-8 ) )
   cTipo         := sAcento(Substr( cXML, At("<tipo_logradouro>",cXML)+17, At("</tipo_logradouro>",cXML)-At("<tipo_logradouro>",cXML)-17 ) )
   cEnde         := sAcento(Substr( cXML, At("<logradouro>",cXML)+12, At("</logradouro>",cXML)-At("<logradouro>",cXML)-12 ) )
   cBairro     := sAcento(Substr( cXML, At("<bairro>",cXML)+8, At("</bairro>",cXML)-At("<bairro>",cXML)-8 ) )
   wendereco := LimpaStr( UPPER(cTipo) ) + " " + LimpaStr(UPPER(cEnde) )
   wbairro   := LimpaStr( UPPER(cBairro) )
   wcidade   := LimpaStr( UPPER(cCidade) )
   westado   := LimpaStr( UPPER(cUf) )
   /*
   //Esta parte eu implementei com meu cadastro IBGE e há variaveis não utilizadas que deixei pra excluir depois
   IF MsgYesNo( "Pesquisa código IBGE S/N?" )
      if SELECT("CADIBGEM") > 0
         DBSETORDER(3)
         DBGOTOP()
         SEEK westado+wcidade
         IF ! FOUND()
            DBGOTOP()
            SEEK UPPER(westado+wcidade)
            IF FOUND()
               wcodibge := codibge
               wcidade  := LimpaStr(UPPER(Cidade))
               westado  := LimpaStr( UPPER(sigla) )
            endif
         ELSE   
            wcodibge := codibge
            wcidade  := LimpaStr(UPPER(Cidade))
            westado  := LimpaStr( UPPER(sigla) )
         ENDIF
      ENDIF
      if ! (westado $ "EX")
         wcodpais := "1058"
      endif
   endif   
   */
ENDIF
oDlgDialog:update()
RETURN .T.
// -----------------[ EOF ]-----------------

 

 

 

O ideal é que o código postado seja independente de tabelas próprias ou até de funções próprias, ou seja, a pessoa pega o código compila localmente e já execute. No caso deste código a pessoa tem que pegar e retirar tudo que não tem ou que tem dependencia externa, adaptar e rodar.

Então o ideal seria, se possivel, você deixar seu código independente. Quem desejar pega o código e compila e ja vai testar. Posteriormente ele adapta as necessidades.

Quanto a outras fontes para buscar o CEP a idéia é ótima, no exemplo que postei basta apenas alterar a funcao "WebGetCep" buscando de outras fontes de dados quando uma falhar.

Abraços

 

 

 

Link to comment
Share on other sites

n

 

 

O ideal é que o código postado seja independente de tabelas próprias ou até de funções próprias, ou seja, a pessoa pega o código compila localmente e já execute. No caso deste código a pessoa tem que pegar e retirar tudo que não tem ou que tem dependencia externa, adaptar e rodar.

Então o ideal seria, se possivel, você deixar seu código independente. Quem desejar pega o código e compila e ja vai testar. Posteriormente ele adapta as necessidades.

Quanto a outras fontes para buscar o CEP a idéia é ótima, no exemplo que postei basta apenas alterar a funcao "WebGetCep" buscando de outras fontes de dados quando uma falhar.

Abraços

 

 

 

 

 

 

O ideal é que o código postado seja independente de tabelas próprias ou até de funções próprias, ou seja, a pessoa pega o código compila localmente e já execute. No caso deste código a pessoa tem que pegar e retirar tudo que não tem ou que tem dependencia externa, adaptar e rodar.

Então o ideal seria, se possivel, você deixar seu código independente. Quem desejar pega o código e compila e ja vai testar. Posteriormente ele adapta as necessidades.

Quanto a outras fontes para buscar o CEP a idéia é ótima, no exemplo que postei basta apenas alterar a funcao "WebGetCep" buscando de outras fontes de dados quando uma falhar.

Abraços

 

 

 

João, o sAcento é aquele que todos usam pra excluir os acentos que vc mesmo postou aqui.

Link to comment
Share on other sites

Espero que agora este do gosto e do crivo do Eduardo. aahauhauauauauuaa, morrendo de rir aqui.

 

FUNCTION BUSCA_CEP(Ccep)
LOCAL oHttp, cXML
LOCAL cRes, cUf, cCidade, cTipo, cEnde, cBairro
oHttp:= TIpClientHttp():new( "http://cep.republicavirtual.com.br/web_cep.php?cep="+cCep+"&formato=xml" )

IF ! oHttp:open()
   ? "Erro na conexÆo: "+ oHttp:lastErrorMessage()
   RETURN .F.
ENDIF

cXML := oHttp:readAll()
oHttp:close()

IF Empty(cXML)
   ?"Ocorreu um erro inesperado. Tente outro CEP..."
   RETURN .F.
ENDIF

IF (cRes := Substr( cXML, At("<resultado>",cXML)+11, At("</resultado>",cXML)-At("<resultado>",cXML)-11 ) ) $ "1"

   cUf          := Substr( cXML, At("<uf>",cXML)+4, At("</uf>",cXML)-At("<uf>",cXML)-4 )  
   cCidade     := Substr( cXML, At("<cidade>",cXML)+8, At("</cidade>",cXML)-At("<cidade>",cXML)-8 )
   cTipo         := Substr( cXML, At("<tipo_logradouro>",cXML)+17, At("</tipo_logradouro>",cXML)-At("<tipo_logradouro>",cXML)-17 )
   cEnde         := Substr( cXML, At("<logradouro>",cXML)+12, At("</logradouro>",cXML)-At("<logradouro>",cXML)-12 )
   cBairro     := Substr( cXML, At("<bairro>",cXML)+8, At("</bairro>",cXML)-At("<bairro>",cXML)-8 )  
   wendereco := RTRIM( LTRIM( UPPER(cTipo) ) + " " +RTRIM( LTRIM(UPPER(cEnde) ) )
   wbairro   := RTRIM( LTRIM( UPPER(cBairro) ) )
   wcidade   := RTRIM( LTRIM( UPPER(cCidade) ) )
   westado   := RTRIM( LTRIM( UPPER(cUf) ) )

ENDIF
RETURN .T.
// -----------------[ EOF ]-----------------

Link to comment
Share on other sites

Kapiaba, corrigi o fonte, pega la e testa novamente de quiser...

 

Jorge, meu padrão é alto, o código abaixo seria mais próximo do meu crivo (se era assim seu desejo) kkkkkk... também corrigi um erro onde faltava parenteses

 

Abraços amigo e obrigado pela outra dica, depois com um tempo eu vou adaptar o meu código original para utilizar também essa outra fonte de dados

 

#include "fivewin.ch"

Function u_Teste()
aRet := BUSCA_CEP("13380003")
MsgStop(aRet[1]+Chr(13)+Chr(10)+aRet[2]+Chr(13)+Chr(10)+aRet[3]+Chr(13)+Chr(10)+aRet[4])
Return

Static FUNCTION BUSCA_CEP(Ccep)
LOCAL oHttp, cXML
LOCAL cRes, cUf, cCidade, cTipo, cEnde, cBairro
Local aRet := {}
oHttp:= TIpClientHttp():new( "http://cep.republicavirtual.com.br/web_cep.php?cep="+cCep+"&formato=xml" )

IF ! oHttp:open()
   ? "Erro na conexÆo: "+ oHttp:lastErrorMessage()
   RETURN aRet
ENDIF

cXML := oHttp:readAll()
oHttp:close()

IF Empty(cXML)
   ?"Ocorreu um erro inesperado. Tente outro CEP..."
   RETURN aRet
ENDIF

IF (cRes := Substr( cXML, At("<resultado>",cXML)+11, At("</resultado>",cXML)-At("<resultado>",cXML)-11 ) ) $ "1"

   cUf          := Substr( cXML, At("<uf>",cXML)+4, At("</uf>",cXML)-At("<uf>",cXML)-4 )  
   cCidade     := Substr( cXML, At("<cidade>",cXML)+8, At("</cidade>",cXML)-At("<cidade>",cXML)-8 )
   cTipo         := Substr( cXML, At("<tipo_logradouro>",cXML)+17, At("</tipo_logradouro>",cXML)-At("<tipo_logradouro>",cXML)-17 )
   cEnde         := Substr( cXML, At("<logradouro>",cXML)+12, At("</logradouro>",cXML)-At("<logradouro>",cXML)-12 )
   cBairro     := Substr( cXML, At("<bairro>",cXML)+8, At("</bairro>",cXML)-At("<bairro>",cXML)-8 )  
   wendereco := RTRIM( LTRIM( UPPER(cTipo) ) + " " +RTRIM( LTRIM(UPPER(cEnde) ) ))
   wbairro   := RTRIM( LTRIM( UPPER(cBairro) ) )
   wcidade   := RTRIM( LTRIM( UPPER(cCidade) ) )
   westado   := RTRIM( LTRIM( UPPER(cUf) ) )
   aRet := {wendereco,wbairro,wcidade,westado}

ENDIF
RETURN aRet

 

 

Link to comment
Share on other sites

Aqui é assim. ahauhaua como disse o Lavoisier "Nada se cria tudo, se transforma", vamos no conceito de nada se cria td se adapta ou se copia ahauhauaua. E vamo que vamo.

Agora, fale pro nosso amigo Kapi que tem um prato de VIRADO À PAULISTA, com uma caipirinha e uma cerveja esperando ele, pra vc ver essa preguiça ir embora correndo do corpo dele.

[]s,

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...