emotta Posted October 19, 2018 Report Share Posted October 19, 2018 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 Valdir, Theotokos and frkiko 3 Quote Link to comment Share on other sites More sharing options...
Valdir Posted October 19, 2018 Report Share Posted October 19, 2018 Amigo Eduardo... Obrigado pela sua contribuição. Abrs. Quote Link to comment Share on other sites More sharing options...
Marca Posted October 19, 2018 Report Share Posted October 19, 2018 Eduardo Somente um comentário por experiência Utilizei esta url "http://viacep.com.br" por algum tempo sendo que a mesma é muito furada. Faltam muitos ceps na base de dados deles. Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted October 21, 2018 Report Share Posted October 21, 2018 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, kapiaba 1 Quote Link to comment Share on other sites More sharing options...
emotta Posted October 22, 2018 Author Report Share Posted October 22, 2018 Maravilha pessoal, o exemplo do código está ai basta adaptarem as necessidades de cada um. Por enquanto, para o meu caso, o VIACEP está resolvendo. abraços Quote Link to comment Share on other sites More sharing options...
kapiaba Posted October 22, 2018 Report Share Posted October 22, 2018 Eduardo, poste a função: SemAcento Quote Link to comment Share on other sites More sharing options...
kapiaba Posted October 22, 2018 Report Share Posted October 22, 2018 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. Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted October 22, 2018 Report Share Posted October 22, 2018 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 ]----------------- Quote Link to comment Share on other sites More sharing options...
kapiaba Posted October 22, 2018 Report Share Posted October 22, 2018 Thanks, poste> [code sAcento() [/code] Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted October 22, 2018 Report Share Posted October 22, 2018 A resposta do Eduardo é mais completa, pq traz o código IBGE, mas como o amigo Marca disse acima, peca no conteúdo por falta de alguns cep's, porém, como eu nunca fiz uso, não posso opinar, embora esta também faça parte na lista de pesquisa do ACBR e mais outras 10. []s, Quote Link to comment Share on other sites More sharing options...
emotta Posted October 22, 2018 Author Report Share Posted October 22, 2018 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 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted October 22, 2018 Report Share Posted October 22, 2018 Sem Acento faiô feio: Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted October 22, 2018 Report Share Posted October 22, 2018 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. Quote Link to comment Share on other sites More sharing options...
emotta Posted October 22, 2018 Author Report Share Posted October 22, 2018 Sem Acento faiô feio: João, esse problema não é do acento e sim do formato do arquivo que está no formato UTF e não ANSI... Tem uma solução pra isso, jaja posto no fonte... Mas o fonte da semacento está livre, pode corrigir tb se desejar... kapiaba 1 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted October 22, 2018 Report Share Posted October 22, 2018 Hoje é segunda-feira... a preguiça me mata. kkkkkkkkkkkkkkkkkkkkkkkk. Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted October 22, 2018 Report Share Posted October 22, 2018 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 ]----------------- Quote Link to comment Share on other sites More sharing options...
emotta Posted October 22, 2018 Author Report Share Posted October 22, 2018 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 Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted October 22, 2018 Report Share Posted October 22, 2018 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, kapiaba 1 Quote Link to comment Share on other sites More sharing options...
emotta Posted October 22, 2018 Author Report Share Posted October 22, 2018 Jorge o mundo só evoluiu por causa das cópias melhoradas continuamente... É isso ai, sempre melhorando, cada contribuição é importante... abraços kapiaba 1 Quote Link to comment Share on other sites More sharing options...
sygecom Posted October 22, 2018 Report Share Posted October 22, 2018 Aqui usamos a anos o web-service: http://www.byjg.com.br/ Na época, inclusive contribui com exemplo xHarobur, que deve está por lá ainda. Quote Link to comment Share on other sites More sharing options...
emotta Posted October 23, 2018 Author Report Share Posted October 23, 2018 Posta aqui o seu exemplo, depois vou empacotar tudo em um só e o usuário escolhe passando o parametro sobre qual fonte ele tem preferencia Aqui usamos a anos o web-service: http://www.byjg.com.br/ Na época, inclusive contribui com exemplo xHarobur, que deve está por lá ainda. Quote Link to comment Share on other sites More sharing options...
sygecom Posted October 24, 2018 Report Share Posted October 24, 2018 https://github.com/byjg/sms-cep-service-xHarbour 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.