Introducción

Hace unos días Correos.es realizo cambios en la pagina de resultados del localizador de envíos, uno de los cambios mas importantes fue la retirara del XML que como vimos en el Post anterior [.NET][C#][POST] Localizador de enviós de Correos desde una aplicación .

Por ello hoy os quiero mostrar otra manera de poder extraer los datos, la fecha del evento y el evento. 

Todos los pasos a seguir son los mismo que anteriormente vimos, realizar una petición POST hacia la web https://aplicacionesweb.correos.es/localizadorenvios/2010_c1-LocalizadorE.asp, pasando el parámetro "numero" con el código de envio/acuse/etc , ahora ya no esta entre la información que devuelve el XML pero lo solucionamos extrayendo los datos de la tabla. 

undefined

 

undefined

Ejemplo de Tabla de eventos HTML

Como podéis ver nos devuelve un nodo Evento por cada uno de los eventos que ha tenido el paquete con bastante información.

<table id="Table2" border="0" cellpadding="1" cellspacing="1" width="100%">
<tbody>
<tr class="txtCabeceraTabla">
<td colspan="2" align="left" height="30">&nbsp;Número de envío:&nbsp;CODIGOSEGUIMIENTO</td>
</tr>
<tr class="txtCabeceraTabla">
<td>Fechas</td>
<td>Estados</td>
</tr>
<tr class="txtCabeceraTabla" align="center">
<td class="txtDescripcionTabla">05/02/2015</td>
<td class="txtContenidoTabla" align="left">
<span class="txtNormal" title="El envío ya se encuentra en la ...">
En proceso de entrega
</span>
</td>
</tr>
<tr class="txtCabeceraTabla" align="center">
<td class="txtDescripcionTabla">06/02/2015</td>
<td class="txtContenidoTabla" align="left">
<span class="txtNormal" title="El envío está en nuestra red postal.....">
En tránsito
</span>
</td>
</tr>
</tbody>
</table>

 

Parámetros o Argumentos

numero: Indicamos el localizador de envíos o el código del acuse si fuera una carta certificada.

 

Uso desde C#.NET

using System.Net;
using System.Text;
using System.Web;
using System.IO;
using System.Text.RegularExpressions;
//....
//....
//PASANDOLE UN CODIGO DE ENVIO/ACUSE NOS DEVUELVE LA LISTA DE LOS EVENTOS A TRAVES DE LA PAGINA DE CORREOS
//REALIZANDO UN PETICION HTTP POR POST
public void ConsultarEnCorreos(String Acuse)
{
	//ListBox
	listHistorial.Items.Clear();

	System.Net.WebRequest s = default(System.Net.WebRequest);
	UTF8Encoding enc = default(UTF8Encoding);
	string postdata = null;
	byte[] postdatabytes = null;
	s = System.Net.WebRequest.Create("https://aplicacionesweb.correos.es/localizadorenvios/track.asp");
	enc = new System.Text.UTF8Encoding();
	postdata = "numero=" + Acuse;
	//INSERTAMOS EL CODIGO DEL ACUSE/ENVIO
	postdatabytes = enc.GetBytes(postdata);
	s.Method = "POST";
	s.ContentType = "application/x-www-form-urlencoded";
	s.ContentLength = postdatabytes.Length;

	using (System.IO.Stream stream = s.GetRequestStream()){
		stream.Write(postdatabytes, 0, postdatabytes.Length);
	}
	System.Net.WebResponse result = null;
	try{
		//REALIZAMOS LA LLAMADO PASANDOLE EL PARAMETRO POR POST
		result = s.GetResponse();
	}catch (Exception ex){
		MessageBox.Show("Error al realizar la llamada a correos.");
	}

	//ALMACENAMOS LA RESPUESTA 
	System.IO.Stream dataStream = result.GetResponseStream();

	//Abrimos con un StreamReader para mayor facilidad
	System.IO.StreamReader reader = new System.IO.StreamReader(dataStream, System.Text.Encoding.Default, false);

	//Leemos el contenido
	string responseFromServer = reader.ReadToEnd();

	//CORTAMOS TODA LA RESPUESTA HTML POR LA CABECERA DE LA TABLA, ASÍ NOS QUEDARA EN Cadena[0] todo el html que esta antes de la tabla
	string[] Cadena = responseFromServer.Split(new string[] { "<table id=\"Table2\" border=\"0\" cellpadding=\"1\" cellspacing=\"1\" width=\"100%\">" }, StringSplitOptions.None);
	string XML = null;

	//RECONSTRUIMOS LA TABLA DE NUEVO
	XML = "<table id=\"Table2\" border=\"0\" cellpadding=\"1\" cellspacing=\"1\" width=\"100%\">";

	//AHORA CORTAMOS EL RESTO DEL HTML QUE NOS QUEDO POR EL FINAL DE LA TABLA </table>
	XML += Cadena[1].Split(new string[] { "</table>"}, StringSplitOptions.None)[0];

	//CERRAMOS LA TABLA
	XML += "</table>";

	//AHORA CON LA UNA EXPRESIÓN REGULAR BUSCAMOS TODAS LAS FILAS DE LA TABLA
	MatchCollection Rows = Regex.Matches(XML, "<tr[^>]*>(.*?)</tr>", RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnoreCase);

	//NOS RECORREMOS TODAS LAS FILAS
	foreach (Match Row in Rows){
		//AHORA CON OTRA EXPRESION REGULAR BUSCAMOS TODAS LAS COLUMNAS QUE TIENE LA FILA ACTUAL
		MatchCollection Celdas = Regex.Matches(Row.Value, "<td[^>]*>(.*?)</td>", RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnoreCase);

		//SI TIENE SOLO UNA COLUMNA ES LA CABECERA DONDE SALE EL CODIGO DEL AVISO
		if (Celdas.Count > 1){
			//DESCARTAMOS LA FILA DE CABECERAS
			if (Regex.Replace(Celdas[0].Value, "<[^>]*(>|$)", "").Trim() != "Fechas"){
				clsEvento Evento = new clsEvento();
				string DatoEvento = "";
				Evento.Fecha = Regex.Replace(Celdas[0].Value, "<[^>]*(>|$)", "").Trim();
				DatoEvento = "Fecha: " + Regex.Replace(Celdas[0].Value, "<[^>]*(>|$)", "").Trim();
				Evento.Evento = Regex.Replace(Celdas[1].Value, "<[^>]*(>|$)", "").Trim();
				DatoEvento += " Evento: " + Regex.Replace(Celdas[1].Value, "<[^>]*(>|$)", "").Trim();
				Eventos.Add(Evento);
				listHistorial.Items.Add(DatoEvento);
			}
		}
	}
	reader.Close();
	result.Close();
}

Llamada de Ejemplo

ConsultarEnCorreos("CÓDIGO DE ENVIÓ");