17 años en Internet

31 marzo 2011

Notificar por e-mail cuando un post ha sido borrado o modificado

- Sebas: Que sepas que voy a hacer un script para revisar cuando el post está publicado y cuando no. Cuando no lo esté me enviará un e-mail.
- Usuario: ¡HAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHA!

Bueno, pues aquí está el script. Su funcionamiento es sencillo, sólo requiere conocer la URL de la página que quieres monitorizar y un sistema linux con el cron y el mailx instalados. Este script básicamente se descarga la web que le indicas y compara si existen cambios con la última versión que se descargó de esa página. En caso de existir te manda un e-mail informativo, adjuntado la nueva página para que la puedas ojear. Diréis "coño, si para eso ya están los clientes RSS"... Bueno, la idea de este script es vigilar las páginas que quieras controlar y que sospeches que puedan ser borradas en el futuro.

 #!/bin/bash
 cd $HOME/Documentos
 wget $1 -O $2.new
 diff $2.new $2.old
 if [ $? -ne 0 ]
 then
        echo "Se detecta cambio"
        echo "Enviando e-mail"
        uuencode $2.new index.html | mailx -s "La pagina web ha cambiado $2" comandantecobra@gmail.com
        cp -f $2.new $2.old
        echo "e-mail enviado"
 fi
 rm $2.new
 cd -

Yo lo he llamado "centinela.sh", pero vosotros podéis llamarlo como queráis. Lo he guardado en /usr/bin/ para que el ejecutable sea fácilmente localizable en el path. Recordad que hay que darle permisos de ejecución (chmod +x). Para hacer que este script se ejecute de forma periódica, debéis editar vuestro cron ("crontab -e" en una shell) y añadir la siguiente línea:

0 * * * * centinela.sh http://www.elgeneralfailure.com/ miblog

(Siendo "miblog" un nombre identificativo y  "http://www.elgeneralfailure.com" la url que queréis controlar)

En este ejemplo, mi script revisará cada hora si hay cambios en la página principal de mi blog. No tiene por que ser una nueva entrada, puede ser un cambio en el contador de visitas o en el número de comentarios de la entrada... o bien el error 404 de "página no encontrada". En todo caso debe existir alguna diferencia con la página original para que se envíe el e-mail.



Si la página tiene contador de visitas el script siempre te detectará cambios, pero se puede modificar fácilmente para solucionarlo: Basta con añadir un "grep -B 10000 textovisitas $2.new > $2.new" después del wget, siendo textovisitas la cadena de texto por la que hay que empezar a ignorar los cambios. Por ejemplo, mi blog tiene bastante contenido dinámico: Enlaces a otros blogs, seguidores, Twitter... para que el script funcionara correctamente con mi blog habría que añadir la siguiente línea:
 #!/bin/bash
 cd $HOME/Documentos
 wget $1 -O $2.new
 grep -B 10000 ">Entradas antiguas</a>" $2.new > $2.new
 diff $2.new $2.old
 if [ $? -ne 0 ]
 then
        echo "Se detecta cambio"
        echo "Enviando e-mail"
        uuencode $2.new index.html | mailx -s "La pagina web ha cambiado $2" comandantecobra@gmail.com
        cp -f $2.new $2.old
        echo "e-mail enviado"
 fi
 rm $2.new
 cd -
De esta forma ignoraríamos todo el código html que hay en la barra de la derecha ;)

2 comentarios:

  1. Tambien se te actualizaria cuando alguien de tu lsita de links escrbia un post nuevo no? O si escribes algo en Twitter! xD

    Es una gran idea, pero es muy complicado que funcione al 100%, mil cosas minimas pueden cambiar y hacer saltar la función.

    Podrias por ejemplo contar las lineas de diferencia del diff para que no saltara tan facilmente, solo si el numero de cambios es apreciable.

    ResponderEliminar
  2. Jajaja, sí, cierto. Pero es cuestión de ir jugando con el grep (el que he puesto en rojo). A partir de esa línea de texto deja de comparar ;)

    ResponderEliminar

Si te ha gustado la entrada o consideras que algún dato es erróneo o símplemente deseas dar algún consejo, no dudes en dejar un comentario. Todo feedback es bienvenido siempre que sea respetuoso. También puedes contactarme vía Twitter @Hamster_ruso si lo consideras necesario.