Add Scripts/unblock-bluesky.py
This commit is contained in:
@@ -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 = '<Bluesky-Handle>' # Beispiel "myhandly.bsky.social"
|
||||||
|
BSKY_PASSWORD = '<App-Passwort>' # 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)
|
||||||
|
|
||||||
Reference in New Issue
Block a user