I made the basic example for you to understand the logic of two ways , Track do HTML
and Objetos
in array
for database storage, and the hash for comparing it in DB!
<?php
class Tracking {
public $track;
public $table;
public $erro = false;
public $erroMsg = false;
/**
* Construtor
*
* @param string $track Código da encomenda
* return void
*/
public function setTrack($track=false){
if ( strlen($track) !== 13) {
$this->erro = true;
$this->erroMsg = 'Código de encomenda Inválido!';
}
$this->track = $track;
}
public function trackHTML()
{
if( $this->erro === true ):
return $this->erro;
else:
$url = 'http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI=' . $this->track;
$html = utf8_encode( file_get_contents( $url ) );
if (strpos($html, "src=../correios/") !==false) {
$html = str_replace('src=../correios/',
'src=http://websro.correios.com.br/correios/', $html );
}
preg_match( '/<table border cellpadding=1 hspace=10>.*<\/TABLE>/s', $html, $table );
// hash para monitoramento de alteração de status
$this->hash = md5($html);
return ( count( $table ) == 1 ) ? $table[0] : "Objeto não encontrado";
endif;
}
public function trackObject(){
$html = utf8_encode( file_get_contents('http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI=' . $this->track ));
// Verifica se o objeto ainda não foi postado, caso seja o caso, retorna erro e mensagem
if (strstr($html, '<table') === false){
$this->erro = true;
$this->erroMsg = 'Objeto ainda não foi adicionado no sistema';
return;
}
// hash para monitoramento de alteração de status
$this->hash = md5($html);
// Limpa o codigo html
$html = preg_replace("@\r|\t|\n| +@", ' ', $html);
$html = str_replace('</tr>', "</tr>\n", $html);
// Pega as linhas com o rastreamento
if (preg_match_all('@<tr>(.*)</tr>@', $html, $mat,PREG_SET_ORDER)){
$track = array();
$mat = array_reverse($mat);
$temp = null;
// Formata as linhas e gera um vetor
foreach($mat as $item){
if (preg_match("@<td rowspan=[12]>(.*)</td><td>(.*)</td><td><FONT COLOR=\"[0-9A-F]{6}\">(.*)</font></td>@", $item[0], $d)){
// Cria uma linha de track
$tmp = array(
'date' => $d[1],
'DateSql' => preg_replace('@([0-9]{2})/([0-9]{2})/([0-9]{4}) ([0-9]{2}):([0-9]{2})@', '$3-$2-$1 $4:$5:00',$d[1] ),
'local' => $d[2],
'action' => strtolower($d[3]),
'details' => ''
);
// Se tiver um encaminhamento armazenado
if ($temp){
$tmp['details'] = $temp;
$temp = null;
}
// Adiciona o item na lista de rastreamento
$track[] = (object)$tmp;
}else if (preg_match("@<td colspan=2>(.*)</td>@", $item[0], $d)){
// Se for um encaminhamento, armazena para o proximo item
$temp = $d[1];
}
$this->status = $tmp['action'];
}
$this->track = $track;
return $this->track;
}
// Caso retorne um html desconhecido ou falhe, retorna erro de comunicação
$this->erro = true;
$this->erroMsg = 'Falha de Comunicação com os correios';
}
}
Instantiating the class
$track = new Tracking();
$track->setTrack('PI205094504BR');
if($track->erro !== true){
echo $track->trackHTML();
echo '<br />';
echo 'Hash para monitoramento de alteração de status: ';
echo $track->hash;
} else {
echo $track->erroMsg;
}
In this example the result is this:
In the second example, returns the data in array
if($track->erro !== true){
echo '<pre>';
print_r( $track->trackObject() );
echo '</pre>';
echo '<br />';
echo 'Hash para monitoramento de alteração de status: ';
echo $track->hash;
} else {
echo $track->erroMsg;
}
Output:
Array
(
[0] => stdClass Object
(
[date] => 20/07/2015 14:04
[DateSql] => 2015-07-20 14:04:00
[local] => CTCE VITORIA/GCCAP - Viana/ES
[action] => postado
[details] =>
)
[1] => stdClass Object
(
[date] => 20/07/2015 22:00
[DateSql] => 2015-07-20 22:00:00
[local] => CTCE VITORIA/GCCAP - Viana/ES
[action] => encaminhado
[details] => Encaminhado para CTE BENFICA - Rio De Janeiro/RJ
)
[2] => stdClass Object
(
[date] => 21/07/2015 16:55
[DateSql] => 2015-07-21 16:55:00
[local] => CTE BENFICA - Rio De Janeiro/RJ
[action] => encaminhado
[details] => Encaminhado para CTCE CUIABA - Varzea Grande/MT
)
[3] => stdClass Object
(
[date] => 24/07/2015 15:35
[DateSql] => 2015-07-24 15:35:00
[local] => CTCE CUIABA - Varzea Grande/MT
[action] => encaminhado
[details] => Em trânsito para AC DIAMANTINO - Diamantino/MT
)
[4] => stdClass Object
(
[date] => 28/07/2015 09:48
[DateSql] => 2015-07-28 09:48:00
[local] => Diamantino/MT
[action] => saiu para entrega ao destinat��rio
[details] =>
)
[5] => stdClass Object
(
[date] => 28/07/2015 16:59
[DateSql] => 2015-07-28 16:59:00
[local] => AC DIAMANTINO - Diamantino/MT
[action] => entrega efetuada
[details] =>
)
)
Hash para monitoramento de alteração de status: ccebc8ce6343aea4692500bae90a49d3
In this example I used file_get_contents
, but I usually use cURL