Ich wollte Webseiten auf Veränderung überprüfen. Das kam dabei raus, ist für Einsatz als cron-skript gedacht. Bei Verbesserungen bitte eine Mail an mich, Danke!

#
# Dieses Skript holt sich URL und fakultativ eine maximalabweichung als Zahl
# aus seiner Konfigurationsdatei, vergleicht dabei den Unterschied zwischen der
# Webseite aus dem vorhergehenden und jetzigem Lauf. Es mailt eine kurze Übersichtsmail
# an den Administrator, sowie eine etwas ausführlichere Mail an eine weitere Emailadresse,
# wenn sich Änderungen an der Webseite ergeben haben.
#
# Autor: Lutz Willek lutz[punkt]willek[das affenzeichen]belug[punkt]de
# Version 0.1 vom 26.06.2007
#
# TODO:
# Der Dump und der Diff ist langsam, das koennte durch eine bessere Veriante,
# alternativ durch gleichzeitiges Abarbeiten beschleunigt werden.
# Bis ca. 100 Domains ist diese Version aber erst mal gut genug.
#
set -e
umask 077
# Variablenzuweisungen
URLLIST='/etc/webseitentester/urllist.txt'
WORKDIR='/tmp/webseitentester/'
MAIL='some.user@domain.com'
# Erzeuge Arbeitsverzeichnis
[ -d ${WORKDIR} ] || mkdir -p ${WORKDIR}
# loesche Dateien, die entstehen, wenn sich die Liste der URL's aendert
find ${WORKDIR} \! -type d -amin +720 -exec rm {} \;
# erzeugt bei Bedarf eine besser bearbeitbare Konfigurationsdatei,
# die dann spaeter im Skript verwendet wird
new_hash () {
  echo -n 'Konfigurationsdatei geaendert, generiere Hashwerte neu... '
  [ -f ${URLLIST}.db ] && rm ${URLLIST}.db
  [ -f ${URLLIST}.sha1 ] && rm ${URLLIST}.sha1
  cat ${URLLIST} |egrep -v '^#+|^$' | while read -a FOO ;
  do
    # wenn in der Konfigurationsdatei keine moeglichen aenderungen angegeben wurden,
    # dann nimm 0 an
    [ ${FOO[1]} -ge 0 ] 2>/dev/null || FOO[1]=0
    HASH=`printf ${FOO[0]} |sha1sum |awk ' { print $1 } '`
    echo ${HASH}        ${FOO[1]}       ${FOO[0]} >> ${URLLIST}.db
  done
  sha1sum ${URLLIST} > ${URLLIST}.sha1
  echo 'done.'
}
# nur wenn sich Daten in der Konfigurationsdatei geaendert haben:
# erzeuge die Konfigurationsdatei neu
sha1sum -c ${URLLIST}.sha1 &>/dev/null || new_hash
lynx_dump () {
  # der eigentliche Dump mit Lynx
  # Dieser Dump könnte irgendwie schoener gemacht werden,
  # diese Version hier kostet relativ viel Zeit
  lynx -dump -hiddenlinks=ignore ${FOO[2]}
}
some_stuff () {
  # Der Text fuer die Email
  cat <<EOF
Die Webseite ${FOO[2]} hat ${BAR} Aenderungen. Laut Konfiguration sind
jedoch nur max ${FOO[1]} Aenderungen erlaubt.
Ein Dump der Webseite findet sich in den beiden Dateien
${WORKDIR}${FOO[0]}
${WORKDIR}${FOO[0]}.old
Diese Dateien werden automatisch beim naechsten Lauf, jedoch spaetestens nach 12 Stunden geloescht.
EOF
}
# Hole die Daten aus ${URLLIST}.db
# Lese die Liste Zeilenweise ein
cat ${URLLIST}.db | while read -a FOO ;
do
  # nun eingelesen:     FOO[0]          FOO[1]                  FOO[2]
  # entspricht         Hashwert    Maximale Abweichung     URL der Webseite
  # ueberpruefe auf vorhandensein einer Datei mit dem Namen  $FOO[0] (der hash)
  if [ -f ${WORKDIR}${FOO[0]} ] ;
  then
    # die normalen Checks durchfuehren
    lynx_dump >${WORKDIR}${FOO[0]}.temp
    # wieviel Unterschied ist da?
    BAR=`diff ${WORKDIR}${FOO[0]}.temp ${WORKDIR}${FOO[0]} |wc -l`
    if [ ${FOO[1]} -ge ${BAR} ] ;
    then
        # alles gut, nicht genug hat sich in ${FOO[3]} (der URL) geaendert
        rm ${WORKDIR}${FOO[0]}.temp
    else
        # Anderung ueber Schwellenwert, schicke eine Email
        some_stuff |mailx -s "Webseite ${FOO[2]} geaendert" ${MAIL}
        echo "Mail an ${MAIL} wegen Aenderung an ${FOO[2]} verschickt"
        mv ${WORKDIR}${FOO[0]} ${WORKDIR}${FOO[0]}.old
        mv ${WORKDIR}${FOO[0]}.temp ${WORKDIR}${FOO[0]}
    fi
  else
    # Die URL nur dumpen, nicht vergleichen. Das passiert nur beim ersten Lauf,
    # nachdem eine URL neu hinzugefuegt wurde.
    lynx_dump >${WORKDIR}${FOO[0]}
  fi
done
# Definierter "Abgang"
exit 0
##EOF#

Die dazu passende Konfigurationsdatei unter /etc/webseitentester/

cat /etc/webseitentester/urllist.txt

# Konfigurationsdatei
# in der Datei werden die urls angegeben, die ueberwacht werden sollen
# fakultativ kann hinter der URL eine Zahl angegeben werden, dann wird so lange nicht benachrichtigt,
# bis sich alte und neue Webseite in mehr als $ZAHL Unterschieden  unterscheiden...
# ein muss...
google.de
# unbedingt mal draufschauen!
http://belug.de
#bei Heise ändert sich viel
http://heise.de 300
#schwierige urls gehen genau so...
http://belug.de/termin.html?&tx_jwcalendar_pi1[eventid]=4&tx_jwcalendar_pi1[uid]=169&tx_jwcalendar_pi1[action]=singleView&tx_jwcalendar_pi1[day]=1182895200&cHash=6457b51025 0

LutzWillek/webseitentester (zuletzt geändert am 2007-12-23 22:49:05 durch localhost)