├── .gitignore ├── Procfile ├── docker-compose.yml ├── Dockerfile ├── composer.json ├── src └── Correios │ ├── CEP.php │ └── Rastreio.php ├── composer.lock ├── index.php └── README.markdown /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: $(composer config bin-dir)/heroku-php-apache2 / 2 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | api: 5 | image: 'feliperoberto/non-official-correios-api:latest' 6 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM composer as phpcomposer 2 | WORKDIR /app 3 | COPY composer.json composer.json 4 | RUN composer install --ignore-platform-reqs 5 | 6 | FROM php:7.2-apache 7 | COPY --from=phpcomposer /app/vendor /var/www/html/vendor 8 | COPY --from=phpcomposer /app/composer.json /var/www/html/composer.json 9 | COPY --from=phpcomposer /app/composer.lock /var/www/html/composer.lock 10 | COPY /src /var/www/html/src 11 | COPY index.php /var/www/html/index.php 12 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "feliperoberto/non-official-correios-api", 3 | "description": "Brazilian Correios's non-official API", 4 | "type": "library", 5 | "authors": [ 6 | { 7 | "name": "Felipe Roberto", 8 | "email": "contato@feliperoberto.com.br" 9 | } 10 | ], 11 | "minimum-stability": "stable", 12 | "support": { 13 | "issues": "https://github.com/feliperoberto/correios-cep/issues", 14 | "source": "https://github.com/feliperoberto/correios-cep" 15 | }, 16 | "require": { 17 | "electrolinux/phpquery": "^0.9.6" 18 | }, 19 | "autoload": { 20 | "psr-4" : { 21 | "Correios\\": "src/Correios" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Correios/CEP.php: -------------------------------------------------------------------------------- 1 | $endereco, 10 | 'tipoCEP' => 'ALL', 11 | 'semelhante' => 'N', 12 | ))); 13 | curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 14 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 15 | $html = curl_exec ($ch); 16 | 17 | \phpQuery::newDocumentHTML($html, $charset = 'utf-8'); 18 | $pesquisa = array(); 19 | foreach(pq('.tmptabela tr:not(:first-child)') as $pq_div){ 20 | $dados = array(); 21 | //$dados['cliente'] = trim(pq('.resposta:contains("Cliente: ") + .respostadestaque:eq(0)',$pq_div)->text()); 22 | 23 | $dados['logradouro'] = pq('td:nth-child(1)', $pq_div)->text(); 24 | $dados['bairro'] = pq('td:nth-child(2)', $pq_div)->text(); 25 | $dados['cidade/uf'] = pq('td:nth-child(3)', $pq_div)->text(); 26 | $dados['cep'] = pq('td:nth-child(4)', $pq_div)->text(); 27 | 28 | $dados['cidade/uf'] = explode('/',$dados['cidade/uf']); 29 | $dados['cidade'] = trim($dados['cidade/uf'][0]); 30 | 31 | $dados['uf'] = trim($dados['cidade/uf'][1]); 32 | unset($dados['cidade/uf']); 33 | $pesquisa[] = $dados; 34 | } 35 | return $pesquisa; 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/Correios/Rastreio.php: -------------------------------------------------------------------------------- 1 | $objecto 10 | ))); 11 | curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 12 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 13 | $html = curl_exec ($ch); 14 | 15 | \phpQuery::newDocumentHTML($html, $charset = 'utf-8'); 16 | 17 | $etapas = array(); 18 | foreach(pq('table.sro tr') as $tr){ 19 | $response = array(); 20 | $content = preg_replace('/\ {2,}/', ' ', preg_replace('/\t|\r|\n/', '', pq('td:nth-child(1)',$tr)->text())); 21 | preg_match_all('/([0-9]{2}\/[0-9]{2}\/[0-9]{4}) ([0-9]{2}:[0-9]{2}) (.*)\/(.*)/', $content, $response); 22 | $cidade = trim($response[3][0], " \t\n\r\0\x0B\xC2\xA0"); 23 | $uf = trim($response[4][0], " \t\n\r\0\x0B\xC2\xA0"); 24 | $data = date('Y-m-d H:i:s', strtotime(str_replace('/','-', $response[1][0]) . $response[2][0])); 25 | $status = pq('td:nth-child(2) strong', $tr)->text(); 26 | $mensagem = trim(preg_replace('/\t|\r|\n|\ {2,}/', '', pq('td:nth-child(2)', $tr)->text())); 27 | 28 | $etapas[] = array( 29 | 'data' => $data, 30 | 'uf'=> $uf, 31 | 'cidade'=> $cidade, 32 | 'status'=> $status, 33 | 'mensagem' => $mensagem 34 | ); 35 | } 36 | if(!count($etapas)) 37 | return null; 38 | return $etapas; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "ff1c35a81a8aff798b64019f9018fd44", 8 | "packages": [ 9 | { 10 | "name": "electrolinux/phpquery", 11 | "version": "0.9.6", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/electrolinux/phpquery.git", 15 | "reference": "6cb8afcfe8cd4ce45f2f8c27d561383037c27a3a" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/electrolinux/phpquery/zipball/6cb8afcfe8cd4ce45f2f8c27d561383037c27a3a", 20 | "reference": "6cb8afcfe8cd4ce45f2f8c27d561383037c27a3a", 21 | "shasum": "" 22 | }, 23 | "type": "library", 24 | "autoload": { 25 | "classmap": [ 26 | "phpQuery/" 27 | ] 28 | }, 29 | "notification-url": "https://packagist.org/downloads/", 30 | "license": [ 31 | "MIT" 32 | ], 33 | "authors": [ 34 | { 35 | "name": "Tobiasz Cudnik", 36 | "email": "tobiasz.cudnik@gmail.com", 37 | "homepage": "https://github.com/TobiaszCudnik", 38 | "role": "Developer" 39 | }, 40 | { 41 | "name": "didier Belot", 42 | "role": "Packager" 43 | } 44 | ], 45 | "description": "phpQuery is a server-side, chainable, CSS3 selector driven Document Object Model (DOM) API based on jQuery JavaScript Library", 46 | "homepage": "http://code.google.com/p/phpquery/", 47 | "time": "2013-03-21T12:39:33+00:00" 48 | } 49 | ], 50 | "packages-dev": [], 51 | "aliases": [], 52 | "minimum-stability": "dev", 53 | "stability-flags": [], 54 | "prefer-stable": false, 55 | "prefer-lowest": false, 56 | "platform": [], 57 | "platform-dev": [] 58 | } 59 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 |
19 | 20 | 21 | 22 |Servidor rest para web scrap desenvolvido em PHP para consulta de CEP, endereço e rastreamento de encomenda, direto no site dos Correios.
27 | 28 |Envia-se a string do CEP desejado e é retornado um objeto com as propriedades do endereço.
Caso não seja localizado, será retornado null.
curl -X GET http://127.0.0.1/?cep=0100100131 |
{
32 | "bairro": "S\u00e9\u00a0",
33 | "cep": "01001-001",
34 | "cidade": "S\u00e3o Paulo",
35 | "logradouro": "Pra\u00e7a da S\u00e9 - lado par\u00a0",
36 | "uf": "SP\u00a0"
37 | }
38 |
39 | Envia-se a string do endereço a ser procurado e será retornado uma lista de objetos de endereço.
Caso não há haja resultados, a resposta será uma lista vazia.
curl -X GET http://127.0.0.1/?endereco=av%20paulista42 |
[
43 | {
44 | "bairro": "Alvorada\u00a0",
45 | "cep": "45820-839",
46 | "cidade": "Eun\u00e1polis",
47 | "logradouro": "Avenida Paulista\u00a0",
48 | "uf": "BA\u00a0"
49 | },
50 | {
51 | "bairro": "Calabet\u00e3o\u00a0",
52 | "cep": "41227-025",
53 | "cidade": "Salvador",
54 | "logradouro": "Avenida Paulista\u00a0",
55 | "uf": "BA\u00a0"
56 | },
57 | ...,
58 | {
59 | "bairro": "Jardim Panorama\u00a0",
60 | "cep": "13504-654",
61 | "cidade": "Rio Claro",
62 | "logradouro": "Avenida Paulista - de 2500/2501 a 2998/2999\u00a0",
63 | "uf": "SP\u00a0"
64 | }
65 | ]
66 |
67 | curl -X GET http://127.0.0.1/?codigo_rastreio=OG490654336BR69 |
[
70 | {
71 | "cidade": "RIO DE JANEIRO",
72 | "data": "2019-03-01 01:57:00",
73 | "mensagem": "Objeto encaminhado de Unidade de Tratamento em RIO DE JANEIRO / RJ para Unidade de Distribui\u00e7\u00e3o em Rio De Janeiro / RJ",
74 | "status": "Objeto encaminhado",
75 | "uf": "RJ"
76 | },
77 | {
78 | "cidade": "RIO DE JANEIRO",
79 | "data": "2019-02-28 17:50:00",
80 | "mensagem": "Objeto encaminhado de Ag\u00eancia dos Correios em RIO DE JANEIRO / RJ para Unidade de Tratamento em RIO DE JANEIRO / RJ",
81 | "status": "Objeto encaminhado",
82 | "uf": "RJ"
83 | },
84 | {
85 | "cidade": "RIO DE JANEIRO",
86 | "data": "2019-02-28 17:15:00",
87 | "mensagem": "Objeto postado",
88 | "status": "Objeto postado",
89 | "uf": "RJ"
90 | }
91 | ]
92 |
93 |
94 |
95 |
--------------------------------------------------------------------------------
/README.markdown:
--------------------------------------------------------------------------------
1 | # API não oficial dos Correios
2 | Pacote de classes responsáveis por fazer coleta e tratamento de dados obtidos diretamente nos sites dos Correios.
3 | O consumo da api pode ser realizado diretamente em seu código PHP através de chamadas estáticas, ou via chamadas HTTP.
4 |
5 | ## Chamadas via PHP
6 | ``` php
7 | \Correios\CEP::buscar($cep);
8 | \Correios\Rastreio::localizar($codigo_rastreio);
9 | ```
10 | O pacote também esta dispovível no https://packagist.org/packages/feliperoberto/non-official-correios-api e pode ser instalado via php composer
11 | ``` console
12 | php composer.phar install feliperoberto/non-official-correios-api
13 | ```
14 |
15 | ### Exemplo de uso
16 | ``` php
17 |