NOTA

Esta forma ha dejado de funcionar ya que Correos ha modificado el código de la pagina de localización.

Si quieres ver la nueva forma mira el nuevo articulo [.NET][C#][POST] Revisión del Localizador de enviós de Correos V2

Introducción

Si alguna vez te has encontrado que necesitas saber el estado de los localizadores de envíos de paquetes o estados de acuse de Correos, te encontraras que no hay mas forma que usar la web Localizador Correos, no hay webservice ni API´s ni nada.

Para ello la solución viene por 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 ya que lo que hace es devolvernos entre otras cosas un XML con todos los datos de los "eventos" que va teniendo.

undefined

Ejemplo de XML

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

<Envio xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
- <Codigo>
  <CodigoEnvio>NA3167567575757</CodigoEnvio> 
  <CodigoInternoApp /> 
  </Codigo>
  <Duplicado>False</Duplicado> 
  <Producto>NA</Producto> 
  <CP>31002</CP> 
  <Provincia /> 
  <Pais /> 
  <NumGiro /> 
  <CodError>0</CodError> 
  <DesError>0</DesError> 
- <ListaEventos>
- <Evento>
  <Fecha>02/09/2014</Fecha> 
  <Hora>09:35:00</Hora> 
  <CodigoEventoApp>00</CodigoEventoApp> 
  <CodigoMotivoApp /> 
  <CodigoEvento>G-E-001</CodigoEvento> 
  <Evento>Entrada en Unidad</Evento> 
  <CodigoMotivo>LD01</CodigoMotivo> 
  <Motivo>Alta en Unidad de Reparto</Motivo> 
  <CodigoDespacho /> 
  <Unidad>PAMPLONA/IRUÑA UR 1</Unidad> 
  <Codired>3103596</Codired> 
  <Provincia>NAVARRA</Provincia> 
  <Pais>ESPAÑA</Pais> 
  <Link /> 
  <DescripcionLink /> 
  <DescripcionWeb>En proceso de entrega</DescripcionWeb> 
  <CodigoWeb>3</CodigoWeb> 
  </Evento>
- <Evento>
  <Fecha>04/09/2014</Fecha> 
  <Hora>13:12:00</Hora> 
  .....

 

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

Imports System.Net;
Imports System.Text;
Imports System.Web;
Imports System.IO;
//....
//....

 //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
private void ConsultarEnCorreos(String Acuse)
{
	listHistorial.Items.Clear();

	HttpWebRequest s = default(HttpWebRequest);
	UTF8Encoding enc = default(UTF8Encoding);
	string postdata = null;
	byte[] postdatabytes = null;
	s = HttpWebRequest.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 (stream == s.GetRequestStream()) {
		stream.Write(postdatabytes, 0, postdatabytes.Length);
	}
	System.Net.WebResponse result = null;
	try {
		result = s.GetResponse();
		//REALIZAMOS LA LLAMADO PASANDOLE EL PARAMETRO POR POST
	} catch (Exception ex) {
		Interaction.MsgBox("Error al realizar la llamada a correos.");
	}

	//ALMACENAMOS LA RESPUESTA 
	Stream dataStream = result.GetResponseStream();
	//Abrimos con un StreamReader para mayor facilidad
	StreamReader reader = new StreamReader(dataStream, System.Text.Encoding.Default, false);
	//Leemos el contenido
	string responseFromServer = reader.ReadToEnd();

	//AHORA VAMOS A "DESPEDAZAR" EL XML DE RESPUESTA CON LO QUE A NOSOTROS NOS INTERESA
	string[] Cadena = Strings.Split(responseFromServer, "<Envio xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"\">");

	//RECOSTRUIMOS EL XML
	string XML = null;
	XML = "<Envio xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"\">";
	XML += Strings.Split(Cadena[1], "</Envio>")[0];
	XML += "</Envio>";

	// Cerramos ya que no los necesitamos más
	reader.Close();
	result.Close();

	//LEEMOS EL XML
	System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
	try {
		doc.LoadXml(XML);
	} catch (Exception ex) {
		Interaction.MsgBox("Error al leer el XML.");
	}

	//RECORREMOS TODOS LOS NODOS "Evento" Y extraemos los datos que necesitemos
	System.Xml.XmlNodeList elemList = doc.GetElementsByTagName("Evento");
	int i = 0;
	for (i = 0; i <= elemList.Count - 1; i++) {
		System.Xml.XmlNodeList elemListHijos = elemList[i].ChildNodes;
		string DatoEvento = "";
		int j = 0;
		for (j = 0; j <= elemListHijos.Count - 1; j++) {
			if (elemListHijos[j].Name == "Fecha") {
				DatoEvento = "Fecha: " + elemListHijos[j].InnerText;
			} else if (elemListHijos[j].Name == "DescripcionWeb") {
				DatoEvento += " Evento: " + elemListHijos[j].InnerText;
			}
		}
		if (!string.IsNullOrEmpty(DatoEvento)) {
			listHistorial.Items.Add(DatoEvento);
		}
	}
}

Llamada de Ejemplo

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