In diesem kurzen Beitrag geht es darum, wie man die Liste der Follower bei Mastodon als Textdatei abspeichert. So kann man zum Beispiel untersuchen, was sich nach einiger Zeit verändert hat. Ich habe einmal festgestellt, dass mein Account schlagartig Follower verloren hat. Durch einen Vergleich zweier Listen habe ich dann entdeckt, dass alle verschwundenen Accounts von einer Instanz waren. Vermutlich wurde sie gebannt oder abgeschaltet, keine Ahnung..
API-Key für Mastodon
Zuerst benötigt man einen API-Key, mit dem sich das Skript bei Mastodon authentifizieren kann. Dafür öffnet man Einstellungen und dann Entwicklung auf der Mastodon-Instanz, wo man beheimatet ist. Dort kann man eine neuen Key anlegen: Button "Neue Anwendung".
Anwendungsname: Irgendwas, ich habe für das Skript den Namen "Python" gewählt. Weiterleitungs-URI:
urn:ietf:wg:oauth:2.0:oob
Für dieses Skript benötigt man folgende Rechte:
- read:accounts
- read:follows
- profile
- read:statuses
Wenn man auf Speichern klickt, bekommt man einen API-Key, den man nicht verlieren sollte. Man kann ihn nicht wieder anzeigen lassen und müsste bei Verlust erneut eine App anlegen.
Skript zum Abrufen der Followerliste
Folgendes Python-Skript lädt die Liste der Follower und speichert sie als Textdatei. Vor dem Aufrufen muss man drei Variablen ausfüllen:
- INSTANCE_URL: Die Instanz, z.B. https://norden.social
- ACCOUNT_NAME: Der Accountname, wie er im Profil steht, nur ohne das @.
- ACCESS_TOKEN: Der API-Key wie oben beschrieben
1import datetime
2import requests
3
4INSTANCE_URL = "https://dein_instanz.social"
5ACCOUNT_NAME = "accountname"
6ACCESS_TOKEN = ""
7
8def get_all_followers(instance_url, account_id, token):
9 url = f"{instance_url}/api/v1/accounts/{account_id}/followers"
10 headers = {"Authorization": f"Bearer {token}"}
11 all_usernames = []
12
13 print("Starte Abfrage der Follower...")
14
15 while url:
16 response = requests.get(url, headers=headers)
17
18 if response.status_code != 200:
19 print(f"Fehler beim Abruf: {response.status_code}")
20 break
21
22 data = response.json()
23 for follower in data:
24 all_usernames.append(follower['acct'])
25
26 print(f"{len(all_usernames)} Follower bisher gefunden...")
27
28 url = response.links.get('next', {}).get('url')
29
30 return all_usernames
31
32def get_account_id(instance_url, username, token):
33 url = f"{instance_url}/api/v1/accounts/lookup?acct={username}"
34 headers = {"Authorization": f"Bearer {token}"}
35 response = requests.get(url, headers=headers)
36 if response.status_code != 200:
37 raise Exception(f"Fehler beim Abruf der Account-ID: {response.status_code}")
38 data = response.json()
39 return data['id']
40
41now = datetime.datetime.now()
42output_file = f"followers_{now.strftime('%Y%m%d_%H%M%S')}.txt"
43try:
44 account_id = get_account_id(INSTANCE_URL, ACCOUNT_NAME, ACCESS_TOKEN)
45
46 followers = get_all_followers(INSTANCE_URL, account_id, ACCESS_TOKEN)
47
48 # In Datei schreiben
49 with open(output_file, "w", encoding="utf-8") as f:
50 for name in followers:
51 f.write(name + "\n")
52
53 print("---")
54 print(f"Fertig! {len(followers)} Benutzernamen wurden in '{output_file}' gespeichert.")
55
56except Exception as e:
57 print(f"Ein unerwarteter Fehler ist aufgetreten: {e}")
Viel Spaß damit 👍🏻