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
- Gehe in Mastodon auf Einstellungen > Entwicklung > Neue Anwendung.
- Vergib einen Namen, setze bei den Scopes (Berechtigungen) nur den Haken bei
read:filtersund speichere. - Kopiere den generierten Zugriffstoken.
- Öffne dein Terminal und führe folgenden Befehl aus (ersetze
TOKENundURL):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.
- Logge dich im Browser in deine GotoSocial-Instanz ein und gehe in die Einstellungen > Applikationen > New Application.
- Name: z. B. "FilterImport".
- Redirect URI(s): Zwingend
urn:ietf:wg:oauth:2.0:oobeintragen (oder stehen lassen). - Scopes: Zwingend
readundwrite(oderread:filters/write:filters) anhaken! - 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
- Fehler 400 (
invalid_grant) bei Schritt 3: Dein Browser-Code war abgelaufen (er gilt nur wenige Minuten). Generiere über den Link im Browser einfach einen neuen Code und führeget_token.pydirekt nochmal aus. - Fehler 401 (
Unauthorized) bei Schritt 4: Du hast entweder den falschen Token kopiert, oder bei der App-Erstellung vergessen, die Scope-Rechte aufwritezu setzen. - Fehler 409 (
Conflict: duplicate keyword) bei Schritt 4: Mastodon hat dir ein Filterwort doppelt in die Exportdatei geschrieben. GotoSocial ist strenger und lehnt dieses Duplikat ab. Das Skript ignoriert diesen einen Filter und läuft automatisch weiter. Du musst diesen einen abgelehnten Filter danach einfach händisch in deiner App nachtragen.