em
Correios

Webservice – Consulta de CEP diretamente ao site dos correios

Até pouco tempo, tinhamos um site onde podiamos fazer consultas via get, ou até baixar a base de dados utilizada de forma gratuita. Mas seu maior problema para todos que já utilizaram tal base era o fato desta ser muito antiga. Com isso surgia o problema de ruas e bairros com nomes errados ou até mesmo não existentes. O tempo passou, a base ficou ainda mais velha e o site passou a cobrar pelos serviços. Mas não tem problema, os correios que antes tinham um sistema que não permitia se aproveitar dos dados (gerava as respostas em imagens), hoje nos disponibiliza uma versão mobile que facilmente nos permite tratar as respostas.

Para criarmos nosso próprio webservice em PHP vamos simular o comportamento realizado pelo site através de requisições cURL.

Aqui incluimos biblioteca phpQuery (http://code.google.com/p/phpquery/ que permite manipular conteúdo html atrvés de seleções tipo jquery/css):

include(‘phpQuery-onefile.php’);

Após criamos uma função para fazermos requisições via cURL, para depois tratarmos com o phpQuery.

function simple_curl($url,$post=array(),$get=array()){
	$url = explode(‘?’,$url,2);
	if(count($url)===2){
		$temp_get = array();
		parse_str($url[1],$temp_get);
		$get = array_merge($get,$temp_get);
	}

	$ch = curl_init($url[0]."?".http_build_query($get));
	curl_setopt ($ch, CURLOPT_POST, 1);
	curl_setopt ($ch, CURLOPT_POSTFIELDS, http_build_query($post));
	curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	return curl_exec ($ch);
}

Depois de ambiente preparado, mãos as teclas. Aqui esta o cep a ser consultado:

$cep = $_GET['cep'];

Fazemos uma chamada POST direta aos correios http://m.correios.com.br/movel/buscaCepConfirma.do. Para entender, acesse a url pelo navegador e faça uma consulta, nosso webservice fará o mesmo, mas atráves do servidor.

Aqui é onde capturamos o HTML através da chamada cURL, enviando os parametros necessários.

$html = simple_curl(‘http://m.correios.com.br/movel/buscaCepConfirma.do’,array(
	‘cepEntrada’=>$cep,
	‘tipoCep’=>",
	‘cepTemp’=>",
	‘metodo’=>’buscarCep’
));

Fazemos o phpQuery ler o HTML capturado:

phpQuery::newDocumentHTML($html, $charset = ‘utf-8′);

