├── .gitignore ├── src └── Cagartner │ └── CorreiosConsulta │ ├── Facade.php │ ├── ServiceProvider.php │ ├── Curl.php │ └── CorreiosConsulta.php ├── phpunit.xml ├── composer.json ├── test └── index.php ├── tests └── CorreiosTest.php ├── composer.lock └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependências 2 | /vendor/ 3 | 4 | # IDE 5 | /.idea/ -------------------------------------------------------------------------------- /src/Cagartner/CorreiosConsulta/Facade.php: -------------------------------------------------------------------------------- 1 | app->singleton('correios_consulta', function(){ 15 | return new \Cagartner\CorreiosConsulta\CorreiosConsulta; 16 | }); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 | ./tests/ 16 | 17 | 18 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cagartner/correios-consulta", 3 | "description": "Package para pesquisa de serviços de busca por cep, calculo de frete e etc, diretamente nos serviços dos Correios.", 4 | "keywords": ["cep","brazil","laravel","frete"], 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "Carlos A. Gartner", 9 | "email": "contato@carlosgartner.com.br" 10 | } 11 | ], 12 | "require": { 13 | "php": ">=7.3.0", 14 | "cagartner/phpquery": "0.9.13" 15 | }, 16 | "autoload": { 17 | "psr-0": { 18 | "Cagartner\\CorreiosConsulta": "src/" 19 | } 20 | }, 21 | "minimum-stability": "dev", 22 | "extra": { 23 | "laravel": { 24 | "providers": [ 25 | "Cagartner\\CorreiosConsulta\\ServiceProvider" 26 | ], 27 | "aliases": { 28 | "Correios": "Cagartner\\CorreiosConsulta\\Facade" 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /test/index.php: -------------------------------------------------------------------------------- 1 | CEP: 89062086"; 10 | echo "
";
11 | print_r($consulta->cep('89062086'));
12 | echo "
"; 13 | echo "
"; 14 | 15 | echo "

Rastrear: OK254268175BR

"; 16 | echo "
";
17 | print_r($consulta->rastrear('OK254268175BR'));
18 | echo "
"; 19 | echo "
"; 20 | 21 | echo "

FRETE:

