diff --git a/Scripts/unblock-bluesky.py b/Scripts/unblock-bluesky.py new file mode 100644 index 0000000..a21fe2a --- /dev/null +++ b/Scripts/unblock-bluesky.py @@ -0,0 +1,87 @@ +""" +Entblocke alle blockierten Accounts + +https://atproto.blue/guides/social-graph/#blocks +https://bsky.network/docs/bluesky-api/following/#blocking +""" + +from atproto import Client,AtUri + +BSKY_HANDLE = '' # Beispiel "myhandly.bsky.social" +BSKY_PASSWORD = '' # Beispiel "a1b2-c3d4-e5f6-g7" + +client = Client() +client.login(BSKY_HANDLE, BSKY_PASSWORD) + + +def get_blocked_accounts(): + """Liest alle von deinem Account blockierten Nutzer aus.""" + + # Erstelle leeres Array für geblockte Accounts + blocked_records = [] + + # Erstelle leren Cursor für Paginierung + cursor = None + + # Pagination durchlaufen, falls viele Accounts blockiert sind + while True: + + # app.bsky.graph.get_blocks holt die Liste aller Blockierungen + response = client.app.bsky.graph.get_blocks(params={"cursor": cursor}) + + # Wenn Rückgabe, schreibe in Array + if response.blocks: + blocked_records.extend(response.blocks) + + # Beende Loop, wenn kein Cursor mehr zurückgegeben + cursor = response.cursor + if not cursor: + break + + # Gib' Array geblockter Accounts zurück + return blocked_records + + +def unblock_accounts(blocked_users: list): + """Sucht den Block-Record für jeden User und löscht ihn.""" + + # Wenn keine blockierten Accounts übergeben, breche ab + if not blocked_users: + print("Keine blockierten Accounts gefunden.") + return + + # Um die Record-URI zu finden, holen wir die genauen Daten der Blockierungen + # viewer.blocking enthält die URI des Block-Eintrags + for user in blocked_users: + try: + # Überprüfen, ob die Record-URI im User-Objekt vorhanden ist + if hasattr(user, "viewer") and user.viewer.blocking: + + # URI auslesen + block_uri = user.viewer.blocking + + # URI hat das Format: at://did:plc:xxx/app.bsky.graph.block/rkey + # Wir löschen den Record direkt über die API + rkey = AtUri.from_str(block_uri).rkey + client.app.bsky.graph.block.delete( + repo=client.me.did, + rkey=rkey + ) + print(f"Erfolgreich entblockt: @{user.handle}") + else: + print(f"Konnte Block-Record für @{user.handle} nicht finden.") + + except Exception as e: + print(f"Fehler beim Entblocken von @{user.handle}: {e}") + + +if __name__ == "__main__": + + # Blockierte Accounts auslesen + print("Hole blockierte Accounts...") + blocked_list = get_blocked_accounts(client) + print(f"Anzahl blockierter Accounts: {len(blocked_list)}") + + # Durch die Ausgabeliste iterieren und entblocken + unblock_accounts(client, blocked_list) + \ No newline at end of file