Aqui tratamos os dados com o phpQuery a função pq(), é equivalente ao $() do jQuery $(#id elemento.classe).html() em jQuery, e em PHP pq(#id elemento.classe)->html(). Então temos nosso logradouro, bairro, cidade/uf e cep:

$dados = 
array(
	‘logradouro’=> trim(pq(‘.caixacampobranco .resposta:contains("Logradouro: ") + .respostadestaque:eq(0)’)->html()),
	‘bairro’=> trim(pq(‘.caixacampobranco .resposta:contains("Bairro: ") + .respostadestaque:eq(0)’)->html()),
	‘cidade/uf’=> trim(pq(‘.caixacampobranco .resposta:contains("Localidade / UF: ") + .respostadestaque:eq(0)’)->html()),
	‘cep’=> trim(pq(‘.caixacampobranco .resposta:contains("CEP: ") + .respostadestaque:eq(0)’)->html())
);

Como nem tudo é perfeito, temos que tratar as informações de cidade/uf que vem ‘grudadas':

$dados['cidade/uf'] = explode(‘/’,$dados['cidade/uf']);
$dados['cidade'] = trim($dados['cidade/uf'][0]);
$dados['uf'] = trim($dados['cidade/uf'][1]);
unset($dados['cidade/uf']);

Pronto, basta agora imprimir no formato json e começar a fazer as requisições via ajax:

die(json_encode($dados));

Ao invés do phpQuery, podiamos ter usado o YQL, porém teriamos dobrado o numero de requições, pois chamariamos o servidor do yahoo que por sua vez chamaria o servidor dos correios

Façaa aqui o download dos arquivos de exemplo.

Comentários

  1. Bacana, será que os correios irá disponibilizar pra SEDEX e PAC também?

    por Alexsandro Responder
    1. Já tem disponível na versão mobile consulta de preços e prazos, rastreamento de objetos e endereço das agencias.
      O principio é o mesmo, basta adaptar o código. Assim que der faço isso e posto o link dos outros serviços.

      por Felipe Roberto Responder
      1. Eu acabei que vi aqui mesmo.. funciona bem :)

        por Alexsandro
    2. Recentemente a empresa que trabalho utiliza o iWService, para quem se interessar: http://www.iwservice.com.br

      por Sabrina Nader — Responder
  2. Nossa, muito bom isso. Usando essa ideia aí vou me livrar de diversos problemas que tenho em minhas aplicações.

    Parabéns pelo post!

    por GustavoPulga — Responder
  3. Excelente post eim, usando a base dos correios ela sempre estara atualizada. Vlw

    por Alexandre Broggio Responder
  4. Com certeza com este post a vida fica mais fácil… A web deve funcionar assim mesmo, colaboração entre empresas para melhorar a produtividade de todos.
    Parabéns!!!

    por Anderson Cabral Responder
  5. Alguem ja viu isso?
    http://www.correios.com.br/webservices/

    por Oxente — Responder
  6. preciso de uma url com https, alguém aqui conhece?

    por bruno — Responder
  7. Só pra adicionar…

    Em caso de erro de CEP não encontrado:

    newDocumentHTML(self::$html, $charset = ‘utf-8′);
    $errCEP= array(‘erro’=> trim(pq(‘.erro:eq(0)’)->html()));

    if(empty($errCEP["erro"])){

    $dados =
    array(
    ‘logradouro’=> trim(pq(‘.caixacampobranco .resposta:contains(“Logradouro: “) + .respostadestaque:eq(0)’)->html()),
    ‘bairro’=> trim(pq(‘.caixacampobranco .resposta:contains(“Bairro: “) + .respostadestaque:eq(0)’)->html()),
    ‘cidade/uf’=> trim(pq(‘.caixacampobranco .resposta:contains(“Localidade / UF: “) + .respostadestaque:eq(0)’)->html()),
    ‘cep’=> trim(pq(‘.caixacampobranco .resposta:contains(“CEP: “) + .respostadestaque:eq(0)’)->html())
    );

    }else{

    echo “CEP não localizado!!!”;

    }

    por Aluisio Martins Junior Responder
    1. Opa, vlw pela contribuição!

      por Felipe Roberto Responder
  8. Qual o risco de derepente os correios bloquer as requisiçoes ou simplemente alterar a formatação com frequencia ?

    Ainda tem o risco do sistema deles ficarem off line.

    Falo isso pois tinha problemas em uma webservice de consulta de frete, e como solução implementei a tabela de preços dentro do sistema, como a tabela sofre nom maximo 2 alterações anuais, o cliente mesmo altera.

    Att

    Julio

    por Julio Akira — Responder
    1. Acredito se dependermos se o servidor ficar off-line ou não, acaba que nós não utilizaremos nenhum WebService.

      Porém acredito que essa liberação dos Correios seja uma “falha”, não acredito que o mesmo fique liberado por muito tempo.

      Porém o script está muito bom e funcional, eu mesmo já fiz muitas alterações e implementei ao ExtJS com Zend PHP!

      Att,
      Cleiton.

      por Cleiton — Responder
  9. Ainda prefiro a API DevelMan.

    [plain] http://api.develman.com/correios/cep.dm?v=
    [json] http://api.develman.com/correios/cep.dm?json&v=
    [xml] http://api.develman.com/correios/cep.dm?xml&v=

    Inclusive, possuem um para verificar o nome da pessoa através do CPF:

    [plain] http://api.develman.com/receita/cpf.dm?v=
    [json] http://api.develman.com/receita/cpf.dm?json&v=
    [xml] http://api.develman.com/receita/cpf.dm?xml&v=

    Muito boa materia!

    por Kyrosoft — Responder
    1. Krysoft, as API do develman são interessantes, porém não encontrei nenhuma documentação, se tiver um exemplo html da busca de CEP com json ou plain eu agradeceria.

      por Zoveum — Responder
      1. basta informar o CEP ou CPF após o &v= no final da URL.

        por Kyrosoft —
  10. Os resultados estão retornando com acentuação incorreta. Alguém sabe como corrigir?

    por Ale — Responder
    1. Verifique as encodações: do arquivo, da resposta e do seu retorno.
      Utilize utf8_encode/utf8_decode (de acordo com a necessidade) e sete o cabeçalho no php com a função header e também no html também. Se tudo estiver com o mesmo cabeçalho não haverá mais problema.

      por Felipe Roberto Responder
      1. Felipe, parabéns pela iniciativa. Estou retomando a programação em PHP (que deixei faz muitos anos) e apanhando para fazer São Paulo aparecer no lugar de “S\u00e3o Paulo”. Verifiquei tudo o que podia (como o arquivo php está sendo salvo, coloquei os headers de html com o charset, usei header() e confesso que estou perdido. Qualquer ajuda será mais do que bem-vinda!
        Obrigado

        por Sergio Nader —
      2. Opa Sergio, seu problema é outro. Na verdade não é um problema. Veja que no fim do script esta sendo usado a função json_encode. Esta transforma um array php numa string em json. A string acaba sendo encodada para formato de url (faça o teste: echo rawurlencode(‘são paulo’)).
        Esse script foi desenvolvido para ser utilizado diretamente por uma requisição ajax. Se eventualmente você precisar manipular esses dados via php, basta você não usar o json_encode e você ainda terá o array php.

        por Felipe Roberto
      3. Felipe, tem toda a razão. Bastou eu imprimir a matriz $dados com print_r e deu tudo certo. Muitíssimo obrigado!

        por Sergio Nader —
  11. Ta maneiro o codigo mas precisa ser aperfeiçoado cotem muitos erros ainda!

    por Luiz INOVA — Responder
    1. Opa Luiz se quiser pode contribuir, o projeto esta no git.
      Se não, pode fazer como os colegas fizeram ali em baixo, diga o problema e eu faço a correção.

      por Felipe Roberto Responder
  12. Opa gente!
    Resolvi compartilhar no GitHub (https://github.com/feliperoberto/correios-cep). Assim todos juntos podemos melhorar o webservice e não ficar dependente da boa vontade dos correios em disponibilizar um assim como fez com os demais serviços.
    Aguardo a colaboração de todos.
    Abraço.

    por Felipe Roberto Responder
  13. A grande falha deste script é que ele pega apenas resultados da primeira página. Se você buscar por um nome de rua, por exemplo, há a chance de vir dezenas e dezenas de páginas de resultados.

    por Michel Isoton Responder
    1. Opa Michel, na verdade o objetivo desse serviço é apenas buscar por ceps. Cabe ao desenvolvedor validar a entrada de dados impedindo a busca por endereços (pois os Correios não validam a entrada de dados, e a busca por um cep válido irá retornar apenas 1 resultado). Trata-se de um tutorial que esta um pouco desatualizado. Veja a versão no github e sinta-se a vontade para ajudar a melhorar.

      por Felipe Roberto Responder
      1. Opa, e aí Felipe, tudo bem?
        Então, estou trabalhando em um e-Commerce, em que a busca de CEP através do endereço se faz necessária.
        Estive olhando os códigos e adaptando, porém, até agora só consigo pegar os resultados da segunda página. Sei que para pegar o resto dos resutlados, é necesasário ir fazendo requisições, passando o parâmetro ‘metodo’ como ‘proximo’, e ‘numPagina’ como a pagina atual. Porém, as requisições não retornam nada.

        Pretendo continuar tentando, e se conseguir algo, entro em contato para disponibilizar aqui.

        por Michel Isoton
    2. Pronto Michel, atualizei o código para permitir a busca de endereço. Coloquei seu crédito lá.

      por Felipe Roberto Responder
  14. Parabéns pelo post. Agora com esse phpQuery da pra fazer paradas bacana.

    por Felipe — Responder
  15. ola amigos, antes de tudo queria dar os parabéns pelo artigo pois esta perfeito… o seu código faz tudo o propõe a fazer!
    queria contribuir apenas com um alerta…
    Tanto para os usuários de Windows e de Linux, o cURL (função utilizada para adquirir uma requisição http) não faz parte do PHP por padrão, essa função precisa ser instalada e habilitada no php.ini para quem usa uma distribuição Linux baseada no debian é só executar o “apt-get install php5-curl” como super usuário no terminal e pronto… agora pra quem usa Windows eu não sei rsrsrs eu nunca usei apache e php no Windows rsrsr…. se bem que No PHP existem quatro formas de você acessar uma URL externa: usando a função fopen(), usando a função fsockopen(), usando a biblioteca cURL e usando a classe HTTP_Request…. eu gosto do cURL por que é mais facil de usar… mas mesmo assim valeu, o artigo esta muito bom… tomei a liberdade e testar e da de 10 x 0 no que eu tinha feito parabéns mesmo cara!!! faloww

    por Hudson — Responder
    1. Obrigado Hudson, inclusive só utilizei curl pois em meu servidor não estava habilitado fazer fopen para outros sites.
      e recentemente descobri que para habilitar bastava usar o simples comando ini_set(“allow_url_fopen”, 1);
      valeu por sua contribuição, com o fopen o código fica inclusive mais enxuto.

      por Felipe Roberto Responder
  16. cara, eu fatorei o codigo e notei que ele retorna um array de com os dados e tal… mas se eu por um CEP como 58114000
    que retorna:
    cep = 58444000
    estado = PB
    os demias campos do array retornarão vazios dai eu fiz uma função que faz o seguinte:

    function validaArrayEndereco($cep, $listaEndereco){
    $endereco = array();
    $html = endereco_dne_correios::simple_curl(‘http://m.correios.com.br/movel/buscaCepConfirma.do’,array(
    ‘cepEntrada’=>$cep,
    ‘tipoCep’=>”,
    ‘cepTemp’=>”,
    ‘metodo’=>’buscarCep’
    ));
    phpQuery::newDocumentHTML($html, $charset = ‘utf-8′);

    foreach ($listaEndereco as $chave => $valor){
    $dados = trim(pq(‘.caixacampobranco .resposta:contains(“‘.$valor.'”) + .respostadestaque:eq(0)’)->html());
    if (strlen($dados) > 0 ){
    $endereco[$chave] = $dados;
    }
    }
    return $endereco;
    }

    ai nesse ponto vc passa os campos que vc gostaria que fossem preenchito e recebe apenas os que realmente existe:

    $dados = validaArrayEndereco($cep, array(
    ‘logradouro’ => ‘Logradouro: ‘,
    ‘bairro’ => ‘Bairro: ‘,
    ‘municipio/estado’ => ‘Localidade / UF: ‘,
    ‘cep’ => ‘CEP: ‘
    ));

    e por fim se a variavel $dados retornar uma array vazio é, sera por que não encontrou o CEP, caso contrario retornas só os
    dados que encontra, ve oque vc acha…

    faloww

    por Hudson — Responder
    1. Então Hudson, essa versão que você corrigiu já esta defasada. Há um tempo eu mudei da versão mobile dos correios, pois a versão desktop tinha os dados mais consistentes.
      Talvez por isso tenha sentido a necessidade de criar essa segunda validação. Tentei testar seu código, mas no momento os servidores dos correios parecem estar fora do ar (ao menos na minha maquina, rs).
      Verifique a versão que temos no github (https://github.com/feliperoberto/correios-cep/), se nela ainda houver a necessidade, pode dar um commit (aproveita que o código tá aberto, rs)!

      por Felipe Roberto Responder
      1. da para testar aqui! http://cepcorreios.phpfogapp.com/?cep=58114000 ( no momento deste comentário o link não funcionava pois o server dos correios estava fora do ar, espero que volte logo)

        por Felipe Roberto
      2. Felipe tudo bem??
        esse link http://cepcorreios.phpfogapp.com/?cep=58114000 é oficial dos correios??? você sabe qual a variável dos resultados?

        obrigado.

        por Leonardo Figueiredo
      3. Sim, este servidor esta rodando uma das versões do webservice que criei no tutorial.
        O retorno dele é um json com cidade, uf, bairro, logradouro e cep.

        por Felipe Roberto —
      4. deixa eu te explicar como o meu funciona, trabalho com ecommerce e minha programação hoje para busca de cep é:
        cep = $.trim($(‘input[name="postcode"]‘).val().replace(‘-‘, ”));
        $.getScript(“http://cep.republicavirtual.com.br/web_cep.php?formato=javascript&cep=”+cep, function(){
        if(resultadoCEP["resultado"] == “1”){
        $(‘input[name="address_1"]‘).val(unescape(resultadoCEP["tipo_logradouro"])+” “+unescape(resultadoCEP["logradouro"]));
        $(‘input[name="address_2"]‘).val(unescape(resultadoCEP["bairro"]));
        $(‘input[name="city"]‘).val(unescape(resultadoCEP["cidade"]));
        $(‘input[name="company"]‘).focus();
        $(‘select[name=\'zone_id\']‘).load(‘index.php?route=account/register/estado_autocompletar&estado=’+unescape(resultadoCEP["uf"]));

        se você perceber verá que ele busca no site o endereço e retorna na variavel: resultadoCEP os valores.

        eu não entendo muito de programação, acho que preciso da variavel do seu retorno para poder incluir em minha lojinha. obrigado

        por Leonardo Figueiredo
    2. Ok, entendi sua dúvida.
      o código será mais ou menos essa:

      $(‘[name=”usuario[cep]“]’).bind(‘keyup blur’, function(){
      var $cep = $(this);
      var cep = $(this).val();
      cep = cep.replace(‘-‘,”);
      if(cep.length == 8){
      $.getJSON(‘api/correios/cep.php’,{cep:cep},function(endereco){
      $cep.data(‘dados_cep’,endereco);
      if(endereco.uf){
      $(‘[name=”usuario[complemento]“]’).val(”);
      $(‘[name=”usuario[cep]“]’).val(endereco.cep);
      $(‘[name=”usuario[logradouro]“]’).val(endereco.logradouro ? endereco.logradouro : ”);
      $(‘[name=”usuario[numero]“]’).val(endereco.numero ? endereco.numero : ”);
      $(‘[name=”usuario[bairro]“]’).val(endereco.bairro ? endereco.bairro :”);
      $(‘[name=”usuario[cidade]“]’).val(endereco.cidade ? endereco.cidade : ”);
      $(‘[name=”usuario[uf]“]’).val(endereco.uf ? endereco.uf : ”);
      }
      });
      }
      });

      por Felipe Roberto Responder
      1. cara só uma dúvida, você está buscando as informações no endereço api/correios/cep.php eu mantenho esse endereço ou troco até o caminho do meu arquivo cep.php?? abraço

        por Leonardo Figueiredo
      2. isso, você deve trocar pelo seu arquivo (é que na pressa eu só copiei o que eu usei)

        por Felipe Roberto
      3. kkk desisto :P mas obrigado pelas dicas!

        por Leonardo Figueiredo
  17. Valeu!! Ajudou bastante!!

    por valdeir — Responder
  18. Olá Felipe, parabéns pelo artigo !

    Fiz a seguinte modificação para buscar os endereços pelo logradouro ou pelo cep trazendo um array como resultado, assim como funciona no site dos Correios.

    $dados = array();
    for($i=2; $ilength-1; $i++)
    {
    $dados[] =
    array(
    ‘logradouro’=> trim(pq(‘.ctrlcontent table tr:eq(‘.$i.’) td:eq(0)’)->text()),
    ‘bairro’=> trim(pq(‘.ctrlcontent table tr:eq(‘.$i.’) td:eq(1)’)->text()),
    ‘cidade’=> trim(pq(‘.ctrlcontent table tr:eq(‘.$i.’) td:eq(2)’)->text()),
    ‘uf’=> trim(pq(‘.ctrlcontent table tr:eq(‘.$i.’) td:eq(3)’)->text()),
    ‘cep’=> trim(pq(‘.ctrlcontent table tr:eq(‘.$i.’) td:eq(4)’)->text())
    );
    }
    echo(json_encode($dados));

    Se puder coloque no Git.

    Até mais !!!

    por Luciano Oliveira Borges Responder
    1. Já não é o primeiro que sugere fazer buscas de endereço pelo mecanismo.
      A princípio não era o objetivo, mas devido a necessidade vou implementar. Valeu pela contribuição, logo coloco no git.

      por Felipe Roberto Responder
    2. Pronto, está lá. Atualizei o código e coloquei seu crédito.

      por Felipe Roberto Responder
  19. Pingback: OSC-Magento-Brasil – Magento One Step Checkout free e normatizado para o Brasil | Desenvolvedor, Webdesigner e Pesquisador | deivison.com.br

  20. Para que utilizar uma biblioteca gigante dessas, só para gerar uma requisição curl e recuperar os dados ?? isso é doidera.

    por Rodolfo — Responder
    1. O tutorial tem como objetivo principal mostrar as possibilidades de consumo de informação independente da disponibilização destas através de webservices oficiais.
      A biblioteca phpquqery foi utilizada para facilitar o entendimento, já que todo desenvolvedor conhece os seletores css (aqueles usados no tão popular jquery). Pode-se utilizar a manipulação direta do DOM por funções PHP ou até mesmo ir limpando via expressão regular se você for um ninja.
      Quanto a utilização do curl, esta pode ser substituída pela file_get_contents (usei curl, pois poderia vir ser necessário modificar o cabeçalho para simular acesso de um navegador).

      por Felipe Roberto Responder
  21. E ainda, a maioria das hespedagens deixa o http wrapper desabilitado e bloqueado, ou seja, file_get_contents() não funcionaria para arquivos remotos. cURL resolve isto. Mas o que o amigo falou sobre a biblioteca é real. Criando uma funçãozinha extra no código, com 4 ou 5 linhas, dá pra manipular o DOM de forma bem fácil… é interessante abordar isto.

    por Michel Isoton Responder
  22. Olá, muito bom o código ..foi de grande valia ,,, para meu projeto … obrigado..

    por KARLOS EDUARDO — Responder
  23. olá, como eu faço para fazer a consulta?? eu tenho que colocar no no botão do campo cep para buscar no arquivo php??

    não entendi

    por Leonardo Figueiredo Responder
    1. Opa, respondi em lugar errado. Leia abaixo

      por Felipe Roberto — Responder
  24. O arquivo php é o webservice. Você fará uma requisição GET com o parâmetro cep e ele ira retornar um objeto json com os dados referentes a consulta(CEP, logradouro, bairro, cidade e uf).
    Por tratar-se de um webservice o retorno da requisição precisara ser tratado. Com jquery é fácil, basta usar a função getJSON.

    por Felipe Roberto — Responder
    1. cara acho que consegui dar um passo, veja http://opusconsultoria.com.br/loja/cep.php?cep=SEUCEP

      mas uma dúvida qual é a variável de retorno?? pq eu preciso colocar no meu código

      cep = $.trim($(‘input[name="postcode"]‘).val().replace(‘-‘, ”));
      $.getScript(“http://opusconsultoria.com.br/loja/cep.php?cep=”+cep, function(){
      if(dados["resultado"] == “1”){
      $(‘input[name="address_1"]‘).val(unescape(dados["logradouro"])+” “+unescape(dados["logradouro"]));
      $(‘input[name="address_2"]‘).val(unescape(dados["bairro"]));
      $(‘input[name="city"]‘).val(unescape(dados["cidade"]));
      $(‘input[name="company"]‘).focus();
      $(‘select[name=\'zone_id\']‘).load(‘index.php?route=account/register/estado_autocompletar&estado=’+unescape(dados["uf"]));
      }else{
      $(‘input[name="address_1"]‘).focus();
      alert(“Endereço do cep não encontrado. Digite o endereço manualmente!”);
      }

      o resultado disso tudo, eu vi no arquivo cep.php que a variavel dados é a resposta de tudo, mas não rolou :( tem alguma luz? rs

      por Leonardo Figueiredo Responder
      1. Opa Leonardo, respondi ali em cima

        por Felipe Roberto
      2. fala mestre.. puxa cara eu vou testar hehe.. hiper ansioso! :) obrigado mesmo.. se rolar você não ajudará somente a mim.. mas a muitos pois vou compartilhar o código!! e terá seus créditos! :) vlw

        por Leonardo Figueiredo
  25. Não sei quanto tempo vai ficar disponível este recurso mas foi nota 1000. Obrigadão pela contribuição.

    Se alguém ainda não achou no link a seguir tem os outros serviços via mobile que podem ser aproveitados.
    http://m.correios.com.br/movel/index.do

    por Quilson — Responder
    1. pois é, a ideia é essa mesmo.
      ja implementei também o de código de rastreio.
      e gostaria que todos contribuíssem no github (https://github.com/feliperoberto/correios-cep).
      com o q temos lá no github já da pra listar busca de endereços, achar o endereço de um cep e saber onde esta sua encomenda.

      por Felipe Roberto Responder
      1. Felipe,

        Sabe o que seria bom aproveitar pra fazer em paralelo? Um esquema para puxar para uma tabela SQL a base de dados dos Correios pra se no caso os Correios entrarem numa de bloquear este recurso teriamos uma base de dados CEP atualizada e free.

        Mexo melhor com Delphi do que PHP(fraquinho), vou ver se pego as séries de CEP utilizadas no correio e crio um programinha para fazer este BD.

        Utilizei este esquema seu em meu programa delphi e ficou filé mesmo. Muis uma vez obrigado por compartilhar.

        por Quilson —
      2. Legal a iniciativa, só vai com calma para não alertar o pessoal da TI deles, vai que notam um consumo muito grande e seguido e então implementem alguma barreiras tipo captcha.

        por Felipe Roberto
      3. Ok, vou ver se faço isso na madruga quando o servidor é menos exigido. Qualquer novidade posto aqui. Valeu pela força e atençào.

        por Quilson —
      4. na verdade não me referia apenas ao horario da execução, mas também a frequência.

        por Felipe Roberto
      5. Tem como regular uma frequencia e também não fazer em sequencia de faixa de cep para não chamar atenção e também alterar o ip a cada X requisições, creio que o conjunto já dá uma camuflada.

        O que deve rolar com o tempo se notarem alguma coisa é aquele esquema que tem no rastreamento de objetos “Resolva a expressão: 2 + 3 “, no Delphi acho que resolvo fácil mas no PHP nem sei.

        por Quilson —
  26. Ola Felipe…Parabens seu script é muito bom mesmo…
    tenho uma duvida…tem como fazer uma pesquisa do CEP quando ja tenho o endereco do cliente ??? fazer o inverso que vc fez ai ?

    por Wilton Responder
    1. da sim, na verdade o que você digitar ele vai buscar!
      se digitar cep ele tras o endereço preciso, se não ele vai listar as possibilidades. no caso se digitar texto vai conseguir encontrar.
      vale lembrar que a busca dos correios não é perfeita que nem o google, as vezes pode ser difícil encontrar o que procura.
      no código q tenho no github (https://github.com/feliperoberto/correios-cep) está um pouco mais atualizado, lá ele filtra para busca de cep ou endereço e retorna 1 objeto ou 1 array de objetos. da uma olhada.

      por Felipe Roberto Responder
  27. Olá Felipe tudo bem?!?!

    Seguinte baixei seus códigos para substituição do meu código, mas apenas rodando o cep.php com o cep 13140284 de maneira alguma consigo fazer o charset funcionar corretamente… como posso fazer para Paulínia não aparecer como Paul\u00ednia?

    Obrigado e parabens pela iniciativa

    por Felipe Responder
    1. Na verdade seu problema não esta no charset. Esse ‘Paul\u00ednia’ esta encodado para json (encodado tipo url, para passar por querystring), teste no console: decodeURI(‘Paul\u00ednia’).
      Se você der um eval no objeto json, tipo (getJSON do jquery), vai ver paulínia escrito corretamente, no entanto se tiver modificado o código para usar diretamente pelo php basta não usar a função json_encode() do finalzinho;

      por Felipe Roberto Responder
  28. Olá obrigado pela publicação desta dica. Foi bastante útil para mim.

    por Denis — Responder
  29. Achei legal pra quem precisa de uma base com dados de ruas, ceps, cidades e países atualizada online e offline. http://www.rua-cep-cidade-paises.info #ruas #ceps #cidades #paises

    por Mike Responder
  30. Olá Felipe tudo bem? tenho uma sugestão e um pedido de ajuda.
    Sugestão é que por exemplo o cep 12230901 é um condomínio é no endereço aparece o nome do condomínio e não a rua, poderia ser criado um campo separado para esse nome do local.
    Pedido de ajuda tenho uma ferramenta integradora com o VirtueMart um sistema de ecommerce para Joomla está bem parecido com o seu mas não consigo adapta-lo poderia te passar para me ajudar? Se sim pode me mandar um email com seu email que mando o código :D
    Abraço

    por Leonardo Responder
    1. No momento o site dos correios não esta abrindo este cep, embora o código consiga ver o resultado. Então dei uma debugada e percebi que esta informação de cliente (edifício) esta disponivel apenas na versão mobile.
      nos proximos dias vou atualizar o código, passe dar uma olhada no github, se não pode fazer você mesmo que eu mesclo depois.

      por Felipe Roberto Responder
      1. http://www.buscacep.correios.com.br/servicos/dnec/consultaLogradouroAction.do no site dos correios funciona me add no facebook
        https://www.facebook.com/leonardoatrobles

        Cep Especial
        Cliente: Edifício Por do Sol
        Endereço: Rua Porto Novo, 300
        Bairro: Jardim Satélite
        Localidade / UF: São José dos Campos/SP
        CEP: 12230-901

        por Leonardo Augusto Testoni Robles
  31. Parabéns pelo excelente TRABALHO!!! Muito bom mesmo!

    por Leonardo Augusto Testoni Robles Responder
  32. Felipe concertei sua versão mobile, agora ele retorna aquele tipo de CEP que te falei sem o nome do cliente só o endereço, mas está com problemas de acentuação como posso te enviar?
    Abraço

    por Leonardo Augusto Testoni Robles Responder
    1. Opa, valeu Leonardo. Você fez em cima da versão do github? Se quiser pode inclusive enviar por lá, se não me envie para meu e-mail. contato@feliperoberto.com.br

      por Felipe Roberto Responder
      1. Te mandei o email :D

        por Leonardo Augusto Testoni Robles
  33. Valeu Felipe muito bom o seu trabalho, fiz alguns ajustes para se adequar a minha aplicação e funcionou legal. Parabéns pelo TRABALHO.

    por Demerval — Responder
  34. Parabéns pelo código Felipe.
    Estou tentando buscar por um nome de rua onde deveriam retornar vários registros, porém ele retorna apenas um. É assim mesmo, ou estou fazendo algo errado?

    Obrigado

    por Michel — Responder
    1. Ops Michel, é assim mesmo, embora não devesse ser. Na verdade quando fiz as últimas atualizações não me atentei a este detalhe. Vou verificar e tentar corrigir.

      por Felipe Roberto Responder
  35. Vix Michel, já verifiquei e o problema surgiu qndo voltei para a versão mobile dos correios para adaptar ao novo retorno de nome de cliente no caso de ceps como 12230-901, no entanto a funcionalidade de busca parou de funcionar. Tenta recuperar uma versão antiga no github, se não é só descomentar a outra função cep (acho que chama cepDesktop). Se conseguir corrigir na própria versão mobile atualize lá no github.
    Um dos problemas esta no elemento do looping da busca que são dois (formando lista alternada) mas eu programei só para as impares.

    por Felipe Roberto Responder
  36. Olá. Muito bom e prático esse código. Encontrei apenas uma deficiência. Seria possível validar o cep, ou seja, se o usuário informar um cep não valido, ele retorna tudo vazio.

    Ansioso por uma resposta.

    Obrigado.

    por Wanderson Valério — Responder
    1. A versão atual no github retorna um array vazio, então no js é só você validar: // if(resposta.length === 0) alert(‘cep não encontrado’);

      por Felipe Roberto Responder
  37. Caro Felipe
    Gostaria de parabenizado pelo post, foi o melhor que encontrei até agora, parabéns

    por geraldo — Responder
  38. Felipe legal seu Post, por que não utilizamos direto a API de maps do google digitei o meu cep na barra de procura do Maps do google e retornou o endereço corretinho, será que não temos essa posibilidade, lembrando concerteza o servidor do google deve é mais rapido para uma requisição do que o dos correios.

    por X1alex — Responder
    1. Pois então x1alex, já testei isso e nem sempre a busca é tão efetiva. Veja o meu cep (08773-380), ele não retorna o endereço.
      Teste em : http://maps.googleapis.com/maps/api/geocode/json?address=08773-380&sensor=false ou https://maps.google.com.br/maps?q=08773-380&sugexp=chrome,mod%3D16&um=1&ie=UTF-8&hl=pt-BR&sa=N&tab=wl
      Ainda que a busca fosse mais rápida não acredito que seja um fator decisório pois certamente não deve ser tão mais rápido a fim de justificar o delay de atualização de dados. Lembre-se, que quem gera e atualiza os endereços e ceps são os correios, portanto se alguém terá a base atualiza com exatidão e constância certamente será os Correios.

      por Felipe Roberto Responder
      1. Verdade a posibilidade dos correios ficou bem mais viavel no final das contas, Valeu, pela tentativa.

        por X1alex —
  39. Cara vc acha difícil implementar isso em Java para desktop? Estou precisando muito fazer essa mesma coisa, só que entendo muito pouco de php, será que vc pode me dar uma ajudinha?

    por Gustavo Melo — Responder
    1. Puts Gustavo, não programo em java.
      Mas vou tentar ajudar.
      O que você deverá fazer é entender como fazer um webscrapper em java e tratar o respectivo conteúdo. Em php eu usei o PHPQuery que deu uma tremenda mão na roda na hora de limpar o resultado dos correios.

      por Felipe Roberto Responder
  40. Parabéns pelo Webservice! Muito útil e bem explicado. E melhor ainda o pessoal que ajuda. Estão todos de parabéns.

    por Carlos Henrique Carvalho Responder
  41. Pessoal, o site mobile dos correios está fora do ar por aqui, sendo assim, parou de funcionar, alguém sabe se é definitivo ou temporário?

    por Lucas Bertoni — Responder
    1. É temporário, mas é comum sair do ar. A versão desktop é mais estável embora eu já tenha visto cair também.

      por Felipe Roberto Responder
  42. Olá Felipe e pessoal boa tarde,

    Então depois de utilizar este script por este ano todo em vários sistemas e aplicativos notei como ele tinha uma queda na recuperação dos dados dos Correios e alguma vez na vida eu utilizei um banco de dados comprado dos Correios.

    Procurei aqui e encontrei as fontes deste banco de dados que originalmente era em Access em um CD e na época passei para MySQL.

    As tabelas estão assim:
    – Este era um CD que os Correios vendia para empresas (nem sei se vende ainda) com códigos internos, nomes sem acentos, abreviações e outras.
    – Cada tabela é separada e são relacionadas entre si por códigos (uf, cidades, bairros e logradouros).
    – A codificação é UTF8 com HTML Encode.
    – A tabela logradouros está dividida em 4 arquivos por causa do tamanho (Comece a importação pelo 0).
    – Foi exportada direto do PHPMyAdmin, ou seja, pode ser importada diretamente.
    – A data destes dados é entre 2002 e 2004, não me recordo de jeito nenhum o ano exato.

    Bom o objetivo deste compartilhamento é adiantar o trabalho caso queiram manter aquela idéia de ter uma redundância no casos que em cai o sistema dos Correios, no meu caso eu fiz isso, estou usando com redundância rebatendo em um webservice interno caso falhe os dados dos Correios.

    Espero ter ajudado, abaixo os links das tabelas e boas festas a todos !!!

    http://www.iautomate.com.br/apps/correios/cep_tbluf.sql.gz (1KB)
    http://www.iautomate.com.br/apps/correios/cep_tblcidades.sql.gz (163KB)
    http://www.iautomate.com.br/apps/correios/cep_tblbairros.sql.gz (371KB)
    http://www.iautomate.com.br/apps/correios/cep_tbllogradouros-0.sql.gz (3.628MB)
    http://www.iautomate.com.br/apps/correios/cep_tbllogradouros-1.sql.gz (4.120MB)
    http://www.iautomate.com.br/apps/correios/cep_tbllogradouros-2.sql.gz (4.403MB)
    http://www.iautomate.com.br/apps/correios/cep_tbllogradouros-3.sql.gz (1.177MB)

    Obs.: Felipe me retorne quando baixar os arquivos pois não vou manter no site por muito tempo.

    por Luciano Oliveira Borges Responder
    1. Excelente contribuição Luciano. Infelizmente estou viajando e não vou conseguir baixar. Sugiro que envie esse arquivos ao github assim ficará disponível a todos e de imediato. Em todo caso, ao voltar de férias lhe procuro para ter acesso novamente ao sistema de redundância.

      por Felipe Roberto — Responder
      1. Beleza Felipe,

        Deixarei até quando voltar assim poderá ver melhor depois.

        Assim que voltar ao trabalho me avise.

        Boas Festas e boa viagem !!!

        por Luciano Oliveira Borges
      2. Olá Felipe bom dia,

        Retornando o contato enviado antes das festas de final d ano, retirarei hoje os links para o banco de redundância.

        Peço que se ainda não baixou por favor faça hoje.

        Até mais !!!

        por Luciano Oliveira Borges
      3. Opa Luciano fiz download hoje pela manhã. Obrigado.
        Assim que possível eu atualizo no github

        por Felipe Roberto
      4. Beleza já retirei do ar.

        Até mais e obrigado por avisar.

        por Luciano Oliveira Borges
  43. Felipe, seus códigos estavam funcionando perfeitamente na minha aplicação.
    Porém hoje (08/01), as dados simplesmente pararam de retornar. Isso é normal, por quanto tempo pode ficar assim?
    alguém mais teve este problema?
    Obrgado,
    Júlio

    por Júlio — Responder
    1. Sim Júlio, infelizmente.
      Trata-se de uma instabilidade constante nos sites dos correios.
      Inclusive o Luciano complementou esse webservice. Ele criou um mecanismo para em casos de falhas como a que você passou, o sistema reconheça e faça uma consulta alternativa em uma base de dados local com dados antigos dos correios (é uma base antiga que roda a internet faz tempo, mas certamente irá quebrar o galho por conta da frequência de instablidade dos sites dos correios.

      Quanto as instabilidades, notei que nem sempre são simultâneas na versão desktop e mobile dos sites dos correios. Sendo assim um mecanismo muito eficiente seria se pudéssemos fazer 3 consultas. Primeira tentativa na versão mobile, depois na desktop e finalmente na base local.

      por Felipe Roberto Responder
      1. Bom dia…

        há tempos que venho procurando uma base de dados atualizada… Mas infelizmente não há uma versão gratuita…
        Então eu desenvolvi um projeto em delphi onde importei todas as cidades do IBGE e estou fazendo consulta no site dos correios http://m.correios.com.br/movel/buscaCepConfirma.do e tratando os dados e inserindo na tabela do cep.. resumindo… é um trabalho de operário… pois não sei quais os ceps existem e quais não existem… mas poderiamos reunir forças e cada um fazer a consulta de uma faixa de cep.. e depois reunir os bancos… assim teríamos uma tabela de cep atualizada dos correios… Quem se propõe a ajudar???

        por Gustavo Déo —
      2. A consulta e o tratamento dos dados é feito de forma dinâmica… O trabalho de operário é pelo fato de ter que consultar do 00000-000 até o 99999-999.

        por Gustavo Déo —
      3. Felipe dá para testar o codido utilizando localhost? Estou tentando e está direcionando para o local de down dos seus arquivos.

        por Claion Roberto
      4. Felipe dá para testar o codigo utilizando localhost? Estou tentando e está direcionando para o local de down dos seus arquivos.

        por Claion Roberto
      5. Da sim Cleiton, algo deve estar mal configurado.

        por Felipe Roberto
  44. Caro Felipe, boa noite!

    Parabéns a você e a todos os demais colaboradores pela busca de um produto final que atenda aos anseios e necessidades técnicas de todos os projetos.
    Acompanhei todos os comentários sobre o projeto e para onde ele caminha, ou seja termos uma solução online e offline simultaneamente, para colaborar com tal intuito e poupar o trabalho de operário de nosso colega Gustavo Déo, creio que Eu possa fornecer ao projeto gratuitamente a base de CEP BR atualizada até março/2010, para tanto queira me contatar por email para viabilizarmos o envio da mesma, pois é um BD grande.
    Forte Abraço a todos os colegas.

    por Joel Ramos — Responder
    1. Boa noite Joel,
      pode me enviar para meu email? contato@feliperoberto.com.br – é gmail fique tranquilo qnto ao tamanho do anexo. mas ficaria feliz se colocasse esses arquivos no github ( https://github.com/feliperoberto/correios-cep ), assim todos teriam acesos.

      já possuo a versão de 2004 fornecida pelo Luciano Oliveira Borges, mas seria interessante ter uma versão mais recente.

      por Felipe Roberto Responder
  45. Pingback: API’s para consulta de CEP » Pinceladas da Web - HTML5 Hard Coding and Bullet Proof CSS

  46. Show, muito bom a dia e exemplos!

    por Maik Tomé Responder
    1. Prezados, Boa Tarde!Atualmente possuo o SIGEP Verse3o 2.06.O meu prebolma talvez seja fe1cil de resolver, acontece que treas estae7f5es da minha rede trabalham com essa verse3o e ao que entendi, elas alimentam um banco de dados em ACCESS que este1 na rede. O maior agravante foi que um desses computadores precisou ser formatado.Apos coloce1-lo em rede novamente foi e0 vez de instalar o SIGEP 2.06 e voltar o seu respectivo backup. Feito isso liberei o computador para a menina trabalhar, mas a mesma informou que os dados ne3o estavam condizentes com os outros dois computadores. Foi ai que percebi que esses dois micros buscam um banco de dados na rede, no caso esta no formato em Access, porem eu ne3o encontro em nenhum lugar no aplicativo SIGEP uma maneira de apontar o banco de dados para o servidor.Entrei em contato no suporte e me orientaram a baixar a nova verse3o e o banco de dados compartilhado.Muito legal tudo em Java, bonitinho, ate9 a parte que ele ne3o importa os destinate1rios da antiga verse3o para essa nova verse3o SIGEPWEB.Ao comunicar o suporte novamente, a moe7a informou que na maioria dos casos ele realmente ne3o faz a importae7e3o dos dados e a fanica alternativa e9 lane7ar tudo na me3o. Tudo bem, se ne3o fossem quase 700 registro.Ente3o fica minha reclamae7e3o, e9 possedvel voltarmos fazer essa verse3o a trabalhar em rede. Se ne3o, preciso ente3o que sejam importados os dados do antigo sigep para o sigepweb.Atenciosamente,Felipe Dias

      por Phernanda Responder
  47. Gostei do post, mas não consegui usar. Tem um exemplo disso funcionando?

    por Bruno Responder
    1. Tem sim Bruno, veja no seguinte comentário: http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/#div-comment-482672

      por Felipe Roberto Responder
  48. Muito boa a ideia!
    Adaptei a linguagem java, e funcionou perfeitamente!

    Parabéns!

    por Hallan Medeiros Responder
    1. Tem como fornecer as classes… Estou apanhando muito e não consigo..
      Vlw

      por Ururai — Responder
  49. Olá.
    Parabéns!
    Muito Legal.
    Como eu chamo a rotina?
    Chamei assim: http://www.meier.globobairros.com.br/cep.php?cep=20940050

    Funcionou, mas as informações veio todas esquisitas.

    {“logradouro”:”Rua do Parque”,”bairro”:”S\u00e3o Crist\u00f3v\u00e3o”,”cep”:”20940050″,”cidade”:”Rio de Janeiro”,”uf”:”RJ”}

    Como faço para resolver quando o endereço tiver acentuações?
    Grato.

    por Alberto Rodrigues — Responder
    1. A resposta parece esquisita pois esta encodada em json.
      Uma aplicação front-end rapida se da através de uma requisição GET para a url da api e trata o retorno com eval, transformando a string json em um objeto javascript.

      Veja o exemplo com jquery no seguinte comentário: http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/#div-comment-482672

      por Felipe Roberto Responder
  50. Estou usando a versão mobile alguém conseguiu pegar os dados da segunda página em diante na pesquisa por endereço? Quando faço a requisição passando os valores:
    ‘metodo’=>’Proximo’
    ‘numPagina’=>1
    Para mim retorna duas linhas null.

    por Anderson Amann — Responder
  51. Ola,
    No caso de consulta com endereço a versão do git traz apenas um resultado no foreach.
    segue exemplo de correção
    GIT: ‘cliente’=> trim(pq(‘.caixacampobranco .resposta:contains(“Cliente: “) + .respostadestaque:eq(0)’)->html()),
    CORRECAO: ‘cliente’=> trim(pq($tr)->find(‘.resposta:contains(“Cliente: “) + .respostadestaque:eq(0)’)->html()),

    outra coisa quando tem mais de um resultado ele cria duas caixa: caixacampobranco e caixacampoazul, precisa fazer o tratamento das duas, estou finalizando e ja envio!

    por isaaclopes Responder
    1. segue pode ser melhorada,
      traz todos os endereços
      $dados = array();
      $c = 0;
      $t = count(pq(‘.caixacampobranco’));
      $i = count(pq(‘.caixacampoazul’));

      foreach (pq(‘.caixacampobranco’) as $tr) {
      $dados[$c] = array(
      ‘cliente’=> trim(pq($tr)->find(‘.resposta:contains(“Cliente: “) + .respostadestaque:eq(0)’)->html()),
      ‘endereco’=> trim(pq($tr)->find(‘.resposta:contains(“Endereço: “) + .respostadestaque:eq(0)’)->html()),
      ‘logradouro’ => trim(pq($tr)->find(‘.resposta:contains(“Logradouro: “) + .respostadestaque:eq(0)’)->html()),
      ‘bairro’ => trim(pq($tr)->find(‘.resposta:contains(“Bairro: “) + .respostadestaque:eq(0)’)->html()),
      ‘cidade/uf’ => trim(pq($tr)->find(‘.resposta:contains(“Localidade / UF: “) + .respostadestaque:eq(0)’)->html()),
      ‘cep’ => trim(pq($tr)->find(‘.resposta:contains(“CEP: “) + .respostadestaque:eq(0)’)->html())
      );
      $dados[$c]['cidade/uf'] = explode(‘/’,$dados[$c]['cidade/uf']);
      $dados[$c]['cidade'] = trim($dados[$c]['cidade/uf'][0]);
      $dados[$c]['uf'] = trim($dados[$c]['cidade/uf'][1]);
      unset($dados[$c]['cidade/uf']);
      if($dados[$c]['endereco']){
      $dados[$c]['logradouro'] = $dados[$c]['endereco'];
      }
      unset($dados[$c]['endereco']);
      $c += 1;
      }
      if ($i > 0){
      foreach (pq(‘.caixacampoazul’) as $tr) {
      $dados[$t] = array(
      ‘cliente’=> trim(pq($tr)->find(‘.resposta:contains(“Cliente: “) + .respostadestaque:eq(0)’)->html()),
      ‘endereco’=> trim(pq($tr)->find(‘.resposta:contains(“Endereço: “) + .respostadestaque:eq(0)’)->html()),
      ‘logradouro’ => trim(pq($tr)->find(‘.resposta:contains(“Logradouro: “) + .respostadestaque:eq(0)’)->html()),
      ‘bairro’ => trim(pq($tr)->find(‘.resposta:contains(“Bairro: “) + .respostadestaque:eq(0)’)->html()),
      ‘cidade/uf’ => trim(pq($tr)->find(‘.resposta:contains(“Localidade / UF: “) + .respostadestaque:eq(0)’)->html()),
      ‘cep’ => trim(pq($tr)->find(‘.resposta:contains(“CEP: “) + .respostadestaque:eq(0)’)->html())
      );
      echo ”;
      $dados[$t]['cidade/uf'] = explode(‘/’,$dados[$t]['cidade/uf']);
      $dados[$t]['cidade'] = trim($dados[$t]['cidade/uf'][0]);
      $dados[$t]['uf'] = trim($dados[$t]['cidade/uf'][1]);
      unset($dados[$t]['cidade/uf']);
      if($dados[$t]['endereco']){
      $dados[$t]['logradouro'] = $dados[$t]['endereco'];
      }
      unset($dados[$t]['endereco']);
      $t += 1;
      }
      }

      por isaaclopes Responder
      1. Então o site dos correios na versão mobile traz 10 resultados por página, na primeira página eu pego todos os ceps tranquilamente, aí eu crio outra requisição colocando os parâmetros ‘metodo’=>’Proximo’ e ‘numPagina’=>1 para pegar os 10 ceps da segunda página e assim por diante não retorna nada só duas linhas “null”. A minha dúvida é se alguém conseguiu. Se não vou ficar sempre com os 10 primeiros resultados.

        por Anderson Amann —
      2. Desconsiderem a versão mobile e usem a versão desktop. Há muitas incompatibilidades

        por Felipe Roberto
  52. Pode ser, mas o problema é que as informações da versão desktop são cortadas, ficando difícil de conseguir com exatidão bairros e endereços extensos.

    por Anderson Amann — Responder
    1. Vix, então a situação fica complicada, já que a versão mobile também omite alguns dados complementares ( veja nos comentários ).

      por Felipe Roberto Responder
  53. Felipe, parabéns pelo projeto!

    Estou com problemas, o retorno está vindo sempre vazio!
    http://www.tkmarinho.com/get_end.php?cep=31170170

    fiz o teste para ver o html q está vindo na class correio e vem o formulário mobile

    alguma luz?

    abs

    por Thiago Responder
    1. Recomendo usar a versão desktop. É a que uso atualmente.

      por Felipe Roberto Responder
  54. Look: http://www.wscep.com

    por Joe — Responder
  55. Legal o uso do Web services, mas é interessante as vezes manter a própria base de cep para evitar indisponibilidade, uso a do http://www.qualocep.com e é confiável. No próprio site tem busca cep

    por Rodrigo — Responder
  56. Parabéns cara, está me ajudando muito no meu trabalho HEHEH’

    por Lucas Barbosa Antonelli — Responder
  57. oi boa tarde!

    estou tentando utilizar, porem deu um erro na linha 12 – $ch = curl_init($url[0].”?”.http_build_query($get));

    Fico no aguardo.

    por Alex — Responder
    1. Se o erro foi que a função não existe, significa que você vai precisar instalar ou habilitar o modulo CURL no seu servidor. Se o problema for relacionado a sintaxe, atualize seu código por este aqui. https://github.com/feliperoberto/correios-cep/blob/master/correios.php
      aproveita e atualiza também o phpquery.

      por Felipe Roberto Responder
      1. atualizei tudo, nao consigo enviar o cep pra ser pesquisado…

        por Alex —
  58. Pessoal,
    Outro webservice de consulta de CEP,
    http://viacep.com.br/
    Att.

    por Junior Silva — Responder
  59. O carregamento do seu Site é muito rápido no Internet Explorer.
    Excepcional Blog! Além disso seu artigo foi muito bem escrito!

    por Cinemas em Teresina Responder
  60. Muito bom o post Felipe, mas seguinte os scripts que estão no git tem possibilidade de fazer a consulta pelo endereço em vez do cep.

    Agradeço!

    Ta aqui outra dica tb: http://cep.correiocontrol.com.br/02011200.json

    por Paulo - Web Developer — Responder
    1. Sim, naquele código há duas funções (uma é apenas um atalho):

      cep($endereco)

      retorno uma lista de possíveis resultados para a busca (atualmente só 10, pois o correios usa o cookie para fazer a paginação, mas qlqr coisa tente implementar usando cookiejar).

      endereco($cep)

      retorna um único resultado referente ao cep informado.

      por Felipe Roberto Responder
  61. este site http://www.mapacep.com.br tem um sistema de busca cep ( webservice ) grátis, a consulta retorna o endereço completo com a latitude e longitude aproximada do endereço.

    por Paulo Sergio — Responder
  62. Seu código caiu do céu! Parabéns pelo seu esforço !

    por Gabriela Fernanda — Responder
  63. Muito obrigado pelo código, realmente me ajudou muito.

    Sou iniciante em programação e ainda fiquei com uma dúvida, como eu poderia colocar as informações dentro de ‘input’s’, para poder utilizar da mesma forma que os sites de cadastro fazem.

    Obrigado.

    por Caike Bispo — Responder
  64. Muito obrigado por ler, mas já resolvi o problema.

    por Caike Bispo — Responder
  65. Bom Dia, ao implementar o código acima, só consegui definir o campo cidade e estado usando:

    Cidade: <input type="text" value="”>
    Estado: <input type="text" value="”>

    Porém não consegui fazer o mesmo para definir logradouro e bairro, alguém poderia me ajudar nisso por favor?

    Desde já agradeço.

    por caikbispo — Responder
  66. webservice mapacep: http://www.mapacep.com.br/webservice.asp

    por Mapacep Responder
    1. Pessoal, vamos contribuir com o código, foco do projeto ao invés de tentar monetarizar o espaço de idéias. O título é: “Consulta de CEP diretamente ao site dos correios”

      por Danilo — Responder
  67. Parece que o pessoal do Correio fez alguma alteração ou bloqueou o acesso externo, não mais funciona.

    por Ronny Responder
    1. Opa Ronny, não dê um susto desse na gente não, rs.
      Acabei de testar e parece que ainda funciona.
      Testa aqui pra ver se vai: http://feliperoberto.com.br/api/correios/?cep=

      por Feli Responder
      1. Uaii Felipe, o meu tava funcionando normalmente e sem ninguem fazer nada do nada parou de funcionar…
        http://www2.ronnysantana.com.br/webservice/cep.php?cep=

        por Ronny
      2. Essa é a versão atualizada? A que esta no git?

        por Felipe Roberto
  68. Não estava, mais acabei fazendo um teste com o que ta no git e não dá nada, acho que pode ser algum problema no curl do servidor.

    por Ronny Responder
    1. Era problema no servidor mesmo, resolvi
      http://www2.ronnysantana.com.br/lab/cep.html

      Vlw pela dica, depois vou dá uma olhada melhor no que esta no git…

      por Ronny Responder
  69. Cara, estou com um problema bizarro e não faço ideia do que pode estar dando errado. O mesmo script fazendo uma consulta pelo mesmo CEP retorna completo, bonitinho na minha máquina. Porém, na máquina do cliente ele retorna apenas parte dos dados.

    Na minha máquina o retorno é: {“logradouro”:”Rua Pioneira Gabriella Fernandes Sallas Esteves”,”bairro”:”Jardim It\u00e1lia”,”cep”:”87060667″,”cidade”:”Maring\u00e1″,”uf”:”PR”}

    Na máquina do cliente o retorno é: {“logradouro”:”Rua Pioneira Gabriella Fernandes Sallas Esteves”,”bairro”:null,”cep”:”87060667″,”cidade”:null,”uf”:”PR”}

    Porque será que bairro e cidade retorna null no meu cliente?

    por Rics — Responder
    1. Verifique a encodação dos arquivos. Use sempre utf-8 no formato do arquivo e no cabeçalho html. Lembre-se de verificar também se esta devidamente convertido o código capturado via curl. Digamos que ele esteja em iso, então pode ser que haja conflito com o phpQuery ( acho que tem até um parâmetro para isso nele ). Mas lembre-se, estou sugerindo isso para ficar melhor trabalhar, mas não esqueça de verificar se seu projeto permite isso, pois é possível que ele já esteja todo em iso, então você tem q fazer o contrário, e então codificar para iso as resposta e arquivos novos.
      Enfim, verifique se ta tudo no mesmo padrão, independente de qual seja. Dos problemas bestas que já enfrentei esse foi o mais simples e que mais demorei pra aprender.
      Mas lembre-se, não estou afirmando que seja o seu, então boa sorte para que seja sim, se não, você aprendeu uma dica e continuou na estaca zero.
      … aproveita e fala com o Ronny ali em cima, pois ele também teve problema com mudança de servidor.

      por Felipe Roberto Responder
      1. O meu projeto está todo em UTF-8 mesmo, mas pode ser algo relacionado ao encode mesmo, porque tanto o bairro quanto a cidade tem acentuação!

        O servidor do cliente é linux também, e minha máquina é Windows… Acho que é algo por aí. Vou fazer alguns testes convertendo as coisas todas pra ver o que acontece.

        por Rics —
      2. Felipe, matou a charada!

        Tive que usar utf8_encode() nas strings de logradouro, bairro e cidade. Daí a string vinha toda zoada no meu computador (Windows), mas no computador do cliente (Linux) fica tudo lindo!

        Que droga isso! Sempre tomo todo o cuidado pra só usar utf8 em tudo e mesmo assim me escapa alguma coisa.

        por Rics —
  70. Agora precisa incluir a função frete no INDEX tb ;)

    por USerMax — Responder
  71. Pessoal, estou com um certo problema para resolver e procurando pelo assunto na net achei este post que não é exatamente o que preciso, mas pelo que li talvez vocês possam me ajudar. É o seguinte,
    estou criando um site onde, antes de mais nada, o usuário informe o seu CEP para eu saber se eu consigo ou não atender uma possível compra deste usuário, uma vez que o negócio terá serviço de logística próprio e inicialmente o raio de atendimento será limitado, pelo menos durante o período de validação da idéia. Então, trocando em miúdos, o que eu preciso:

    1. o usuário entra no site http://www.site.com;
    2. o site exibe um modal solicitando que o usuário informe o seu cep;
    3. a aplicação faz a consulta se o CEP informado está dentro do raio ou da lista de CEPs que a empresa já atende;
    4. SE o CEP estiver na lista de atendimento, é exibido a lista de produtos para compra;
    5. SE NÃO o sistema pede ao usuário que informe o seu e-mail para que posteriormente, quando a empresa disponibilizar a venda para a região daquele usuário, ele seja informado.

    Alguém tem alguma sugestão?

    Obrigado

    por Jefferson Responder
    1. Nesse caso, você vai ter que consultar os ceps atendidos em: http://www.buscacep.correios.com.br/servicos/dnec/menuAction.do?Metodo=menuFaixaCep
      e verifiar se o de seu cliente esta dentro desta faixa.

      por Felipe Roberto Responder
  72. Boa tarde Felipe, ótimo trabalho.
    No meu caso o codigo_rastreio não retorna nenhum resultado, fica em branco.
    O que sugere como solução?
    O cep funciona corretamente.
    Desde já obrigado

    por Danilo — Responder
  73. Não se se ajuda mas verificando no “inspecionar elemento” do Chorme, no caso do codigo_rastreio retorna o erro:
    500 Internal Server Error.

    por Danilo — Responder
    1. Sua versão do PHP pode estar desatualizada.

      por Pedro Rogério Responder
    2. Pois é, como o Pedro falou o problema pode estar na sua versão do php.
      Verifique no log do apache ou configure-o para exibir o erro na tela.
      Pois as vezes também pode ser alguma função que seu servidor não possui ou até mesmo um erro de sintaxe.

      por Felipe Roberto Responder
  74. Bom dia, obrigado pela rápida resposta.
    Caro Pedro, a versão do meu PHP no servidor é 5.3.3.
    Caro Felipe, após seguir sua orientação é exibido o seguinte erro:

    Warning: curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in …/httpdocs/gp/cep1/correios.class.php on line 160 Fatal error: Class ‘phpQuery’ not found in …/httpdocs/gp/cep1/correios.class.php on line 135

    Verificando nas configurações, o safe_mode está em off.
    Desde já, obrigado.

    por Danilo — Responder
  75. Lembrando que o erro ocorre apenas no: codigo_rastreio
    A função cep exibe o resultado corretamente.

    por Danilo — Responder
  76. Obrigado caros, consegui resolver o erro alterando a função “rastreio” do arquivo correios.class.php para:

    static public function rastreio($codigo){
    include(‘phpQuery-onefile.php’);
    $html = self::simpleCurl(‘http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI=’.$codigo);
    phpQuery::newDocumentHTML($html, $charset = ‘utf-8′);

    $rastreamento = array();
    $c = 0;
    foreach(pq(‘tr’) as $tr){$c++;
    if(count(pq($tr)->find(‘td’)) == 3 && $c > 1)
    $rastreamento[] = array(‘data’=>pq($tr)->find(‘td:eq(0)’)->text(),’local’=>pq($tr)->find(‘td:eq(1)’)->text(),’status’=>pq($tr)->find(‘td:eq(2)’)->text());
    }
    if(!count($rastreamento))
    return false;
    return $rastreamento;
    }

    A resposta estava nesse erro:
    Fatal error: Class ‘phpQuery’ not found in …/httpdocs/gp/cep1/correios.class.php on line 135

    Obrigado e mais uma vez, um ótimo trabalho, de certa maneira essa solução causa um pouco de desespero em quem ganha dinheiro vendendo webservice já que se torna uma solução mais interessante por ter resultado sempre atualizado.

    Um abraço e continuo acompanhando.

    por Danilo — Responder
  77. Bom dia Felipe, tenho duas dúvidas:
    Tem algum exemplo de como carrear o valor exibido em um textbox?
    A outra é como remover o “[" e "]” das laterais do resultado json?

    Ao invés de assim:
    [{"cliente":"","logradouro":"Rua 5 (P\u00f3lo de Modas)","bairro":"Guar\u00e1 II","cep":"71070512","cidade":"Bras\u00edlia","uf":"DF"}]

    Aparecer assim:
    {"cliente":"","logradouro":"Rua 5 (P\u00f3lo de Modas)","bairro":"Guar\u00e1 II","cep":"71070512","cidade":"Bras\u00edlia","uf":"DF"}

    Desde já obrigado

    por Danilo — Responder
  78. Imprima o indice 0 da variável php com esse resultado. Há no github uma função de atalho para esse recurso.
    Já a questão do textbox tem nesse comentário: http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/#comment-482672

    por Felipe Roberto Responder
  79. Testei tanto com curl quanto com file_get_contents (modificado para post) e ambos funcionaram perfeitamente. Fiz toda a busca dos dados no HTML no braço (tem como faze tanto com preg_match quanto com explode e strpos), pois creio que fica mais rápido e mais simples de customizar conforme a necessidade.

    por Walace — Responder
  80. Olá Felipe, parabéns pelo trabalho. estou com uma dúvida. Quando faço a consulta de determinados CEP’s, ele mostra como resultado o nome da rua e a faixa de numeração no mesmo campo (Ex.: Rua Bolívia – de 881/882 a 1643/1644 | para o CEP: 16072455). Como faço para exibir somente o nome do logradouro.

    Obrigado.

    por Cesar Rodrigues Responder
  81. Opa Cesar, nesse caso você vai precisar identificar o padrão utilizado pelos correios e conseguir quebrar o endereço. Não vai ter mágica, mas não vai ser algo tão complicado. Vai precisar apenas identificar o padrão, e certamente vai dar trabalho pois poderá haver mais de um e o maior obstáculo será identificar cep que apresentem esse tipo de irregularidade.
    Qnto a sua dica walace, é verdade, da maneira que sugere o código fica mesmo mais rápido e conciso, vai apenas perder a didática também proposta neste artigo. Se estiver com tempo sobrando, faça um pull request lá no git, já faz um tempo que quero fazer um refactory naquele código.

    por Felipe Roberto Responder
    1. Opa Felipe, muito obrigado pela informação. E você sabe onde posso buscar uma referência para iniciar este trabalho referente ao padrão do logradouro dos correios?

      Abraços,

      por Cesar Responder
      1. Cara, busca a respeito de expressão regular em php, mas analise o padrão e veja se não rola só um manipulação direta da string sem precisar das expressões. Se não me engano acaba sendo mais rápido o processamento.
        Dá uma olhada em w3schools.com/php

        por Felipe Roberto
  82. Felipe, obrigado pela aula! Mas estou tendo problemas para trazer os dados prenchidos no formulario html separadamente. Você faria a gentileza de postar um exemplo? Obrigado!

    por Jorge Rodrigues — Responder
    1. Pessoal, consegui montar! Mas estou com o mesmo problema de acentuação agora! Alguém conseguiu resolver? Obrigado!

      Segue o código que estou usando no html:

      $(document).ready(function() {
      $(“#input_cep”).change(function(event){
      $.get(
      “../cep.php”,
      { cep: $(“#input_cep”).val() },
      function(data) {
      //$(‘#result’).html(data);
      var str = data;
      var substr = str.split(‘,’);

      document.getElementById(“input_estado”).value = substr[1].replace(/”/g, “”);
      document.getElementById(“input_municipio”).value = substr[0].replace(/”/g, “”);
      document.getElementById(“input_endereco”).value = substr[2].replace(/”/g, “”);

      }
      );
      });
      });

      por Jorge Rodrigues — Responder
      1. Meus dados estão vindo assim:

        “S\u00e3o Paulo”

        por Jorge Rodrigues —
  83. Parceiro, tanto no site quanto pela aplicação eu não consigo resultado. Pelo site diz. “Tente novamente mais tarde.” e pela api, volta um array vazio…

    por Khwesten Heiner — Responder
  84. PESQUISEI UM CEP, DEU COMO NÃO ENCONTRADO, MAIS NA BUSCA DOS CORREIOS ENCONTROU. 49180000

    por RONNY Responder
    1. Qual o retorno json está recebendo? Deveria ser: {“cliente”:””,”logradouro”:””,”bairro”:””,”cep”:”49180000″,”cidade”:”Santo Amaro das Brotas”,”uf”:”SE”}

      Este cep possui apenas cidade e uf. Se a definição de existência for feita com base no logradouro o endereço será avaliado como inexistente.

      por Felipe Roberto Responder
  85. Olá, Felipe
    Excelente trabalho !!!

    Aonde eu consigo o código atualizado ?

    Fui no GitHub e o que está la e de Julho de 2013.

    por marcio souza — Responder
  86. Pois é, desde então não houve mais modificações. Duas recomendações são substituir a função eregi_replace pela preg_replace ( pois foi depreciada ) e ao invés de usar o curl fazer com um file_get_contents para simplificar.
    De qualquer maneira dentro de algumas semanas ou pouco mais pretendo dar uma atenção especial e fazer um refactory completo.
    Mas sinta-se a vontade para participar lá no Github e contribuir. Eu escrevi esse post para compartilhar de forma didática a solução de um problema muito comum e até então sem muitas soluções práticas, mas acabou tomando uma proporção bastante significativa.
    Hoje pelo que tenho acompanhado nos comentários seguimos de forma estável.
    Passamos por momentos frequentes de instabilidade no servidor dos correios o que afeta diretamente nossa aplicação. Outro problema que embora superado poderá reaparecer em novas formas é o fato da má estruturação dos dados no site dos correios em alguns casos comprometer a correta extração das informações.
    Enfim, mesmo estando há um bom tempo sem ser atualizado segue estável pois felizmente não houve mudanças no site em que os dados são consultados, mas por não ser oficial é importante mantermos sempre a atenção a fim de identificar possíveis novos problemas.
    Espero que também lhe seja útil!!!!

    por Felipe Roberto Responder
    1. Realmente tomou uma proporção legal, eu li todo o histórico do post e fiquei contente pela adesão e por você sempre dar a atenção devida, pois encontro muito material na net abandonado.
      Vou seguir as suas recomendações, mas já usei como está no github e funcionou mesmo sem ajuste algum.

      Grato pela atenção…

      por marcio souza — Responder
      1. Pois é, essas mudanças não são necessárias mesmo, apenas recomendações. O lance do eregi é mais crítico pois de repente caso num futuro o servidor seja atualizado para versões do php que já não deem mais suporte a função a aplicação irá travar. Então serve mesmo para ficar de alerta.

        por Felipe Roberto
      2. Estou tendo dois problemas, o retorno esta vindo em formato texto, não era pra vir um array ?

        e os acentos estão vindo fora de padrão !

        Tem alguma forma de ajustar isso ?

        por marcio souza —
      3. O problema de acento é codificação dos arquivos. Confira se estão todos no mesmo padrão (utf8 | iso-8859-1) e qndo necessário faça a conversão no script com utf8_encode/decode.
        O texto que se refere é um json? Pois a classe retorna um array mas o arquivo de teste faz a conversão para impressão, então você precisa saber se esta usando certo.
        Qlqr coisa me chama no hangout e compartilha tela contato@feliperoberto.com.br.

        por Felipe Roberto
  87. Mesmo no código do GITHUB sem mexer nada está assim, mostrando Tabo\u00e3o ao invés de Taboão.

    Verifiquei a codificação dos arquivos e estão todos em UTF-8.

    por marcio souza — Responder
    1. É que essa parte esta encodada. Pega essa string e faz um json_decode.

      por Felipe Roberto Responder
  88. Fiz isso mas mesmo assim não funciona, é estranho mesmo. Eu vi que outras pessoas relataram este problema, só que não postaram como resolveram.

    por marcio souza — Responder
  89. essa string foi impressa encodada, teste no seu web debugger:
    eval(‘({“logradouro”:”AC Sales\u00f3polis”,”bairro”:”Centro”,”cidade”:”Sales\u00f3polis”,”uf”:”SP”,”cep”:”08970-970″})’);
    e
    decodeURIComponent(‘Sales\u00f3polis’)

    acredito que esteja usando o arquivo index.php do git, certo? ele é responsável por nos fornecer um endpoint para nosso própria api rest.

    resumindo:
    die(json_encode(Correios::endereco($_GET['cep'])));

    decomponha a chamada para entender melhor

    die($param) // encerra execução do script imprimindo seu parametro
    http://php.net/manual/en/function.die.php

    json_encode($param) // converte o parametro para o correpondente em json
    http://php.net/manual/en/function.json-encode.php

    Correios::endereco($cep) // retorna um array com os campos do endereço array(‘logradouro’=>”,’cidade’=>”,…)
    https://github.com/feliperoberto/correios-cep/blob/master/correios.class.php#L130

    por Felipe Roberto Responder
  90. muito boa a sua explicação, resolvi mudando a seguinte linha do arquivo index.php :

    die(json_encode(Correios::cep($_GET['cep']),JSON_UNESCAPED_UNICODE));

    Grato, felipe !!!

    por marcio souza — Responder
  91. E ai Felipe, xará! já uso essa essa biblioteca a 2 anos, e do nada ela não está retornando mais as informações. Dei uma leve pesquisada mas não encontrei uma explicação.. sabe me dizer se algo mudou ? valeu
    Ta de parabéns.. ótima biblioteca!

    por Felipe — Responder
  92. Cara, nada mudou desde a última atualização na versão no git.
    Manda o cep aí pra eu ver se aqui vai funcionar também.

    por Felipe Roberto Responder
    1. 87005090
      mas o CEP é indiferente, qualquer CEP que eu busco, retorna em branco.

      por Felipe — Responder
      1. Pois é, saquei.
        Deve mesmo ser problema com sua versão ou servidor. Veja:
        {“logradouro”:”Rua Doutor Saulo Porto Virmond”,”bairro”:”Ch\u00e1cara Paulista”,”cidade”:”Maring\u00e1″,”uf”:”PR”,”cep”:”87005-090″}

        por Felipe Roberto
      2. em relação a versão do PHP, tem alguma diferença?
        estranho que não vai mesmo, nenhum cep. volta tudo em branco.

        por Felipe —
  93. em relação a versão, eu atualizei com a sua do git, e não deu em nada. vou pesquisar ver se tem alguma relação com a versão do meu php. por enquanto obrigado. se eu encontrar a solução posto aqui.

    por Felipe — Responder
    1. Cara, dá uma olhada se não é o eregi_replace. Pois ela está depreciada e deve ser substituida da versão do git ( para versões do php recente )

      por Felipe Roberto Responder
  94. Gostaria que o resultado da busca ficasse neste formato é possível?

    http://cep.republicavirtual.com.br/web_cep.php?formato=javascript&cep=07155000

    Obrigado.

    por Rafael — Responder
  95. Eu preciso adaptar este script abaixo para este webservice.

    O script atual funciona perfeitamente, fiz diversas modificações para tentar faze-lo funcionar, mas não obtive sucesso em nenhuma, então ou eu consigo deixar o resultado do webservice, igual ao do webservice que estou usando atualmente, ou eu altero o script para funcionar corretamente com o webservice.

    Poderia me ajudar?

    Vi que já postaram algo sobre este script mas não consegui fazer funcionar com base no que postou e o código que postaram estava incompleto.

    Segue o código:

    $(function(){
    $(‘input[name="postcode"]‘).blur(function(){
    var cep = $.trim($(‘input[name="postcode"]‘).val().replace(‘-‘, ”));

    $.getScript(“http://cep.republicavirtual.com.br/web_cep.php?formato=javascript&cep=”+cep, function(){
    if(resultadoCEP["resultado"] == “1”){
    $(‘input[name="address_1"]‘).val(unescape(resultadoCEP["tipo_logradouro"])+” “+unescape(resultadoCEP["logradouro"]));
    $(‘input[name="address_2"]‘).val(unescape(resultadoCEP["bairro"]));
    $(‘input[name="city"]‘).val(unescape(resultadoCEP["cidade"]));

    $(‘select[name="country_id"]‘).find(‘option[value="30"]‘).attr(‘selected’, true);
    $.post(‘index.php?route=account/register/estado_autocompletar&estado=’ + unescape(resultadoCEP['uf']), function(zone_id){
    $.ajax({
    url: ‘index.php?route=account/register/country&country_id=30′,
    dataType: ‘json’,
    beforeSend: function() {
    $(‘select[name=\'country_id\']‘).after(‘ ‘);
    },
    complete: function() {
    $(‘.wait’).remove();
    },
    success: function(json) {
    if (json['postcode_required'] == ‘1’) {
    $(‘#postcode-required’).show();
    } else {
    $(‘#postcode-required’).hide();
    }

    var html = ”;

    if (json['zone'] != ”) {
    for (i = 0; i < json['zone'].length; i++) {
    html += '’ + json['zone'][i]['name'] + ”;
    }
    } else {
    html += ”;
    }

    $(‘select[name=\'zone_id\']‘).html(html);
    }
    });
    });
    }
    });
    });
    });

    por Rafael — Responder
  96. Cara,

    Afinal, como se faz para o retorno de caracteres acentuados aparecerem da forma correta?

    Obrigado!

    por marcelo caser — Responder
  97. Se estiver usando apenas a classe php, o array virá em utf8. Então certifique-se que seu script também está em utf8, caso contrário basta converter.
    No caso do arquivo da api rest ( index.php ), ele vai imprimir um json, então basta fazer um eval no javascript e a conversão será automática.

    por Felipe Roberto Responder
  98. Felipe parabéns pela sua iniciativa e perceverância … Encontrei este site pesquisando por método de manipular html, quero fazer extração de dados de um outro Webservice. Porém li os posts e vi que se utilizam também de uma base de dados “local” de CEP, então lembrei que há um programa gratuito do governo Federal para automatizar as prefeituras quanto a expedição de alvarás de construção e sua base de dados (firebird) traz uma tabela de CEP (endereços). SISOBRAPREF >>

    http://www.receita.fazenda.gov.br/previdencia/SisCadObraModPref.htm

    traz também um link para atualização de CEP’s

    http://www.receita.fazenda.gov.br/publico/Previdencia/ConstrucaoCivil/atualizacep.exe

    Se servir como contribuição, para alguém, fica a dica.

    por Euclides — Responder
  99. Ola amigo, poderia dar um exemplo prático de uso?

    por Daniel Rodrigues — Responder
  100. Muito boa a iniciativa! PHPQuery ajuda muito nisso. Nunca imaginei essa possibilidade. Ajudou muito no meu problema.

    por Yury Barony de Oliveira Responder
  101. Achei um pouco complexo, mas funciona bem, até mesmo com ceps que não tem todas as informações!

    Só acho estranho que existam varias urls do Correios para fazer consultas, cada uma retornando os dados de uma forma diferente! afff!

    por André Krebs Responder
  102. Oi Felipe.

    Estou precisando relacionar a informação do CEP com o código IBGE do município ao qual ele pertence. Você sabe onde/como consigo fazer esse link?

    Eu já tenho a base de códigos IBGE dos 5565 municípios do Brasil e o meu desafio agora é linkar, por exemplo, o resultado do município da sua pesquisa com esta base.

    Abraços,

    Rafael.

    por Rafael Fanchini — Responder

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>