Archivo para 22 octubre 2012

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

wr – script para consultar términos en inglés en Wordreference


#!/bin/sh
# buscador múltiple de word reference
# introducir wr seguido de los terminos a buscar en inglés

echo RESULTADOS DE BUSQUEDA DE:
echo $1
vartratada=`echo $1|sed 's/\ /_/g'`
echo  ++++++++++++++++++++++++++++++++++++++++++++
echo  WORD REFERENCE: $1
echo  ++++++++++++++++++++++++++++++++++++++++++++"\n"
wget http://wordreference.com/es/translation.asp\?tranword=$1\&dict=enes\&B10=Search -U mozilla -q -O /tmp/wordref$vartratada
html2text -utf8 -o /tmp/wordref$vartratada.txt /tmp/wordref$vartratada
cat /tmp/wordref$vartratada.txt|tail -n +20|head -n 20
rm /tmp/wordref$vartratada /tmp/wordref$vartratada.txt

rae – script para consultar términos en el diccionario de la RAE

#!/bin/bash
# buscador del diccionario de la RAE

TEMP=$RANDOM
echo "RESULTADOS DE BUSQUEDA DE: $1"
vartratada=`echo $1|sed 's/\ /_/g'|sed 's/á/\%e1/g'|sed 's/é/\%e9/g'|sed 's/í/\%ed/g'|sed 's/ó/\%f3/g'|sed 's/ú/\%fa/g'|sed 's/Á/\%c1/g'|sed 's/É/\%c9/g'|sed 's/Í/\%cd/g'|sed 's/Ó/\%d3/g'|sed 's/Ú/\%da/g'|sed 's/ñ/\%f1/g'|sed 's/Ñ/\%d1/g'`
echo  ++++++++++++++++++++++++++++++++++++++++++++
echo  Diccionario RAE: $1
echo  ++++++++++++++++++++++++++++++++++++++++++++
# antigua URL
#        wget buscon.rae.es/draeI/SrvltGUIBusUsual\?LEMA=$1\&origen=RAE\&TIPO_BUS=3 -q -U mozilla -O /tmp/rae$vartratada
wget lema.rae.es/drae/srv/search\?type=3\&val=$vartratada\&origen=RAE -q -U mozilla -O /tmp/rae$TEMP
html2text -utf8 -o /tmp/rae$TEMP.txt /tmp/rae$TEMP
cat /tmp/rae$TEMP.txt|head -n 24
rm /tmp/rae$TEMP /tmp/rae$TEMP.txt