05th fev 2009
Consulta livre em base de CEPs com PHP
Sempre foi uma guerra conseguir uma base dos CEPs do Brasil com os respectivos endereços; os Correios até hoje mantém a base deles fechada, só disponibilizam comercialmente.
O Almir lá do Poomax postou essa semana uma notícia sobre uma empresa que abriu a sua base de CEPs para consulta, via requisição HTTP, num serviço batizado de CEP Livre. O retorno pode ser em CSV ou XML. A base é totalmente aberta, todos podem usar – inclusive comercialmente – e os usuários podem alimentá-la com novos endereços, correções, etc…
Fui testar e funciona muito bem. Aproveitei e resolvi dar uma ajuda, criando um service em PHP que recebe um CEP no formato XXXXX-XXX, faz a requisição no servidor do CEP Livre e retorna os dados para serem tratados, como quiserem, no PHP.
Não vou entrar no detalhe da implementação – tem um exemplo de uso online e o código fonte para download está aqui. Conhecimentos mínimos de PHP são o suficiente para o uso da mesma
A classe que faz a requisição e todo tratamento do XML é a CEPLivreService (ver CEPLivreService.php). Use o método buscaEndereco(String CEP) – passe o CEP como String no formato XXXXX-XXX – e ele retornará um objeto CEP (ver o arquivo CEP.php, que faz o papel de um bean). Esse objeto tem, entre alguns métodos, os seguintes mais importantes:
- getStatus() – 1 para endereço associado ao CEP, 0 para nenhum endereço
- getTipoLogradouroDesc() - descrição do tipo de logradouro (rua, avenida, etc…)
- getLogradouro() – logradouro
- getBairro() – bairro
- getCidade() - cidade
- getUf() – unidade da Federação (por extenso)
- getUfSigla() – unidade da Federação (sigla, por exemplo SP)
- getCep() – o próprio CEP
Exemplo de uso (faça download para um completo):
<?php
require(“CEPLivreService.php”);
$service = new CEPLivreService();
$address = $service->buscaEndereco(“06766-000″);
echo $address->getTipoLogradouroDesc() . ” ” . $address->getLogradouro();
?>
Sintam-se a vontade para alterar, modificar, corrigir!

Parabéns pela Classe Chris!
Almir Neto
http://www.poomax.com.br
Pessoal da República Virtual tem webservice para consulta de CEPs (dentre outros).
Não conhecia esse, Tárcio! Valeu pela dica
Seu trabalho, junto com a iniciativa do pessoal da (PC)² , pouparam-me um bocado de tempo e me permitiram implementar um recurso pra lá de útil no sistema da empresa. Obrigado, de coração!
Que bacana, Sergio! Bom que ajudou!
Em breve vou fazer um post sobre como utilizar esse sistema com a biblioteca para integrar PHP com ajax que fiz! Ficou bacana!
[]s!
Muito legal mesmo esta classe. Não cheguei a olhar todos os detalhes….mas não vi como retornar o CEP passando uma parte do nome do logradouro. Esta função está sendo feita ou tá pronta e eu não vi?
Valeu
Olá Alex! Obrigado pelo elogio!
Não existe uma busca de CEP pelo logradouro; a API fornecida pela PC2 apenas disponibiliza busca de logradouros por CEP.
Se a mesma disponbilizar essa consulta, eu a implemento nessa classe e disponibilizo!
[]s!
[...] 5th, 2009 Resolvi juntar duas bibliotecas que fiz (e estão disponibilizadas no site): a de consulta de endereço por CEP e a JS Calls PHP (interação entre javascript e PHP) para criar uma consulta de endereços [...]
Chris, nao sei se vc já notou ou corrigiu isso, mas a passagem dos parâmetros “estado” e “estado_sigla” está invertida quando você cria uma instância da classe CEP, no arquivo CEPLivreService.php (aqui, tá nas linhas 59 e 60). Só trocar uma linha pela outra e pronto, resorvido!
Abraço!
Sérgio, não tinha notado isso, não! Valeu, vou arrumar!
Pessoal, boa noite. eu estou com uma planilha em excel para analisar os cadastros da minha empresa. Existe alguma maneira de eu inserir um código no excel pra fazer a consulta e alimentar minha planilha, para que eu possa comparar os endereços ? São 1800 linhas de cadastro, fica lento fazer um por um.
Obrigado
@Christian (xará?!?!) uma forma é você criar uma macro que faça a consulta a esse serviço… pelo que vejo, existem várias opções de implementação, mas não vejo uma forma simples.
É xará….acabei pegando um arquivo de ceps em mdb e exportei proexcel, depois fiz uns procvs e resolvi a parada….só não sei qão atualizado está esse arquivo, mas já ajudou bastante….
Obrigado,
Christian
Fala Xará, beleza ? baixei seus fontes e testei elo modelo online; nenhum dos dois está funcionando….sabe o motivo ?
Obrigado,
Christian
Estranho, Christian, pois re-testei aqui – inclusive é o mesmo que http://www.chrisb.com.br/exemplos/basecep/form.html – e está funcionando corretamente para os CEPs que consultei.
Você digitou no formato certo? (XXXXX-XXX)
Oi Chris
Depois de uma atualização no host onde hospedo o site da empresa, seu código para consulta de CEP parou de funcionar. Habilitei a exibição de erros e acabei descobrindo que eles desabilitaram no php.ini as opções allow_url_fopen e allow_url_include. Abri um chamado de suporte no webhost, mas ainda nao tive resposta.
Pode ser que seja o caso do amigo acima, então, será que tem alguma maneira rápida de contornar essa restrição (um bom POG pra sua coleção, quem sabe) ?
Um abraço!
Sergio, muito estranho terem desabilitado o allow_url_fopen… dei uma procurada rápida no Google, e vi uma página de muitas pessoas com esse problema
http://www.bigresource.com/PHP-ISP-turned-allow_url_fopen-off-i7T6BLUB.html
Vou dar uma olhada com calma em como poderia mudar isso, mas a princípio é uma coisa que o servidor não deveria bloquear…
Obrigado!
Cara, na verdade todos os ceps que estou tentando validar não constam na base. Tentei um cep manjado e funcionou.
Obrigado,
Christian
Chris,
Parabéns por sua iniciativa por disponibilizar o código fonte.
É uma grande contribuição a esse projeto que acredito assim como muitos que o CEP deva ser acessível a todos.
Edson, quanto mais gente disponibilizar o código fonte dos seus projetos e afins, mais a comunidade open source vai crescer e mais projetos maduros teremos! Obrigado!
[]s!
O arquivo *.ZIP com os fontes sumiu?
Renato, parece que o servidor está bloqueando arquivos .zip… vou entrar em contato com o meu serviço de hospedagem e ver o que aconytece.
Por enquanto, dá para baixar por aqui http://www.chrisb.com.br/cep/cep.zip.bkp, dpeois é só tirar o .bkp do final
Obrigado por avisar!
Cris,
Muito bom, esta funcionando legal. agora fui usar esse cep 54800-000 e ele não encontrou. qual o procedimento para cadastra esse novo CEP