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...
4 comentários:
como inserir dentro de um outro elemento html da minha pagina?
Ola, como implementar isso no visual studio em um software offline sem ser uma pagina web ? A minha duvida e como configurar tabela para exibir as informacoes ?
Os Correios tem sim um webservice que retorna os dados em XML. Dê uma olhada nas especificações do SRO XML no blog dos Correios.
Muito bom, ajudou muito.. Estava precisando dessa informação. Obrigado.
Postar um comentário