Greasemonkey ist eine nette, aber auch irgendwie anarchistische Firefox-Erweiterung, welche es erlaubt, von Benutzern selbst gebastelten JavaScript-Code auf x-beliebigen Websites auszuführen. Sinn und Zweck ist die Veränderung der Seiten. Klingt erstmal komisch, hat aber viele, viele sinnvolle Anwendungsgebiete, insbesondere auf populären Websites wie StudiVZ, Youtube und Co.
Mit Greasemonkey kann man Websites um Funktionalitäten erweitern, die so nicht angeboten werden. Da sind der Vorstellungskraft keine Grenzen gesetzt und darüber hinaus erleichtert einem diese Erweiterung sehr viel Arbeit, wenn man vorhat, eine kleine, eigene Erweiterung für Firefox zu basteln (was recht kompliziert ausfallen kann).
In diesem Artikel gehe ich auf die Script-Entwicklung mit Greasemonkey ein, erläutere Dinge, die man beachten muß und ein paar fiese Bugs, über die ich selbst gestolpert bin.
Dem Schmieraffen Zucker geben
Na an sich wäre die adäquateste Übersetzung für Greasemonkey sowas wie "KFZ Meschugge". Es ist ein umgangssprachlicher Begriff für Autobastler, und darum geht es hier auch in etwa - man fummelt in den Eingeweiden einer Homepage herum und schraubt hie und da ein bissl herum.
Wie das funktioniert, ist ganz einfach. Zunächst muß man
Greasemonkey zu Firefox hinzufügen. Ein grinsender Affenkopf erscheint dann in der Statusleiste des Browsers.
Danach steht einem die fabelhafte Welt der sogenannten Userscripts offen - tausende an der Zahl - welche sich auf
userscripts.org bestaunen und supereinfach installieren lassen. Einfach den "Install"-Knopf des gewünschten Skripts drücken und ein Fenster poppt auf, welches zur Bestätigung der Installation dient.
Hello World à la Greasemonkey
Dieses kleine, bescheidene Tutorial setzt voraus, daß der geneigte Leser bereits JavaScript beherrscht. Ich gehe nur auf Greasemonkey-Besonderheiten ein.
Nachdem das nun geklärt ist, kanns ja direkt mit einem kleinen Skript losgehen.
Es ist wichtig, sich mit dem typischen Header von Greasemonkey-Skripten vertraut zu machen. Darin wird ein sogenannter Metadata-Block hineingeschrieben, der wichtige Informationen über das Skript beinhaltet. Dieser Block kann wie folgt aussehen:
// ==UserScript==
// @name Mein Superskript
// @description Macht verrückte Sachen auf Google.de!
// @include http://www.google.de/*
// ==/UserScript==
Die ersten beiden Informationen geben Auskunft über den Namen und die Beschreibung eines Skripts. Wenn man vorhat, sein Skript auf userscripts.org zu veröffentlichen, sollte man sich einen einmaligen Namen ausdenken (also vorher die Seite prüfen!).
Die @include-Anweisung gibt Greasemonkey Auskunft über den Einsatzbereich des Skripts. Hierin entfaltet sich eine der Stärken dieser Firefox-Erweiterung, denn man kann angeben, auf welcher Seite ein Skript ausgeführt werden soll.
Das Sternchen ist übrigens eine Wildcard und bedeutet soviel, daß an dieser Stelle noch ein Rattenschwanz an Zeichen folgen darf.
Es gibt darüber hinaus noch folgende weitere Metadaten:
- @exclude - Schließt eine Website aus
- @namespace - Unter dieser Angabe kann man seine eigene, persönliche Internet-Seite angeben. Damit sollen Skript-Namenskollisionen verhindert werden.
- @require - Sehr nettes Features, mit dem man eine JavaScript-Datei vom Internet herunterladen lassen kann, welches vom Skript benötigt wird. Dadurch kann man beispielsweise jQuery und Ähnliches einbinden.
Übrigens kann man beliebig viele Seiten mit @include einschließen oder @exclude ausschließen. Es gilt lediglich zu beachten, daß man für jede Angabe eine neue Zeile mit @include oder @exclude hinzufügt.
Es gibt noch ein paar weitere Metadaten. Diese Angaben sind nochmal ausführlich erklärt auf der entsprechenden
Seite der Greasemonkey Entwickler-Wiki, die man sich auf jeden Fall mal anschauen sollte.
Nach diesem Metadaten-Block kann man im Grunde wie gewohnt mit JavaScript herumjonglieren und sich darauf verlassen, daß der Code auf google.de ausgeführt wird. Es gibt ein paar Sicherheitseinschränkungen, aber auf die gehe ich später ein.
Angenommen, man will über dem Google-Logo eine zusätzliche Botschaft einbauen. Zunächst muß man sich die Seitenstruktur anschauen und siehe da, es stellt sich heraus, daß das Google-Logo mit der ID "logo" versehen ist:
CODE:
<img width="301" height="110" onload="window.lol&&lol()"
id="logo" src="/intl/de_de/images/logo.gif" alt="Google">
Dieser Umstand läßt sich natürlich nutzen, um seine Änderung einfließen zu lassen:
// ==UserScript==
// @name Mein Superskript
// @description Macht verrückte Sachen auf Google.de!
// @include http://www.google.de/*
// ==/UserScript==
var hello = document.createElement('p');
hello.innerHTML = 'Hallo Welt!';
var logo = document.getElementById('logo');
logo.parentNode.insertBefore(hello, logo);
Das war's schon fast. Man muß die Datei noch mit der Endung ".user.js" abspeichern und im Firefox öffnen. Greasemonkey erkennt anhand dieser Dateiendung, daß es sich um ein Benutzerskript handelt und startet dann automatisch die Installationsroutine. Danach kann man Google.de einen Besuch abstatten und dann sollte das selbstgebastelte Skript greifen.
Greasemonkey führt die Benutzerskripte auf das
DOMContentLoaded-Event aus, welches von Firefox gefeuert wird, sobald der HTML-Code verarbeitet und der DOM-Baum zur Verfügung steht.
Man benötigt daher nicht, einen Load-Event-Handler zu document.body hinzuzufügen, sondern kann direkt mit den Manipulationen loslegen.
Alle möglichen Ideen...
Jetzt kann man sich natürlich fix Gedanken machen, welches Feature man sich schon immer auf seiner Lieblingswebsite gewünscht hat. Bietet die Website zum Beispiel nur Textareas statt JavaScript-RichEdit-Komponenten an? Warum nicht einfach ein Skript basteln, welches die Textareas durch Editoren ersetzt? Denkbar sind alle möglichen sinnvollen und sinnlosen Erweiterungen. Wenn man sich also ernsthafter mit Greasemonkey-Entwicklung befassen will, sollte man sich noch folgender Punkte im Klaren sein.
Einfache Datenhaltung für Skript-Konfiguration
Manchmal möchte man, daß sich sein Skript gewisse Informationen über mehrere Ausführungen hinweg merkt. Das können zum Beispiel Optionen sein, die der Benutzer einstellen darf, oder vielleicht Zähler, die gewisse Ereignisse oder Vorgänge mitzählen. Wie auch immer, jedenfalls bietet Greasemonkey's API drei nützliche Funktionen, um Konfigurations-Werte wie Strings oder Zahlen abzuspeichern, auszulesen und zu löschen:
GM_setValue(key, value)
Unter key versteht man eine einmalige Zeichenkette, die laut Dokumentation von der Schreibweise her ein gültiger JavaScript-Bezeichner (Variablen-/Funktionsname) sein soll. Unter value kann man Zeichenketten und Zahlen angeben.
Die Daten werden von Firefox permanent abgespeichert und lassen sich unter der Adresse
about:config abrufen und editieren. Einfach mit dem Suchfeld nach "greasemonkey" schauen, da findet man die Werte schon.
GM_getValue(key)
Das hier ist natürlich das sinnvolle Gegenstück zur vorigen Funktion. Hiermit kann man einen zuvor abgespeicherten Wert wieder auslesen. Feine Sache!
GM_deleteValue(key)
Manchmal mag man sich von einem Konfigurationswert wieder trennen. Das geht hiermit.