├── .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 |
--------------------------------------------------------------------------------