Zum Inhalt springen
Vorschau auf das nächste Semester, noch nicht veröffentlicht.
Zur aktuellen Seite

Mastodon, Teil 1: Toots abrufen

Aufgabe

Screenshot von Mastodon

Diese Aufgabe wurde an der FAU Erlangen-Nürnberg entwickelt (Institute of Information Systems, Prof. Dr. Martin Matzner) und wird gemäß Creative-Commons-Lizenz CC BY-NC-SA 4.0 bereitgestellt. Es handelt sich um eine angepasste Version der Aufgabe Mastodon OOP.

So kommen die Toots ins Programm

  1. API: Ihr Programm ruft keine Webseite ab, sondern fragt Mastodon über eine API: eine Schnittstelle, die auf festgelegte Anfragen Daten statt fertiger Seiten liefert.
  2. Zugriffstoken: Mit einem Zugriffstoken weist sich Ihr Programm bei Mastodon aus und handelt in Ihrem Namen. Das Token ist geheim wie ein Passwort.
  3. Mastodon.py: Die Python-Bibliothek Mastodon.py übernimmt die Kommunikation mit der API. Mit mastodon.timeline_hashtag("python", limit=10) erhalten Sie eine Liste der höchstens 10 neuesten Toots mit dem Hashtag #python.
  4. Status-dict: Jeder Toot in dieser Liste ist ein Dictionary (Status-dict) mit vielen Schlüsseln. Für die Klasse Toot brauchen Sie fünf davon:
Parameter von TootSchlüssel im Status-dictInhalt
contentcontentder Text des Toots – im Status-dict als HTML, im Toot als reiner Text
accountaccountdas Konto, das den Toot veröffentlicht hat
hashtagstagsdie Hashtags des Toots
pubdatecreated_atdie Veröffentlichungszeit, ein datetime mit Zeitzone
mediamedia_attachmentsListe der Medienanhänge (Bilder, Videos, …); jeder Anhang ist ein Dictionary, unter anderem mit type und url

Beispiel – ein Status-dict, stark gekürzt:

{
    "content": '<p>Heute lerne ich <a class="mention hashtag">#<span>Python</span></a>!</p>',
    "account": {"acct": "alice", ...},
    "tags": [{"name": "python", ...}],
    "created_at": datetime(2026, 1, 10, 12, 0, tzinfo=tzutc()),
    "media_attachments": [],
    ...
}

Daraus wird ein Toot mit content = "Heute lerne ich #Python!", account = "alice", hashtags = ["python"], pubdate = die Zeit aus created_at und media = [].

Mehr zu Mastodon und zu APIs steht am Ende der Seite unter „Zum Weiterlesen“.

Vorbereitung

Aufgabenmaterial

Aufgabenmaterial herunterladen

Öffnen Sie VS CodeVisual Studio Code, der kostenlose Code-Editor von Microsoft, in dem Sie im Kurs programmieren. Glossar → entsprechend Ihrem Setup, klicken Sie auf Ihr Terminalfenster und führen Sie cd aus. Die EingabeaufforderungDas Zeichen am Anfang der Zeile im Terminal, etwa $ oder me/ $. Es zeigt, dass das Terminal auf Ihren nächsten Befehl wartet. Steht davor ein Ordnername wie me/, befinden Sie sich gerade in diesem Ordner. Glossar → Ihres Terminalfensters sollte ungefähr wie folgt aussehen:

$

Laden Sie das Aufgabenmaterial herunter, entpacken Sie es, löschen Sie die ZIP-Datei und wechseln Sie in den neuen Ordner:

wget https://dev.inf.zone/download/exercises/11/mastodon_oop.zip
unzip mastodon_oop.zip
rm mastodon_oop.zip
cd mastodon_oop

Wenn Sie jetzt ls ausführen, sollten Sie die Datei mastodon_oop.py sehen. Falls nicht, wiederholen Sie die Schritte und prüfen Sie, wo ein Fehler aufgetreten sein könnte.

Installieren Sie dann mit pip, dem Paketmanager von Python, die drei Bibliotheken, die mastodon_oop.py importiert – Mastodon.py, Beautiful Soup und pytz:

pip install Mastodon.py beautifulsoup4 pytz

Sehen Sie sich mastodon_oop.py an, bevor Sie loslegen: Das Gerüst enthält alle Klassen und Funktionen beider Teile samt TODO-Kommentaren. Fertig ist nur die Klasse Trigger; alles andere enthält vorerst nur pass (siehe The pass statement). Die Parameterlisten im Gerüst sind leer – ergänzen Sie die Parameter, wenn Sie eine Funktion oder Methode schreiben.

Zugriffstoken anlegen

  1. Erstellen Sie ein Konto auf mastodon.social und melden Sie sich an.
  2. Klicken Sie auf die drei Punkte rechts neben Ihrem Benutzernamen, dann auf Preferences, dann links in der Navigationsleiste auf Development.
  3. Wählen Sie oben rechts New application. Geben Sie unter Application name einen passenden Namen ein, wählen Sie unter Scopes nur read und lassen Sie den Rest unverändert. Klicken Sie ganz unten auf Submit.
  4. In der Liste, die nun erscheint, klicken Sie auf den Namen Ihrer Anwendung (erste Spalte). Dort stehen Client key, Client secret und Access token.
  5. Tragen Sie die drei Werte oben in mastodon_oop.py bei client_id, client_secret und access_token ein. api_base_url bleibt unverändert. Geben Sie die Datei mit Ihren Werten nicht weiter.

Spezifikation

