Status Correios
Meu amigo precisava de uma ajuda para recuperar os status que o Correios gera para as encomendas.
Lembrei que havia feito isso na última empresa que trabalhei e agora resolvi compartilhar.
Não é 100% garantido, pois eu leio via REGEX o source da página ok?
Após recuperar o source HTML da página do Correios via cURL ou file_get_contents, utilizo a seguinte função para tratar o conteúdo e retornar um array contendo os dados do Correios.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php /** * Retorna todos os status do Correios para ID enviado * * @param string $id_correios ID do Correios * @return array $array_retorno */ function status_correios( $id_correios ) { $conteudo = file_get_contents('http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI='.$id_correios); if ( empty($conteudo) ) return false; $array_retorno = array(); preg_match_all( '/<tr>\s*<td[^>]*>(.*)<\/td>\s*<\/tr>/' , $conteudo , $array_regex ); if ( !is_array($array_regex) || count($array_regex) <= 0 ) return false; foreach ( $array_regex[ 1 ] as $key => $linha ) { $foo = explode( '</td><td>' , $linha ); if ( strip_tags( $foo[ 2 ] ) ) { $array_retorno[] = array( strip_tags( $foo[ 0 ] ), strip_tags( $foo[ 1 ] ), strip_tags( $foo[ 2 ] ) ); } } return $array_retorno; } ?> |
ps.: tentei colocar o código fonte completo aqui mas foi humanamente impossível.
Utilizei esse método pois tratava o array com os dados e armazenava em um banco de dados. Caso queria apenas exibir o João Vagner me mostrou esse link.
Dúvidas? Só enviar um email ou perguntar nos comentários.
about 3 years ago
Na verdade o correios tem um problema que esse server fica caindo, então cuidado, o certo seria ter um api segundario próprio com todos os calculos.
Abraços
about 3 years ago
Concordo.
Mas para pegar os status, deixamos o script rodando na cron e se já pegou o status ‘Entrege’ ele não consultava mais….
No caso era necessário o status ‘Entrege’ e quando foi….só!
about 2 years ago
Mto interessante essa sua função de grande utilidade!
Aconte um problema quando existe alguma linha da tabela que é dividida em outra duas sublinhas (um rowspan). Isso acontece quando tem alguma informação adicional naquela mesma data, como
“Em trânsito para CTE/SEI BELO HORIZONTE – BELO HORIZONTE/MG”
Seu script acaba perdendo essa informação (dentro da variável $foo). Fiz algumas alterações tratando a variável $foo, de forma que quando acontece esse caso, essa informação adicional (segunda linha dentro do rowspan), a mesma assume a mesma data da linha superior e conta como um novo registro $foo e no array de retorno.
Vc pode testar usando o código “teste” no site dos correios. Ele traz todos os casos possíveis de retorno.
http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI=teste
O código alterado:
function status_correios( $id_correios ) {
$conteudo = file_get_contents(‘http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI=’.$id_correios);
if ( empty($conteudo) ) return false;
$array_retorno = array();
preg_match_all( ‘/\s*]*>(.*)\s*/’ , $conteudo , $array_regex );
if ( !is_array($array_regex) || count($array_regex) $linha ) {
$foo = explode( ” , $linha );
if ($foo[0] && $foo[1] == “”) { //uma linha na tabela que esta em rowspan: mantem data anterior
$foo[1] = $foo[0]; //joga pra [1]
$foo[0] = $foo0_antigo;
$foo0_antigo = “”;
}
else { //uma linha comum (sem rowspan)
$foo0_antigo = $foo[0]; //salva valor em temporario
}
//retirar codigos HTML em todos os campos
$array_retorno[] = array( strip_tags( $foo[ 0 ] ), strip_tags( $foo[ 1 ] ), strip_tags( $foo[ 2 ] ) );
}
return $array_retorno;
}
about 2 years ago
Outro comentário.
Nem todo servidor deixa acessar páginas externar via file_get_contents. Nesse caso uso o curl. Por isso fiz uma função (get_url) que funcionará em ambos, basta usá-la. Espero ter colaborado!
Código:
function get_url($url) {
if ($f = @fopen($url, ‘r’)) {
$url_content = ”;
while (!feof($f)) {
$url_content .= fgets($f, 4096);
}
fclose($f);
$url_content = stripslashes($url_content);
}
else
//se o servidor esta em safe-mode (requer curl)
{
$ch = curl_init();
$timeout = 3; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$url_content = curl_exec($ch);
curl_close($ch);
$url_content = stripslashes($url_content);
}
if ( (strpos($url_content,”Not Found”)) ||
(strpos($url_content,”Página não encontrada”)) ||
(strpos($url_content,”404 Not Found”)) ) {
return FALSE;
}
else {
return $url_content;
}
}
about 2 years ago
Opa!
Valeu pelo feedback e as alterações, no meu caso eu tinha acesso a file_get_contents e só precisa ver se foi entregue.
Mas assim está bem mais completo mesmo.
Abraços