Archive for the ‘ cURL ’ Category

cURL – Obtener datos con formularios en https y procesarlos.

Supongamos el siguiente escenario (real en mi caso):

Tenemos que obtener diariamente datos de una página web. Dicha página usa SSL para su protección y se pasan los parámetros de una búsqueda en un formulario mediante POST. A partir de estos parámetros se obtiene unos resultados de dicha búsqueda que es lo que queremos procesar en un fichero de texto posteriormente.

Realizar consultas con cURL a servicios que usan sistemas de autenticación es relativamente sencillo. Este proceso se complica si el sitio destino usa cookies para gestionar la seguridad.

Para llegar a la resolución de este problema hay que realizar la operación en dos pasos: en uno se generarán y obtendrán las cookies de la sesión, en otro se usarán estas cookies para generar la consulta.

1.- Obtener cookies.

Empleando la extensión de firefox tamper data (extensión muy recomendable si no se conoce) se captura el post que se realiza para conocer los parámetros que envía el formulario. Aquí se ve que se piden tres parámetros para la autenticación: store, user, pwd.

Con estos creamos el primer formulario que se enviará vía post al sitio. Los formularios post se codifican usando URL encoding y cada parámetro se separa con &. El fichero quedaría así:

authform:

store=tienda&user=miusuario&pwd=mipassword&Entrar=Aceptar

Ahora habrá que lanzar cURL para generar el acceso y capturar las cookies que genere el sitio. Esto se realiza de la siguiente forma:

curl -d @authform -H "Content-Type:application/x-www-form-urlencoded;charset=UTF-8" https://servidordestinoconSSL -c cookie.txt -vk1

El parámetro -v simplemente da más información. El parametro -k sirve para evitar problemas con la verificación de certificados y el -1 es para forzar el uso de SSL (era necesario en mi caso). cURL usa por defecto SSL3 (al menos en mi caso y en este momento).

Con esto hemos obtenido un fichero cookie.txt que contiene las cookies de sesión generadas y que nos servirán para las siguientes consultas.

2.- Realización de la búsqueda.

Volvemos a emplear tamper data para calcular los parámetros del formulario de búsqueda del servicio y replicamos el formulario como antes.

searchform:

FechaDesde=12%2F10%2F2012+00%3A00%3A00&Estado=0&Tipo=0&FechaHasta=13%2F10%2F2012+00%3A00%3A00&NumFilas=99&RefCompra=Pan=&CodAutorizacion=

Nótese que los parámetros vacíos también están en dicho fichero.

Ahora se manda dicho formulario con cURL enviando también las cookies de sesión:

curl -d @searchform -H "Content-Type:application/x-www-form-urlencoded;charset=UTF-8" https://servidordestinoconSSL -vk1 -b cookie.txt  -o salida.html

El parámetro -b es el fichero de cookies y el -o hace que la salida se guarde en un fichero para después realizar el parsing.

3.- Parsing y formato de los datos:

En mi caso, la salida es una tabla en formato HTML, así que este es el parsing particular que hice para obtener en un texto claro los datos de salida con una línea por fila de tabla. Se puede ver como se quitan los retornos de carro y las etiquetas de la tabla para dejar después las líneas separadas por un fin de línea.

cat salida.html |grep -E "TD>|TR>" |tail -n +6 |head -n -2 |tr -d '\r\n'|sed 's/<TR>//g'|sed 's/<\/TR>/\n/g'|sed 's/<TD>//g'|sed 's/<\/TD>/\ /g'|sed 's/<B>//g'|sed 's/<\/B>//g' > salidaparseada
Anuncios

Consumir un servicio web usando cURL

Se puede consumir servicios web usando cURL fácilmente de la siguiente manera:


curl -d @datos.xml -H "Content-Type: text/xml;charset=UTF-8;SOAPAction: urn:funcion_a_ejecutar" http://url_del_webservice

Donde datos.xml es un fichero xml en el que se pasan los parámetros necesarios para la operación:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ratoncio="http://url_del_webservice">
  <soapenv:Header/>
  <soapenv:Body>
    <ratoncio:funcion_a_ejecutar>
      <ratoncio:parametro1>valor1</ratoncio:parametro1>
      <ratoncio:parametro2>valor2</ratoncio:parametro2>
    </ratoncio:funcion_a_ejecutar>
  </soapenv:Body>
</soapenv:Envelope>