Schritt 1: Die Klasse Toot

  • __init__ nimmt die fünf Parameter content, account, hashtags, pubdate und media entgegen (Bedeutung siehe Tabelle oben) und speichert sie in Instanzvariablen mit Unterstrich (etwa self._content).
  • Machen Sie jede der fünf mit dem Dekorator @property lesbar. Andere Klassen – etwa die Trigger in Teil 2 – greifen dann mit toot.content, toot.account usw. darauf zu.
  • __str__ gibt einen lesbaren String mit den wichtigsten Attributen des Toots zurück, damit Sie Toots mit print ausgeben können (Beispiel unter „Testen“).

Schritt 2: Text aus HTML isolieren

Schreiben Sie eine Funktion get_text_content(toot). Sie bekommt ein Status-dict und gibt den Text aus dessen content ohne HTML-Tags als String zurück. Verwenden Sie dafür die Bibliothek Beautiful Soup.

Aus dem content des Beispiels oben wird so Heute lerne ich #Python!.

Schritt 3: Toots laden

Schreiben Sie eine Funktion load(hashtag), die Toots mit dem Hashtag hashtag von Mastodon lädt:

  1. Legen Sie eine leere Liste für die Toots an.
  2. Rufen Sie timeline_hashtag auf und begrenzen Sie die Antwort mit limit=10 auf höchstens 10 Toots.
  3. Erzeugen Sie aus jedem Status-dict ein Toot-Objekt (Zuordnung der Schlüssel siehe Tabelle oben) und fügen Sie es der Liste hinzu. Den Inhalt speichern Sie als reinen Text, also mit get_text_content, nicht als HTML.
  4. Geben Sie die Liste zurück.

Hilfestellung

Klicken Sie auf die folgenden Tipps, um einige Ratschläge zu erhalten. Versuchen Sie aber zunächst, selbst so weit wie möglich zu kommen.

Text mit Beautiful Soup isolieren
  • Erzeugen Sie zuerst ein Beautiful-Soup-Objekt aus dem HTML-Inhalt und dem Parser "html.parser"; wie das geht, zeigt der Quick Start der Dokumentation.
  • Die Methode get_text dieses Objekts gibt den Textinhalt des HTML-Baums zurück.
Die Daten von Mastodon verarbeiten

toot_data = mastodon.timeline_hashtag(hashtag, limit=10) gibt eine Liste von Status-dicts zurück. Über diese Liste können Sie mit einer for-Schleife iterieren:

for data in toot_data:
    # TODO: create toot-objects from data
  • Lassen Sie sich data einmal mit print ausgeben, um die Struktur zu sehen.
  • Übergeben Sie den Hashtag ohne #, also "python" statt "#python"; sonst meldet Mastodon.py einen Fehler.
  • data["account"] und die Einträge in data["tags"] sind selbst Dictionaries. Für account genügt der Kontoname unter "acct", für hashtags eine Liste der Namen unter "name".

Testen

Rufen Sie im Abschnitt if __name__ == '__main__': die Funktion load mit einem Hashtag Ihrer Wahl auf und geben Sie die geladenen Toots mit print aus. Führen Sie das Programm aus:

python mastodon_oop.py

Jeder Toot sollte ohne HTML-Tags erscheinen, etwa so (das genaue Format bestimmt Ihre __str__-Methode):

Toot von @bob
Veröffentlicht am: 2026-01-10 14:00:00+00:00
Inhalt: Mein Python-Setup, siehe Foto.
Hashtags: python
Medien: https://example.org/foto.jpg

Dann geht es weiter mit Teil 2: Toots filtern.

Korrektheit

Führen Sie in Ihrem Terminal den folgenden Befehl aus, um die Korrektheit Ihrer Arbeit zu überprüfen:

check50 -l inf-zone/exercises/2026/mastodon/load

Abgeben

Geben Sie im Ordner mastodon_oop ab:

inf upload mastodon/load

Danach sehen Sie, welche Tests Ihr Programm besteht und ob die Übung für die Bonuspunkte zählt. Wie Sie inf installieren und sich anmelden, steht unter Abgeben mit inf.

Zum Weiterlesen: Mastodon und APIs

Für die Lösung der Aufgabe nicht nötig.

Eine API (Application Programming Interface) legt fest, wie Programme miteinander kommunizieren: welche Anfragen es gibt und in welchem Format die Daten zurückkommen. Die Anfragen gehen an Endpunkte, also festgelegte URLs, die jeweils für eine Aktion stehen, etwa „die neuesten Toots zu einem Hashtag“. Ein Schlüssel oder Token weist aus, wer anfragt und was er darf. Soziale Netzwerke wie Mastodon bieten solche APIs an, damit Programme Beiträge abrufen oder veröffentlichen können. Mastodon.py ist ein sogenannter Wrapper: eine Bibliothek, die die Anfragen an die API in gewöhnliche Python-Funktionen verpackt.

Mastodon ist eine Social-Media-Plattform, die Eugen Rochko 2016 als Alternative zu zentralisierten Netzwerken gestartet hat. Die Software ist Open Source: Der Quellcode ist frei verfügbar und darf genutzt, verändert und weitergegeben werden. Statt eines zentralen Servers gibt es viele unabhängig betriebene Server, sogenannte Instanzen, die zusammen ein Netzwerk bilden (föderiertes Modell). Jede Instanz hat eigene Regeln und Moderation; man wählt eine nach Interessen oder Vorlieben und kann trotzdem Konten auf anderen Instanzen folgen.

Diese Seite als Markdown: ansehen herunterladen