Mastodon_DeleteInactiveUser/inactiveUserManager.py

68 lines
No EOL
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import datetime
class InactiveUserManager:
def __init__(self, mastodon_client, grace_period_days: int):
self.mastodon_client = mastodon_client
self.grace_period_days = grace_period_days
self.my_id = None
self.following = []
self.unfollowed_users = []
def fetch_account_id(self):
account = self.mastodon_client.me()
self.my_id = account['id']
def fetch_following_accounts(self):
print("Lade alle Accounts, denen Du folgst...\n")
accounts = self.mastodon_client.account_following(self.my_id)
self.following.extend(accounts)
while accounts:
accounts = self.mastodon_client.fetch_next(accounts)
if accounts:
self.following.extend(accounts)
print(f"Du folgst insgesamt {len(self.following)} Accounts.\n")
def unfollow_inactive_users(self):
now = datetime.datetime.now(datetime.timezone.utc)
threshold_date = now - datetime.timedelta(days=self.grace_period_days)
for account in self.following:
account_id = account['id']
full_acct = account.get('acct', account.get('username', 'Unbekannt'))
last_activity = None
if account.get('statuses_count', 0) > 0:
try:
statuses = self.mastodon_client.account_statuses(account_id, limit=1)
if statuses:
last_activity = statuses[0]['created_at']
except Exception as e:
print(f"Fehler beim Abruf der Status für {full_acct}: {e}")
continue
if last_activity is None:
last_activity = account.get('created_at', None)
if last_activity is None:
print(f"Keine Aktivitätsdaten für {full_acct}. Überspringe diesen Account.")
continue
if last_activity < threshold_date:
try:
self.mastodon_client.account_unfollow(account_id)
self.unfollowed_users.append((full_acct, last_activity))
print(f"Entfolgt: {full_acct} Letzte Aktivität: {last_activity.date()}")
except Exception as e:
print(f"Fehler beim Entfolgen von {full_acct}: {e}")
def run(self):
self.fetch_account_id()
self.fetch_following_accounts()
self.unfollow_inactive_users()
if self.unfollowed_users:
print("\nZusammenfassung der entfolgten Accounts:")
for acct, last in self.unfollowed_users:
print(f"- {acct}: Letzte Aktivität am {last.date()}")
else:
print("Es wurden keine Accounts gefunden, die seit mehr als "
f"{self.grace_period_days} Tagen inaktiv sind.")