Trackear envíos de Correos en Perl

Hola,

Este fin de semana estuve trabajando en una cosita que igual os gusta. Estaba usando la página de Correos para consultar el estado de un envío que había realizado y pensé en hacerlo automático porque es un tostón copiar y pegar el código del envío en la web o meterlo directamente a mano.

Quería hacer una cosa sencillita con cURL pero empecé a pensar en nuevas funcionalidades y, en lugar de hacer un pequeño script en Bash acabé haciendo una cosita relativamente larga en Perl.

Lo voy a dar por terminado. Se trata de un script que tiene varias opciones de entrada, os muestro lo que muestra al hacer un –help y os cuento qué hace:

Automatic checker for correos.es shipping service. 
 
 Options: 
  --help, -h                                  show this help. 
  --update, -u                                update status file. 
  --open, -o                                  open status file in browser. 
  --changes, -c                               open changes file in browser. 
  --register, -r CODIGO1 [CODIGO2] [...]      register entered code.
  --delete, -d CODIGO1 [CODIGO2] [...]        delete codes from status file.

Como se entiende de lo que pongo, el programa crea un archivo de cambios y fijándose en ese archivo comprueba los envíos cuando se hace el –update. Luego lo explicaré mejor por qué, pero el archivo es un HTML así que el –open lo que hace es abrirlo en el navegador por defecto.

Si se quieren añadir más códigos al archivo, usar –register seguido de los códigos que se quieren añadir y para eliminarlos lo mismo pero usando –delete.

El –changes se utiliza para ver los cambios encontrados en el último –update. Estos cambios se guardan en un archivo diferente para que sean más fáciles de comprobar y el –changes simplemente abre ese archivo (como –open, pero con el archivo de cambios). Imaginad que sólo cambia de estado un envío y tenemos 100 códigos, sólo con un archivo nos costaría encontrar cuales han cambiado. Por eso añadí esa funcionalidad.

Antes de entrar en el código, os animo a que lo ojeéis, lo pondría directamente aquí pero son 250 líneas y se va de madre el tema, además es muy ancho y no se ve nada:

https://gist.github.com/ekaitz-zarraga/78ef7ea707e06cf80a3d

Bueno, pues el código es bastante cerdo, para qué nos vamos a engañar (es Perl y lo pedía a gritos). Se basa en cURL intentando hacer las cosas sin tratar demasiado los datos. A la hora de comprobar el estado de los envíos, básicamente, descarga el sitio y limita los tags HTML a los de la tabla que muestra el estado del envío. Esa tabla se guarda directamente en un archivo llamado envios.html en la carpeta home/Documents, si tenéis el sistema en otro idioma o lo queréis en otro sitio podéis editar las variables globales que definen el path a los archivos.

A la hora de comparar el estado que tenemos guardado con el que miramos en la web en primer lugar va tabla por tabla del archivo, coge el código del envío con la ayuda del módulo HTML::TableExtract y pide el estado del código a la web. La comparación es supersimple, se comprueba que la tabla que teníamos guardada y la que hemos recibido y tratado son iguales y si la recibida desde la web es más larga (para evitar temas de “servicio no disponible”). Con eso listo, guardamos el estado nuevo en un array y los volcamos todos al terminar. Si hubiese cambiado de estado alguno de los envíos, volcaríamos esos estados al archivo envios.changes y gracias a notify-send (de la librería libnotify-bin en mi Kubuntu 15.04) avisaríamos al usuario mandándole una notificación al escritorio. Para la notificación antes usaba un kdialog pero no me deja la notificación marcada, sólo hace el popup y luego desaparece, así que cambié de idea.

A la hora de registrar códigos, hacemos una consulta a la web y añadimos el contenido al archivo. Al final es muy sencillo casi todo.

Podría reducir bastante el código, por ejemplo haciendo rutinas de lectura y escritura de los archivos y alguna cosa más he visto que podía haber hecho mejor (una muy evidente es la forma en la que comparo los estados, podría hacerlo mirando el contenido de las tablas bien hecho). De todas formas, creo que no merece la pena, funciona y no es un tema crítico.

Me lo he pasado bien y he aprendido cosas así que… me doy por realizado.

A parte de esto, no podía añadir en cron que actualizase el estado de los envíos porque cron tiene un entorno diferente y no puede tener interfaz gráfica, así que hice un “minicron” para ejecutar este script, este sí os lo pongo porque es muy cortito:

#!/bin/bash

while [ 1 ]; do
    /usr/local/bin/correos -u &
    sleep 3600;
done

Este script lo arranco al iniciar el sistema, y así me va comprobando el sólo el estado de los envíos y notificándomelo.

En general todo esto se integra bastante bien con mi forma de trabajar porque, cada vez más, uso el Krunner para lanzar las cosas y así puedo abrir el archivo del estado de los envíos directamente en el navegador (que siempre está abierto) cuando el programa me avise de que hay cambios.

Y eso es un poco todo lo que tenía para contar. Podría hablaros sobre las regexp, como leer archivos en Perl, usar señales (también aprendí, aunque no lo he usado) pero me reservo todo eso para futuras entradas cortitas para la sección de scripts o para responder las preguntas y comentarios que me hagáis.

Me despido entonces con esto.

Un abrazo, espero que os guste y os sea útil.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s