Surveiller le changement d'une page web avec un script bash

Aujourd’hui je vais vous parler d’un script très pratique.

Les scripts en informatique c’est génial, j’adore ça, ça permet d’automatiser un tas de choses qui simplifient la vie !

Celui que je vous propose de regarder aujourd’hui a été développé par un copain Matthieu suite à un échange à ce sujet entre nous :-)

L’idée est la suivante, beaucoup de site aujourd’hui permettent de suivre leurs mises à jour à travers un flux RSS mais pas tous.

A travers un script bash et le système Unix cron (exécution de tâches automatisées), le script va télécharger une URL, enregistrer temporairement le contenu, calculer et enregistrer son hash, et vérifier si celui-ci a changé depuis la dernière exécution.

Si le hash est identique ou si c’est la première exécution, le script ne fait rien, sinon si la page a changé il envoie un mail à l’utilisateur pour le prévenir que la page surveillée a changé.

L’avertissement peut être également l’envoie d’un SMS, le post sur un compte twitter etc..

Pour l’anecdote, c’est en utilisant ce script avec un envoi de SMS que j’ai réussi à être averti de l’ouverture de la billetterie de SSTIC cette année et de pouvoir acheter une place avant qu’elles soient toutes vendues :)

Le script fonctionne avec un fichier « checkurl.list » qui contient une entrée par ligne.

Il convient de l’adapter suivant l’OS que vous utilisez et les outils disponibles (mailx, curl, sha1sum, etc…) dans votre environnement.

#!/bin/sh
#----------------------------------------------------------------------------
# ~/.bin/checkurl.sh
#
# author: matthieu berjon <matthieu.berjon@wavefield.fr>
# modified: 18 apr 2014
# by: Benoit Meunier <benoit@systemd.info> (OpenBSD compatibility)
#
# description: this script check from a defined url list if the content has
# changed.
#
# checkurl.list must containt something like this:
#
# Phrack http://www.phrack.org/
#----------------------------------------------------------------------------
 
EMAIL=benoit+url@systemd.info
DIR=`dirname $0`
URLDIR=$DIR/tmp
URLFILE=$DIR/checkurl.list
 
[ ! -d $URLDIR ] && mkdir -p $URLDIR
 
while read URL
do
  # name and url recovering
  WEBSITENAME=$(echo $URL | awk '{print $1}')
  WEBSITEURL=$(echo $URL | awk '{print $2}')
 
  # if the file already exists
  if [ -f $URLDIR/$WEBSITENAME ]; then
    # latest version download
    curl -sk $WEBSITEURL > $URLDIR/$WEBSITENAME.part
    sha256 -q $URLDIR/$WEBSITENAME.part > $URLDIR/$WEBSITENAME.part.sha1
 
    # sum comparison
    SUM=$(cat $URLDIR/$WEBSITENAME.sha1 | awk '{print $1}')
    SUMPART=$(cat $URLDIR/$WEBSITENAME.part.sha1 | awk '{print $1}')
    if [ "$SUM" != "$SUMPART" ]; then
      echo "Page changed $WEBSITENAME $WEBSITEURL"
      # if different, mail to the contact
      echo "Page updated: $WEBSITENAME $WEBSITEURL" | mutt -s "Page changed" $EMAIL
      # files updating
      mv $URLDIR/$WEBSITENAME.part $URLDIR/$WEBSITENAME
      mv $URLDIR/$WEBSITENAME.part.sha1 $URLDIR/$WEBSITENAME.sha1
    fi
  else
    curl -sk $WEBSITEURL > $URLDIR/$WEBSITENAME   # we get the file
    sha256 -q $URLDIR/$WEBSITENAME > $URLDIR/$WEBSITENAME.sha1   # sum computation
  fi
done < $URLFILE

A bientôt !

La dernière version du script est disponible ici : https://systemd.info/code/scripts/tree/checkurl/detect.sh

Edit: http://thp.io/2008/urlwatch/ semble faire la même chose