"; 22 | 23 | $dados = [ 24 | 'tipo' => 'sedex', // opções: `sedex`, `sedex_a_cobrar`, `sedex_10`, `sedex_hoje`, `pac` 25 | 'formato' => 'caixa', // opções: `caixa`, `rolo`, `envelope` 26 | 'cep_destino' => '89062086', // Obrigatório 27 | 'cep_origem' => '89062080', // Obrigatorio 28 | //'empresa' => '', // Código da empresa junto aos correios, não obrigatório. 29 | //'senha' => '', // Senha da empresa junto aos correios, não obrigatório. 30 | 'peso' => '1', // Peso em kilos 31 | 'comprimento' => '16', // Em centímetros 32 | 'altura' => '11', // Em centímetros 33 | 'largura' => '11', // Em centímetros 34 | 'diametro' => '0', // Em centímetros, no caso de rolo 35 | // 'mao_propria' => '1', // Não obrigatórios 36 | // 'valor_declarado' => '1', // Não obrigatórios 37 | // 'aviso_recebimento' => '1', // Não obrigatórios 38 | ]; 39 | 40 | echo "
";
41 | print_r($consulta->frete($dados));
42 | echo "
"; 43 | echo "
"; 44 | exit; -------------------------------------------------------------------------------- /src/Cagartner/CorreiosConsulta/Curl.php: -------------------------------------------------------------------------------- 1 | 0) 16 | curl_setopt($conn, CURLOPT_POSTFIELDS, json_encode($parameters)); 17 | else 18 | curl_setopt($conn, CURLOPT_POSTFIELDS, null); 19 | 20 | $data = null; 21 | $response = curl_exec($conn); 22 | 23 | if ($response !== false) { 24 | $data = json_decode($response, true); 25 | if (!$data) { 26 | $data = array('error' => $response, "code" => curl_getinfo($conn, CURLINFO_HTTP_CODE)); 27 | } 28 | } 29 | 30 | curl_close($conn); 31 | 32 | if(isset($data['error'])) 33 | { 34 | throw new \Exception($data['error']); 35 | } 36 | 37 | if(empty($data)) 38 | { 39 | throw new \Exception("curl Could not reach the server: $path"); 40 | } 41 | 42 | return $data; 43 | } 44 | 45 | /** 46 | * Adicionado classe de consulta simples de acordo com a classe originária: 47 | * @link https://github.com/feliperoberto/correios-cep/blob/master/correios.class.php 48 | * 49 | * @param string $url $url da busca 50 | * @param array $post Dados via POST 51 | * @param array $get Dados via GET 52 | * @return string 53 | */ 54 | public function simple($url, $post=array(), $get=array()) 55 | { 56 | $url = explode('?', $url, 2); 57 | 58 | if(count($url)===2){ 59 | $temp_get = array(); 60 | parse_str($url[1], $temp_get); 61 | $get = array_merge($get, $temp_get); 62 | } 63 | 64 | //die($url[0]."?".http_build_query($get)); 65 | $ch = curl_init($url[0]."?".http_build_query($get)); 66 | 67 | curl_setopt ($ch, CURLOPT_POST, 1); 68 | curl_setopt ($ch, CURLOPT_POSTFIELDS, http_build_query($post)); 69 | curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 70 | curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true); 71 | 72 | $response = curl_exec ($ch); 73 | 74 | curl_close($ch); 75 | 76 | return $response; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /tests/CorreiosTest.php: -------------------------------------------------------------------------------- 1 | cep('01001-000'); 15 | 16 | $this->assertTrue($dados['logradouro'] === 'Praça da Sé - lado ímpar'); 17 | $this->assertTrue($dados['bairro'] === 'Sé'); 18 | $this->assertTrue($dados['cidade'] === 'São Paulo'); 19 | $this->assertTrue($dados['uf'] === 'SP'); 20 | } 21 | 22 | /** 23 | * @test 24 | */ 25 | public function testValidShipmentTracking() 26 | { 27 | $correios = new CorreiosConsulta(); 28 | $dados = $correios->rastrear('PO683612101BR'); 29 | if (is_array($dados) && count($dados) > 0) { 30 | $entrada = array_pop($dados); 31 | 32 | $this->assertTrue($entrada['status'] === 'Objeto postado'); 33 | } else { 34 | // se count($dados) === 0, o teste precisa fazer pelo menos um assert, senão dá erro no phpunit 35 | $this->assertTrue(1 === 1); 36 | } 37 | } 38 | 39 | /** 40 | * @test 41 | */ 42 | public function testValidShipmentCost() 43 | { 44 | $dados = [ 45 | 'tipo' => 'sedex', // Separar opções por vírgula (,) caso queira consultar mais de um (1) serviço. > Opções: `sedex`, `sedex_a_cobrar`, `sedex_10`, `sedex_hoje`, `pac`, 'pac_contrato', 'sedex_contrato' , 'esedex' 46 | 'formato' => 'caixa', // opções: `caixa`, `rolo`, `envelope` 47 | 'cep_destino' => '89062086', // Obrigatório 48 | 'cep_origem' => '89062080', // Obrigatorio 49 | //'empresa' => '', // Código da empresa junto aos correios, não obrigatório. 50 | //'senha' => '', // Senha da empresa junto aos correios, não obrigatório. 51 | 'peso' => '1', // Peso em kilos 52 | 'comprimento' => '16', // Em centímetros 53 | 'altura' => '11', // Em centímetros 54 | 'largura' => '11', // Em centímetros 55 | 'diametro' => '0', // Em centímetros, no caso de rolo 56 | // 'mao_propria' => '1', // Não obrigatórios 57 | // 'valor_declarado' => '1', // Não obrigatórios 58 | // 'aviso_recebimento' => '1', // Não obrigatórios 59 | ]; 60 | 61 | $correios = new CorreiosConsulta(); 62 | 63 | $resultados = $correios->frete($dados); 64 | 65 | $this->assertTrue(is_float($resultados['valor'])); 66 | } 67 | } -------------------------------------------------------------------------------- /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": "efeb5660259d48d739ff6bf4af0cc6dd", 8 | "packages": [ 9 | { 10 | "name": "cagartner/phpquery", 11 | "version": "0.9.12", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/cagartner/phpquery.git", 15 | "reference": "3538fd97dca363c852eea0a9c9e76decd7de40f7" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/cagartner/phpquery/zipball/3538fd97dca363c852eea0a9c9e76decd7de40f7", 20 | "reference": "3538fd97dca363c852eea0a9c9e76decd7de40f7", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.3.3", 25 | "sabberworm/php-css-parser": "8.3.*" 26 | }, 27 | "type": "library", 28 | "autoload": { 29 | "psr-4": { 30 | "PhpQuery\\": "src/" 31 | } 32 | }, 33 | "notification-url": "https://packagist.org/downloads/", 34 | "license": [ 35 | "MIT" 36 | ], 37 | "authors": [ 38 | { 39 | "name": "Tobiasz Cudnik", 40 | "email": "tobiasz.cudnik@gmail.com", 41 | "homepage": "https://github.com/TobiaszCudnik", 42 | "role": "Developer" 43 | }, 44 | { 45 | "name": "didier Belot", 46 | "role": "Packager" 47 | }, 48 | { 49 | "name": "Greg Payne", 50 | "role": "Packager" 51 | } 52 | ], 53 | "description": "PHP5.3+ namespaced version of phpQuery with enhanced CSS support", 54 | "homepage": "http://code.google.com/p/phpquery/", 55 | "time": "2020-09-14T12:22:26+00:00" 56 | }, 57 | { 58 | "name": "sabberworm/php-css-parser", 59 | "version": "8.3.1", 60 | "source": { 61 | "type": "git", 62 | "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", 63 | "reference": "d217848e1396ef962fb1997cf3e2421acba7f796" 64 | }, 65 | "dist": { 66 | "type": "zip", 67 | "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796", 68 | "reference": "d217848e1396ef962fb1997cf3e2421acba7f796", 69 | "shasum": "" 70 | }, 71 | "require": { 72 | "php": ">=5.3.2" 73 | }, 74 | "require-dev": { 75 | "codacy/coverage": "^1.4", 76 | "phpunit/phpunit": "~4.8" 77 | }, 78 | "type": "library", 79 | "autoload": { 80 | "psr-0": { 81 | "Sabberworm\\CSS": "lib/" 82 | } 83 | }, 84 | "notification-url": "https://packagist.org/downloads/", 85 | "license": [ 86 | "MIT" 87 | ], 88 | "authors": [ 89 | { 90 | "name": "Raphael Schweikert" 91 | } 92 | ], 93 | "description": "Parser for CSS Files written in PHP", 94 | "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser", 95 | "keywords": [ 96 | "css", 97 | "parser", 98 | "stylesheet" 99 | ], 100 | "time": "2020-06-01T09:10:00+00:00" 101 | } 102 | ], 103 | "packages-dev": [], 104 | "aliases": [], 105 | "minimum-stability": "dev", 106 | "stability-flags": [], 107 | "prefer-stable": false, 108 | "prefer-lowest": false, 109 | "platform": { 110 | "php": ">=7.3.0" 111 | }, 112 | "platform-dev": [] 113 | } 114 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CorreiosConsulta (Laravel 4/5 Package) 2 | 3 | ---------------------- 4 | Package para consulta de serviços diretamente no site dos correios, sem usar apis de terceiros. 5 | 6 | Baseado nos seguintes repositórios: 7 | - https://github.com/feliperoberto/correios-cep 8 | - https://github.com/Zizaco/cep-consult 9 | 10 | Requerimentos: 11 | - Soap Client 12 | 13 | Para linux: `sudo apt-get install php-soap` 14 | 15 | Consultas disponíveis: 16 | - CEP 17 | - Frete 18 | - Rastreio 19 | 20 | ### Instalação 21 | 22 | ## Para PHP 7.4 usar: 23 | "cagartner/correios-consulta": "0.3.*" 24 | 25 | ## Para PHP 7.3 + usar: 26 | "cagartner/correios-consulta": "0.2.*" 27 | 28 | ## Para PHP 7/5.x usar: 29 | 30 | In the `require` key of `composer.json` file add the following 31 | 32 | "cagartner/correios-consulta": "0.1.*" 33 | 34 | 35 | Run the Composer update comand 36 | 37 | $ composer update 38 | 39 | In your `config/app.php` add `'Cagartner\CorreiosConsulta\ServiceProvider'` to the end of the `$providers` array 40 | 41 | ```php 42 | 'providers' => [ 43 | 44 | 'Illuminate\Foundation\Providers\ArtisanServiceProvider', 45 | 'Illuminate\Auth\AuthServiceProvider', 46 | // ... 47 | 'Cagartner\CorreiosConsulta\ServiceProvider', 48 | 49 | ], 50 | ``` 51 | 52 | Then at the end of `config/app.php` add `'Correios' => 'Cagartner\CorreiosConsulta\Facade'` to the `$aliases` array 53 | 54 | ```php 55 | 'aliases' => [ 56 | 57 | 'App' => 'Illuminate\Support\Facades\App', 58 | 'Artisan' => 'Illuminate\Support\Facades\Artisan', 59 | // ... 60 | 'Correios' => 'Cagartner\CorreiosConsulta\Facade', 61 | 62 | ], 63 | ``` 64 | 65 | ### Utilização 66 | 67 | #### CEP: 68 | 69 | Passar apenas o valor do CEP, pode ser formatado, somente números e como string. 70 | 71 | ```php 72 | 80 | [logradouro] => Rua Lindolfo Kuhnen 81 | [bairro] => Itoupava Central 82 | [cep] => 89062086 83 | [cidade] => Blumenau 84 | [uf] => SC 85 | ) 86 | */ 87 | 88 | ``` 89 | 90 | #### Rastrear 91 | 92 | Passar o código de rastreio informado pelos Correios 93 | 94 | ```php 95 | Array 103 | ( 104 | [data] => 08/06/2015 14:47 105 | [local] => CDD CARAGUATATUBA - Caraguatatuba/SP 106 | [status] => Entrega Efetuada 107 | ) 108 | 109 | [1] => Array 110 | ( 111 | [data] => 08/06/2015 07:59 112 | [local] => Caraguatatuba/SP 113 | [status] => Saiu para entrega ao destinat�rio 114 | ) 115 | 116 | [2] => Array 117 | ( 118 | [data] => 03/06/2015 11:48 119 | [local] => CTE SAO JOSE DOS CAMPOS - Sao Jose Dos Campos/SP 120 | [status] => Encaminhado 121 | [encaminhado] => Em tr�nsito para CDD CARAGUATATUBA - Caraguatatuba/SP 122 | ) 123 | 124 | [3] => Array 125 | ( 126 | [data] => 02/06/2015 10:00 127 | [local] => AGF DOUTOR JOAO MENDES - Sao Paulo/SP 128 | [status] => Encaminhado 129 | [encaminhado] => Em tr�nsito para CTE VILA MARIA - Sao Paulo/SP 130 | ) 131 | 132 | [4] => Array 133 | ( 134 | [data] => 01/06/2015 14:56 135 | [local] => AGF DOUTOR JOAO MENDES - Sao Paulo/SP 136 | [status] => Postado 137 | ) 138 | 139 | ) 140 | */ 141 | 142 | ``` 143 | 144 | #### Cálculo de Frete: 145 | 146 | ```php 147 | 'sedex', // Separar opções por vírgula (,) caso queira consultar mais de um (1) serviço. > Opções: `sedex`, `sedex_a_cobrar`, `sedex_10`, `sedex_hoje`, `pac`, 'pac_contrato', 'sedex_contrato' , 'esedex' 150 | 'formato' => 'caixa', // opções: `caixa`, `rolo`, `envelope` 151 | 'cep_destino' => '89062086', // Obrigatório 152 | 'cep_origem' => '89062080', // Obrigatorio 153 | //'empresa' => '', // Código da empresa junto aos correios, não obrigatório. 154 | //'senha' => '', // Senha da empresa junto aos correios, não obrigatório. 155 | 'peso' => '1', // Peso em kilos 156 | 'comprimento' => '16', // Em centímetros 157 | 'altura' => '11', // Em centímetros 158 | 'largura' => '11', // Em centímetros 159 | 'diametro' => '0', // Em centímetros, no caso de rolo 160 | // 'mao_propria' => '1', // Náo obrigatórios 161 | // 'valor_declarado' => '1', // Náo obrigatórios 162 | // 'aviso_recebimento' => '1', // Náo obrigatórios 163 | ]; 164 | 165 | echo Correios::frete($dados); 166 | 167 | /* 168 | Retorno para uma única consulta: 169 | Array 170 | ( 171 | [codigo] => 40010 172 | [valor] => 14.9 173 | [prazo] => 1 174 | [mao_propria] => 0 175 | [aviso_recebimento] => 0 176 | [valor_declarado] => 0 177 | [entrega_domiciliar] => 1 178 | [entrega_sabado] => 1 179 | [erro] => Array 180 | ( 181 | [codigo] => 0 182 | [mensagem] => 183 | ) 184 | ) 185 | */ 186 | 187 | /* 188 | Retorno para várias consultas: 189 | Array 190 | ( 191 | 0 => Array 192 | ( 193 | [codigo] => 4510 194 | [valor] => 14.9 195 | [prazo] => 1 196 | [mao_propria] => 0 197 | [aviso_recebimento] => 0 198 | [valor_declarado] => 0 199 | [entrega_domiciliar] => 1 200 | [entrega_sabado] => 1 201 | [erro] => Array 202 | ( 203 | [codigo] => 0 204 | [mensagem] => 205 | ) 206 | ), 207 | 1 => Array 208 | ( 209 | [codigo] => 4014 210 | [valor] => 14.9 211 | [prazo] => 1 212 | [mao_propria] => 0 213 | [aviso_recebimento] => 0 214 | [valor_declarado] => 0 215 | [entrega_domiciliar] => 1 216 | [entrega_sabado] => 1 217 | [erro] => Array 218 | ( 219 | [codigo] => 0 220 | [mensagem] => 221 | ) 222 | ) 223 | ) 224 | */ 225 | 226 | ``` 227 | -------------------------------------------------------------------------------- /src/Cagartner/CorreiosConsulta/CorreiosConsulta.php: -------------------------------------------------------------------------------- 1 | '04014', 17 | 'sedex_a_cobrar' => '40045', 18 | 'sedex_10' => '40215', 19 | 'sedex_hoje' => '40290', 20 | 'pac' => '04510', 21 | 'pac_contrato' => '04669', 22 | 'sedex_contrato' => '04162', 23 | 'esedex' => '81019', 24 | ]; 25 | 26 | public static function getTipos() 27 | { 28 | return self::$tipos; 29 | } 30 | 31 | /** 32 | * Verifica se e uma solicitacao de varios $tipos 33 | * 34 | * @param $valor string 35 | * 36 | * @return boolean 37 | */ 38 | public static function getTipoIsArray($valor) 39 | { 40 | return count(explode(",", $valor)) > 1 ?: FALSE; 41 | } 42 | 43 | /** 44 | * @param $valor string 45 | * 46 | * @return string 47 | */ 48 | public static function getTipoIndex($valor) 49 | { 50 | return array_search($valor, self::getTipos()); 51 | } 52 | 53 | /** 54 | * Retorna todos os codigos em uma linha 55 | * 56 | * @param $valor string 57 | * 58 | * @return string 59 | */ 60 | public static function getTipoInline($valor) 61 | { 62 | $explode = explode(",", $valor); 63 | $tipos = []; 64 | 65 | foreach ($explode as $value) { 66 | $tipos[] = self::$tipos[$value]; 67 | } 68 | 69 | return $tipos; 70 | } 71 | 72 | /** 73 | * @param $dados 74 | * @param array $options 75 | * 76 | * @return array|mixed 77 | */ 78 | public function frete($data, $options = []) 79 | { 80 | $endpoint = self::FRETE_URL; 81 | $tipos = self::getTipoInline($data['tipo']); 82 | $return = []; 83 | 84 | $formatos = [ 85 | 'caixa' => 1, 86 | 'rolo' => 2, 87 | 'envelope' => 3, 88 | ]; 89 | 90 | foreach ($tipos as $tipo) { 91 | $dados = $data; 92 | $dados['formato'] = $formatos[$dados['formato']]; 93 | 94 | $dados['cep_destino'] = self::cleanPostcode($dados['cep_destino']); 95 | $dados['cep_origem'] = self::cleanPostcode($dados['cep_origem']); 96 | 97 | $params = [ 98 | 'nCdEmpresa' => (isset($dados['empresa']) ? $dados['empresa'] : ''), 99 | 'sDsSenha' => (isset($dados['senha']) ? $dados['senha'] : ''), 100 | 'nCdServico' => $tipo, 101 | 'sCepOrigem' => $dados['cep_origem'], 102 | 'sCepDestino' => $dados['cep_destino'], 103 | 'nVlPeso' => $dados['peso'], 104 | 'nCdFormato' => $dados['formato'], 105 | 'nVlComprimento' => $dados['comprimento'], 106 | 'nVlAltura' => $dados['altura'], 107 | 'nVlLargura' => $dados['largura'], 108 | 'nVlDiametro' => $dados['diametro'], 109 | 'sCdMaoPropria' => (isset($dados['mao_propria']) && $dados['mao_propria'] ? 'S' : 'N'), 110 | 'nVlValorDeclarado' => (isset($dados['valor_declarado']) ? $dados['valor_declarado'] : 0), 111 | 'sCdAvisoRecebimento' => (isset($dados['aviso_recebimento']) && $dados['aviso_recebimento'] ? 'S' : 'N'), 112 | 'sDtCalculo' => date('d/m/Y'), 113 | ]; 114 | $curl = new Curl(); 115 | if ($result = $curl->simple($endpoint, $params)) { 116 | $result = simplexml_load_string($result); 117 | $rates = []; 118 | $collect = (array)$result->Servicos; 119 | 120 | $rate = $collect['cServico']; 121 | 122 | $return[] = [ 123 | 'codigo' => (int)$rate->Codigo, 124 | 'tipo' => ucfirst(str_replace('_', '', self::getTipoIndex($rate->Codigo))), 125 | 'valor' => self::cleanMoney($rate->Valor), 126 | 'prazo' => self::cleanInteger($rate->PrazoEntrega), 127 | 'mao_propria' => self::cleanMoney($rate->ValorMaoPropria), 128 | 'aviso_recebimento' => self::cleanMoney($rate->ValorAvisoRecebimento), 129 | 'valor_declarado' => self::cleanMoney($rate->ValorValorDeclarado), 130 | 'entrega_domiciliar' => $rate->EntregaDomiciliar === 'S', 131 | 'entrega_sabado' => $rate->EntregaSabado === 'S', 132 | 'erro' => ['codigo' => (float)$rate->Erro, 'mensagem' => $rate->MsgErro], 133 | ]; 134 | 135 | } 136 | } 137 | 138 | 139 | return $return; 140 | } 141 | 142 | /** 143 | * @param $cep 144 | * 145 | * @return array 146 | * @throws \Exception 147 | */ 148 | public function cep($cep) 149 | { 150 | $data = [ 151 | 'relaxation' => $cep, 152 | 'tipoCEP' => 'ALL', 153 | 'semelhante' => 'N', 154 | ]; 155 | 156 | $curl = new Curl; 157 | 158 | $html = $curl->simple(self::CEP_URL, $data); 159 | 160 | phpQuery::newDocumentHTML($html, $charset = 'ISO-8859-1'); 161 | 162 | $pq_form = phpQuery::pq(''); 163 | $pesquisa = []; 164 | if (phpQuery::pq('.tmptabela')) { 165 | $linha = 0; 166 | foreach (phpQuery::pq('.tmptabela tr') as $pq_div) { 167 | if ($linha) { 168 | $itens = []; 169 | foreach (phpQuery::pq('td', $pq_div) as $pq_td) { 170 | $children = $pq_td->childNodes; 171 | $innerHTML = ''; 172 | foreach ($children as $child) { 173 | $innerHTML .= $child->ownerDocument->saveXML($child); 174 | } 175 | $texto = preg_replace("/&#?[a-z0-9]+;/i", "", $innerHTML); 176 | $itens[] = trim($texto); 177 | } 178 | $dados = []; 179 | $dados['logradouro'] = trim($itens[0]); 180 | $dados['bairro'] = trim($itens[1]); 181 | $dados['cidade/uf'] = trim($itens[2]); 182 | $dados['cep'] = trim($itens[3]); 183 | 184 | $dados['cidade/uf'] = explode('/', $dados['cidade/uf']); 185 | 186 | $dados['cidade'] = trim($dados['cidade/uf'][0]); 187 | 188 | $dados['uf'] = trim($dados['cidade/uf'][1]); 189 | 190 | unset($dados['cidade/uf']); 191 | 192 | $pesquisa = $dados; 193 | } 194 | 195 | $linha++; 196 | } 197 | } 198 | return $pesquisa; 199 | } 200 | 201 | /** 202 | * @param $codigo 203 | * 204 | * @return array|bool 205 | * @throws \Exception 206 | */ 207 | public function rastrear($codigo) 208 | { 209 | $curl = new Curl; 210 | 211 | $html = $curl->simple(self::RASTREIO_URL, [ 212 | "Objetos" => $codigo 213 | ]); 214 | 215 | phpQuery::newDocumentHTML($html, $charset = 'utf-8'); 216 | 217 | $rastreamento = []; 218 | $c = 0; 219 | 220 | foreach (phpQuery::pq('tr') as $tr) { 221 | $c++; 222 | if (count(phpQuery::pq($tr)->find('td')) == 2) { 223 | [$data, $hora, $local] = explode("
", phpQuery::pq($tr)->find('td:eq(0)')->html()); 224 | [$status, $encaminhado] = explode("
", phpQuery::pq($tr)->find('td:eq(1)')->html()); 225 | 226 | $rastreamento[] = array('data' => strip_tags(trim($data)) . " " . strip_tags(trim($hora)), 'local' => strip_tags(trim($local)), 'status' => strip_tags(trim($status))); 227 | 228 | if (trim($encaminhado)) { 229 | $rastreamento[count($rastreamento) - 1]['encaminhado'] = trim($encaminhado); 230 | } 231 | } 232 | } 233 | 234 | if (!count($rastreamento)) 235 | return FALSE; 236 | 237 | return $rastreamento; 238 | } 239 | 240 | /** 241 | * @param $postcode 242 | * 243 | * @return string|string[]|null 244 | */ 245 | protected static function cleanPostcode($postcode) 246 | { 247 | return preg_replace("/[^0-9]/", '', $postcode); 248 | } 249 | 250 | /** 251 | * @param $value 252 | * 253 | * @return float 254 | */ 255 | protected function cleanMoney($value) 256 | { 257 | return (float)str_replace(',', '.', str_replace('.', '', $value)); 258 | } 259 | 260 | /** 261 | * @param $value 262 | * 263 | * @return int 264 | */ 265 | protected function cleanInteger($value) 266 | { 267 | return (int)str_replace(',', '.', $value); 268 | } 269 | } 270 | --------------------------------------------------------------------------------