Lose Blätter - Software

How-To: Mastodon-Filter nach GotoSocial umziehen (via API)

Da Mastodon-Filter nicht im regulären Archiv-Download enthalten sind und GotoSocial keinen Import-Button besitzt, ist der Weg über die API (Schnittstelle) mit zwei kleinen Python-Skripten die beste Lösung.

Voraussetzungen: Du benötigst Python auf deinem Rechner und die installierte Bibliothek requests (Installation im Terminal via pip install requests).

Schritt 1: Filter aus Mastodon exportieren

  1. Gehe in Mastodon auf Einstellungen > Entwicklung > Neue Anwendung.
  2. Vergib einen Namen, setze bei den Scopes (Berechtigungen) nur den Haken bei read:filters und speichere.
  3. Kopiere den generierten Zugriffstoken.
  4. Öffne dein Terminal und führe folgenden Befehl aus (ersetze TOKEN und URL):
    curl -H "Authorization: Bearer DEIN_TOKEN" https://deine-mastodon-instanz.tld/api/v2/filters > meine_filter.json

Ergebnis: Du hast nun eine Datei meine_filter.json.


Schritt 2: Die GotoSocial-App anlegen (Der "OOB"-Weg)

Da das Web-Interface von GotoSocial beim Generieren von Tokens oft hakt, nutzen wir den zuverlässigen "Out-of-Band" (OOB) Flow, wie ihn auch Handy-Apps nutzen.

  1. Logge dich im Browser in deine GotoSocial-Instanz ein und gehe in die Einstellungen > Applikationen > New Application.
  2. Name: z. B. "FilterImport".
  3. Redirect URI(s): Zwingend urn:ietf:wg:oauth:2.0:oob eintragen (oder stehen lassen).
  4. Scopes: Zwingend read und write (oder read:filters / write:filters) anhaken!
  5. Speichern und auf die neue App klicken. Notiere dir die Client ID und das Client Secret.

Schritt 3: Den Access Token abholen

Jetzt generieren wir den eigentlichen Schlüssel für deinen Account.

A) Den Autorisierungs-Code holen: Kopiere diesen Link, ersetze deine Instanz-URL und deine CLIENT_ID und öffne ihn im Browser: https://deine-gts-instanz.tld/oauth/authorize?client_id=DEINE_CLIENT_ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=read+write

Klicke auf Autorisieren. Der Browser zeigt dir nun einen kurzen Code an. Kopiere diesen.

B) Code in Token umwandeln: Achtung: Der Code aus dem Browser ist nur ca. 2-5 Minuten gültig! Erstelle die Datei get_token.py, trage deine Daten oben ein und führe sie sofort aus (python get_token.py):

import requests

# === DEINE DATEN HIER EINTRAGEN ===
GTS_URL = "https://deine-gts-instanz.tld"
CLIENT_ID = "Deine-Client-ID-hier-rein"
CLIENT_SECRET = "Dein-Client-Secret-hier-rein"
CODE = "Der-Code-aus-dem-Browser-hier-rein"
# ==================================

url = f"{GTS_URL}/oauth/token"
data = {
    "client_id": CLIENT_ID,
    "client_secret": CLIENT_SECRET,
    "redirect_uri": "urn:ietf:wg:oauth:2.0:oob",
    "grant_type": "authorization_code",
    "code": CODE
}

response = requests.post(url, data=data)
if response.status_code == 200:
    print(f"\nDein Access Token:\n{response.json().get('access_token')}")
else:
    print(f"\nFehler ({response.status_code}): {response.text}")

Ergebnis: Das Skript spuckt dir deinen finalen Access Token aus.

Schritt 4: Die Filter importieren

Lege nun das zweite Skript import_filters.py in denselben Ordner, in dem auch deine meine_filter.json liegt. Trage oben deine URL und den soeben generierten Access Token ein:

import json
import requests

# === DEINE KONFIGURATION ===
GOTOSOCIAL_URL = "https://deine-gts-instanz.tld"  # Ohne / am Ende!
ACCESS_TOKEN = "Dein-generierter-Access-Token-hier-rein"
EXPORT_FILE = "meine_filter.json"
# ===========================

headers = {
    "Authorization": f"Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json"
}

def import_filters():
    with open(EXPORT_FILE, "r", encoding="utf-8") as f:
        mastodon_filters = json.load(f)

    for filter_data in mastodon_filters:
        title = filter_data.get('title', 'Unbenannter Filter')
        print(f"Importiere: '{title}'...")

        payload = {
            "title": title,
            "context": filter_data.get("context", ["home", "notifications", "public", "thread"]),
            "filter_action": filter_data.get("filter_action", "hide"),
            "keywords_attributes": [
                {"keyword": kw.get("keyword"), "whole_word": kw.get("whole_word", True)}
                for kw in filter_data.get("keywords", [])
            ]
        }

        response = requests.post(f"{GOTOSOCIAL_URL}/api/v2/filters", headers=headers, json=payload)

        if response.status_code in [200, 201]:
            print(" -> Erfolgreich angelegt!")
        else:
            print(f" -> FEHLER ({response.status_code}): {response.text}")

if __name__ == "__main__":
    import_filters()

Führe das Skript aus (python import_filters.py). Die Filter werden nun live in GotoSocial angelegt.

🚨 Typische Fehler und Lösungen