import json
from collections import Counter
from urllib.request import urlopen, Request
import time
account_name = "danzin" # Put your account name between the quotes
instance = "mastodon.social" # Put your instance between the quotes, without the https:// part
def get_account_id(account_name, instance):
account_url = f"https://{instance}/api/v1/accounts/lookup?acct={account_name}"
account_result = urlopen(account_url).read().decode("utf-8")
account_id = json.loads(account_result)["id"]
return account_id
def fetch_followers(account_id, instance):
followers = []
followers_url = f"https://{instance}/api/v1/accounts/{account_id}/followers"
while followers_url:
request = Request(followers_url)
response = urlopen(request)
followers_result = response.read().decode("utf-8")
followers.extend(json.loads(followers_result))
# Check for next page
links = response.headers.get("Link", "")
next_url = None
if 'rel="next"' in links:
for link in links.split(","):
if 'rel="next"' in link:
next_url = link.split(";")[0].strip("<> ")
break
followers_url = next_url
if next_url:
time.sleep(1) # Be kind to the server
return followers
account_id = get_account_id(account_name, instance)
all_followers = fetch_followers(account_id, instance)
print(f"Total followers retrieved: {len(all_followers)}")
instances = []
for follower in all_followers:
url = follower["url"]
instances.append(url[8:url[8:].index("/") + 8])
counts = Counter(instances)
print(f"{len(instances)} accounts in {len(counts)} instances.")
print(f"{sum(x[1] for x in counts.most_common() if x[1] == 1)} single accounts in a instance.")
print("\nFollower accounts per instance:")
print("\n".join(f"{x[0]}: {x[1]}" for x in counts.most_common()))