Acompanhar rastreamento de pedido dos Correios com C#

Mais um artigo para quem trabalha com loja virtual... Essa funcionalidade é bem importante para visualizar o rastreamento de um determinado pedido. Ao invés de mandar apenas o link com o código para seu cliente, porque não enviar logo a tabela com os dados? Pois bem, é isso que iremos fazer! O código é bem simples, rápido e pode-se alterar para uma "infinidades" de formas afim de o colocar do jeito que deseja.

Abaixo temos um resumo do processo:

  1. Enviamos uma requisição GET com o número do rastreamento;
  2. Obtemos os dados de retorno (página completa);
  3. Capturamos apenas a tabela com os dados de rastreamento;
  4. 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:

Cabelinho disse...

como inserir dentro de um outro elemento html da minha pagina?

Unknown disse...

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 ?

Marcelo Alencar disse...

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.

Anônimo disse...

Muito bom, ajudou muito.. Estava precisando dessa informação. Obrigado.

Postar um comentário