Abaixo temos um resumo do processo:
- Enviamos uma requisição GET com o número do rastreamento;
- Obtemos os dados de retorno (página completa);
- Capturamos apenas a tabela com os dados de rastreamento;
- Exibimos na tela.
Para capturar a apenas a tabela com os dados, pode-se fazer de várias formas (Expressão Regular, etc), mas preferi usar um componente que captura nós de um documento HTML, o HtmlAgilityPack. Baixe ele e o coloque na referência de seu projeto (Bin). Agora é fácil - utilize o código abaixo:
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using HtmlAgilityPack;
protected void Page_Load(object sender, EventArgs e)
{
// Aplica campos de parâmetros
string codigo = "ES659170465BR";
string parametros = "?P_COD_UNI=" + codigo + "&P_LINGUA=001&P_TIPO=001";
// Cria o objeto de requisição
WebRequest requisicao = WebRequest.Create("http://websro.correios.com.br/sro_bin/txect01$.QueryList" + parametros);
// Realiza a requisição
HttpWebResponse retorno = (HttpWebResponse)requisicao.GetResponse();
// Lê o objeto e faz a atribuição à variável
StreamReader stream = new StreamReader(retorno.GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
string dados = stream.ReadToEnd();
// Transforma em um documento HTML - HtmlAgilityPack
HtmlDocument html = new HtmlDocument();
html.LoadHtml(dados);
// Captura apenas a tabela contendo os dados do envio
HtmlNode tabela = html.DocumentNode.SelectSingleNode("//table");
if (tabela != null)
{
// Nesse caso você pode capturar as colunas e linhas e trabalhar conforme desejar
// Apenas fiz o loop para remover a formatação inicial da tabela
string htmlTable = "<table>";
// Extrai as linhas da tabela
foreach (HtmlNode linha in tabela.SelectNodes("//tr"))
htmlTable += "<tr>" + linha.InnerHtml + "</tr>";
htmlTable += "</table>";
// Exibe a tabela de rastreamento
Response.Write("O horário não indica quando a situação ocorreu, mas sim quando os dados foram recebidos pelo sistema, exceto no caso do <b>SEDEX 10 e do SEDEX Hoje, </b>em que ele representa o horário real da entrega.<br><br>" + htmlTable);
}
else
Response.Write("O nosso sistema não possui dados sobre o objeto informado. Se o objeto foi postado recentemente, é natural que seus rastros não tenham ingressado no sistema, nesse caso, por favor, tente novamente mais tarde. Adicionalmente, verifique se o código digitado está correto: " + codigo);
// Finaliza objetos
stream.Close();
retorno.Close();
}
No caso peguei o HTML da tabela contendo os dados e exibi de vez na tela. Poderia tratá-la de várias formas e uma delas poderia ser transformando-a em um DataTable ou DataSet para alguma manipulação posterior. Veja nesse link aqui como fazer isso.
Os Correios não dispõe de Web-Service para esse tipo de consulta. Olhando na net, encontrei dois artigos: um de Manoel Campos e outro de Carlos Ferrari onde ambos dispõe de Web-Services (em PHP - mas pode ser consumido pelo ASP.NET) para esse tipo de consulta. Quem não quiser implementar e apenas consumir, podem usá-los que chega o mesmo objetivo.
Artigo bem fácil e rápido! Espero ter ajudado...


