Seit 2002 betreibe ich die Website der Gesellschaft zur Stärkung der Verben (GSV), seit 2007 nutze ich dafür die von Wikipedia bekannte Wiki-Software MediaWiki. Seit 2003 gibt es parallel dazu ein Forum, auch bulletin board genannt. Dieses läuft mit der Forensoftware Simple Machines Forum (SMF), die aber erst seit 2004 so heißt. Als ich das Forum einrichtete, hieß sie noch YaBB SE. Zu den aktiveren Zeiten der GSV fand die meiste Interaktion zwischen den Mitgliedern im Forum statt. Um die Aktivität im Wiki sichtbarer zu machen, richtete ich ein Skript ein, das regelmäßig den RSS-Feed der letzten Änderungen im Wiki abruft und neue Änderungen als Forenpost formatiert in einen dedizierten Faden im Forum postet. Dieses Skript hatte zunächst die Form eines SMF-Mods. Mods sind softwaretechnisch gesehen abenteuerliche Gebilde. Ähnlich wie Plugins fügen sie der Basissoftware (hier: SMF) neue Funktionalität hinzu. Sie tun dies jedoch nicht notwendigerweise über sauber definierte Schnittstellen. Vielmehr können sie, und so war es in diesem Fall, als eine Art Patch in einem SMF-eigenen XML-Format daherkommen, mit dem der PHP-Code von SMF im laufenden Betrieb modifiziert wird. Es ist sogar SMF selbst, das diese Modifikation an sich vornimmt, über den Paketmanager im Administrationsbereich. Neben dem Patch zur Installation enthalten Mods auch einen Patch zur Deinstallation, der unabhängig von ersterem ist. Z.B. sagt der Installationspatch »Suche in Datei X nach dem String ABC und füge direkt danach den String XYZ ein« und der Deinstallationspatch sagt »Suche in Datei X nach dem String XYZ und entferne ihn.« Man kann sich leicht vorstellen, wie chaotisch es werden kann, wenn eine Mod-Autorin es versäumt, die beiden Patches synchron zu halten, wenn SMF ein Update erhält, durch das der String ABC verändert wird, oder wenn zwei Mods benachbarte Codebereiche modifizieren. Aber für viele Jahre funktionierte mein Setup, basierend auf einer selbst modifizierten Version eines nicht mehr gepflegten Mods namens »RSS Feed Poster«, das eine komplette RSS-Parsing-Bibliothek im Code mit sich führte, gut. Erst kürzlich begann es zu holpern, es kam zu Dopplungen bei den Einträgen. Ich vermute, es hatte etwas mit neuen aggressiven Rate-Limiting-Einstellungen seitens meines Webhosters zu tun, durch die das Skript abbrach, bevor es Gelegenheit bekam, in der Datenbank zu vermerken, welche Feed-Einträge es schon bearbeitet hatte. Das nahm ich zum Anlass, endlich einen softwaretechnisch schöneren Zustand herzustellen, indem ich das Mod aufs Altenteil schickte und durch ein Python-Skript ersetzte, das auf dem Server als Cronjob läuft. Das Auslesen des Feeds der letzten Änderungen aus MediaWiki umzusetzen war easy, Feed-Parsing-Bibliotheken für Python gibt es zuhauf, ich entschied mich für feedparser. Interessanter war die Interaktion mit SMF, das leider über kein API verfügt. Mein Skript muss also so tun, als wäre es eine menschliche Benutzerin, die sich über einen Browser in das Forum einloggt und dort einen Beitrag verfasst. Dazu braucht man einen sog. headless web browser. Als ich aus dieser langen Liste einmal einen ausgewählt hatte, der schön leichtgewichtig ist und ein herzaugenmachend cutes API hat, nämlich mechanicalsoup, war auch das ein Vergnügen. Ah, die Freuden der Systempflege!