Mittwoch, 5. Januar 2011

Inhaltsänderung einer Webseite automatisch überwachen

Möchte man automatisch per E-Mail informiert werden, wenn sich der Inhalt einer bestimmten Webseite ändert, kann man dies mittels Google Apps Script realisieren. Dazu benötigt man zunächst eine beliebige App, die Google Apps Script unterstützt - zum Beispiel Text & Tabellen oder Sites. Hier erstellt man eine Funktion, die den Inhalt (also den HTML-Quelltext) einer Webseite abruft, mit dem bei einem vorherigen Funktionsaufruf gespeicherten Inhalt vergleicht und dann innerhalb des Dokuments speichert. Hat sich der Inhalt geändert, wird eine E-Mail verschickt. Diese Funktion lässt man nun über einen zeitbasierten Trigger automatisch in einem beliebigen Intervall aufrufen. Fertig.

Um es etwas anschaulicher zu gestalten habe ich mal eine solche Funktion erstellt, welche innerhalb einer Tabelle ausgeführt wird. Bitte zum Ausprobieren die eingetragene E-Mail-Adresse "max@mustermann.de" in die eigene ändern!

function checkWebContent({
  var url "http://www.apple.com/de/iphone/";

  var response UrlFetchApp.fetch(url);
  var newContent response.getContentText();

  var sheet SpreadsheetApp.getActiveSheet();
  var cell sheet.getRange("A1");
  var oldContent cell.getValue();

  if (oldContent != newContent{
    sheet.getRange("A1").setValue(newContent);
    MailApp.sendEmail(
      "max@mustermann.de",
      "Geänderter Inhalt",
      "Der Inhalt der Seite " url " hat sich geändert."
    );
  }
}

Funktion unter dem Namen "checkWebContent" speichern.

Für einen ersten Test, kann man diese Funktion mal im Skripteditor starten. Man sollte hierbei bereits eine E-Mail erhalten.

Nun geht es an den zeitbasierten Trigger zur automatischen Ausführung. Hierzu wählt man im Skripteditor den Menüpunkt Triggers -> All your Triggers aus und klickt in der angezeigten Dialogbox auf den Link "No triggers set up. Click here to add one now." (wenn man noch keinen Trigger angelegt hat) beziehungsweise "Add a new trigger" (wenn man bereits einen Trigger angelegt hat). In der Spalte "Run" wählt man den Namen der Funktion aus, in der Spalte "Events" wählt man "Time-driven" aus und definiert einen Intervall. Der folgende Screenshot zeigt einen zeitbasierten Trigger, welcher die Funktion checkWebContent jede Minute ausführt. Speichern.


Scripteditor schließen, Tabelle speichern, Tabelle schließen. Fertig. Nun kann man den Posteingang beobachten und geduldig auf die Benachrichtigungen warten. Die im oben genannten Beispielcode genannte Website wird sich sicher nicht so häufig ändern ... für mehr Benachrichtigungen einfach mal den URL "http://news.google.de/" einsetzen. Die E-Mails sollten dann im Minutentakt im Posteingang landen.

Kommentare:

  1. Funktioniert wunderbar... eine Frage, funktioniert das auch bei passwort geschützten seiten?

    AntwortenLöschen
    Antworten
    1. Danke dafuer. Aber ist das auch mit einem Teil des Quellcodes moeglich?

      Löschen
  2. Wofür sollte man dafür auf Google Apps Script zurückgreifen müssen?

    Man kann sowas ja problemlos in Python machen, ohne dabei konkret auf Google Services zurückgreifen zu müssen. Lediglich um die automatische Ausführung muss man sich dann noch kümmern, aber das sollte auch nicht das Problem darstellen.

    AntwortenLöschen
    Antworten
    1. Man kann es auch mit PHP, Java, Ruby, Objective-C usw. machen. Die Möglichkeiten sind unendlich. Aber darum geht es hier ja nicht, sondern um die Frage, wie man es mit Google Apps Script machen kann. Das hier gezeigte Script ist bei mir zum Beispiel nur ein kleiner Teil aus einem wesentlich größeren Gesamtkonstrukt.

      Löschen
    2. Hallo

      kann man das auch so umbauen das er kleinere änderungen bis zu sagen wir mal 10 zeichen ignoriert.

      Gruß Josty

      Löschen
  3. Danke für das Beispiel. Ich arbeite mich derzeit noch in Apps Script ein und bin da über praktische Code-Schnipsel immer wieder dankbar =)

    AntwortenLöschen
  4. schade, scheint nicht mehr zu funktionieren. TypeError: Methode "getRange" von null kann nicht aufgerufen werden. (Zeile 8, Datei "Code") Kennt noch jemand eine schnelle Möglichkeit, die man vielleicht auf einem Webserverlaufen lassen kann und per cronjob ansteuert?

    Gruß
    Micha

    AntwortenLöschen
  5. scheint wirklich nicht mehr zu funktionieren - hast Du eine Lösung?

    AntwortenLöschen
    Antworten
    1. doch: erst Tabelle anlegen, dann script-editor über Tools aufrufen = activeSheet wird gefunden.

      Löschen
  6. Vielen Dank dafür! Hat jemand eine Idee, wie man bestimmte Inhalte der Website auf Veränderungen überprüfen könnte?

    AntwortenLöschen
  7. Ja. Mit dem URL-Monitor: www.url-monitor.com

    AntwortenLöschen