"""Cleanup old posts that did not have any interactions""" # ----- imports ----- # from dotenv import load_dotenv from mastodon import Mastodon, MastodonRatelimitError from os import getenv def cleanup(limit: int = 40, id: int | None = None): # ----- initialization ----- # # load .env load_dotenv() # initialize mastodon mastodon = Mastodon( access_token = getenv("MASTODON_USER_SECRET"), api_base_url = getenv("MASTODON_URL"), ratelimit_method="throw" ) # ----- go 200 posts into the past, if manual id is not set ----- # if id is None: # get latest posts last_posts = mastodon.account_statuses(getenv("MASTODON_USER_ID"), exclude_replies=True, limit=limit) id_oldest_of_last_posts = -1 for _ in range(4): id_oldest_of_last_posts = last_posts[-1]["id"] last_posts = mastodon.account_statuses(getenv("MASTODON_USER_ID"), exclude_replies=True, max_id=id_oldest_of_last_posts, limit=limit) else: id_oldest_of_last_posts = id last_posts = mastodon.account_statuses(getenv("MASTODON_USER_ID"), exclude_replies=True, max_id=id, limit=limit) # return if there are no posts to check if len(last_posts) == 0: return # ----- delete old posts ----- # # default: check 2 batches of 40 posts (and 6 batches if the id was set manually) num_batches = 2 if id is None else 6 for i in range(num_batches): # skip getting new batch in the first iteration if the id was set manually if i != 0 or id is None: # find id of the currently oldest post last_post = last_posts[-1] if last_post["favourites_count"] != 0 or last_post["reblogs_count"] != 0 or last_post["replies_count"] != 0: id_oldest_of_last_posts = last_post["id"] # get next batch of posts last_posts = mastodon.account_statuses(getenv("MASTODON_USER_ID"), exclude_replies=True, max_id=id_oldest_of_last_posts, limit=limit) # return if there are no more posts to check if len(last_posts) == 0: return # delete all old posts of the current batch for submission in last_posts: # if post has no favorites, boosts or replies, delete it if submission["favourites_count"] == 0 and submission["reblogs_count"] == 0 and submission["replies_count"] == 0: print("Trying to delete post:", submission["url"]) try: mastodon.status_delete(submission["id"]) except MastodonRatelimitError: print("Hit rate limit while trying to delete post:", submission["url"]) return else: print("Ignoring post:", submission["url"]) if __name__ == "__main__": cleanup(limit=40, id=None)