Automatisierung des Rechts auf Löschung mit Webhooks

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

Globale Datenschutz- und Privatsphäre-Vorschriften gewähren Einzelpersonen das Recht, ihre Daten zu kontrollieren, einschließlich des Rechts, deren Löschung zu beantragen (oft als "Recht auf Löschung" oder "Recht auf Vergessenwerden" bezeichnet). Wenn Sie personenbezogene Daten oder personenbezogene Daten (PII), wie Benutzer-IDs, speichern, sind Sie dafür verantwortlich, die geltenden Datenschutzrahmenbedingungen einzuhalten, indem Sie diese Informationen dauerhaft löschen, sobald Sie eine Anfrage von einem Benutzer erhalten. Weitere Informationen finden Sie in RTBF und Creator.

Alternativen in Betracht ziehen

Für personenbezogene Daten in Datenspeichern ist die einfachste Automatisierungsoption, RTBF-Löschvorlagen zu konfigurieren. Wenn Roblox eine RTBF-Anfrage bearbeitet, werden automatisch übereinstimmende Standard- oder geordnete Datenspeichereinträge gelöscht, ohne dass Sie benutzerdefinierten Code hosten müssen. Um Vorlagen zu konfigurieren und unterstützte Muster zu überprüfen, siehe Datenspeicher Recht auf Vergessenwerden (RTBF).

Der Webhook-Workflow auf dieser Seite ist nützlich, wenn:

  • Sie personenbezogene Daten außerhalb von Datenspeichern speichern.
  • Ihr Datenspeicherschema oder Anwendungsfall nicht von RTBF-Löschvorlagen unterstützt wird.
  • Sie benutzerdefinierte Verarbeitungs- oder Löschlogik benötigen.

Creator-Webhook-Workflow

Dieses Tutorial zeigt, wie man einen Webhook einrichtet und einen lokal laufenden Discord-Bot erstellt, der die Open Cloud API für Datenspeicher verwendet, um die Bearbeitung von Anfragen zum Recht auf Löschung zu automatisieren. Der Workflow für diesen Prozess ist wie folgt:

  1. Der Roblox-Support erhält eine Anfrage zum Recht auf Löschung von einem Benutzer.
  2. Der Roblox-Webhook wird ausgelöst, der die Benutzer-ID und eine Liste von Startplatz-IDs für die Spiele, denen sie beigetreten sind, im Payload enthält.
  3. Ihr Bot hört auf diese Webhook-Benachrichtigungen, überprüft deren Authentizität und nutzt die Open Cloud API für Datenspeicher, um die in Datenspeichern gespeicherten PII-Daten zu löschen.
  4. Der Bot antwortet auf die Webhook-Nachricht in Discord mit dem Löschstatus.

Konfigurieren eines Webhooks mit Drittanbieter-Integration

Bevor Sie einen Bot erstellen, richten Sie einen Server mit Webhook-Integration in der Drittanbieter-Nachrichtenanwendung ein. Verwenden Sie dann den Server, um einen Webhook im Creator Dashboard zu konfigurieren.

Server einrichten

Die folgenden Schritte zeigen, wie Sie den Server mit Discord einrichten.

  1. Erstellen Sie einen neuen Discord-Server. Wenn Sie mit dem Prozess nicht vertraut sind, siehe Discord Support.

  2. Der Server erstellt automatisch einen #general-Kanal als Ihren Standardkanal. Klicken Sie auf das Kanal bearbeiten-Symbol des #general-Kanals.

  3. Unter Berechtigungen setzen Sie den Kanal auf privat.

  4. Erstellen Sie eine Webhook-Integration mit dem neuen Server, benennen Sie sie in RTBF Hook. Wenn Sie mit dem Prozess nicht vertraut sind, siehe Discord Support.

  5. Kopieren Sie die Webhook-URL und speichern Sie sie an einem sicheren Ort. Erlauben Sie nur vertrauenswürdigen Teammitgliedern den Zugriff darauf, da das Leaken der URL es böswilligen Akteuren ermöglichen kann, gefälschte Nachrichten zu senden und möglicherweise Ihre Benutzerdaten zu löschen.

Konfigurieren eines Webhooks auf Roblox

Nachdem Sie die URL des Drittanbieter-Servers erhalten haben, verwenden Sie sie, um einen Webhook zu konfigurieren im Creator Dashboard. Stellen Sie sicher, dass Sie die folgenden Einstellungen vornehmen:

  • Fügen Sie die Discord-Server-URL als Webhook-URL hinzu.
  • Fügen Sie ein benutzerdefiniertes Secret hinzu. Obwohl ein Secret optional ist, um die Konfiguration abzuschließen, sollten Sie eines hinzufügen, um zu verhindern, dass böswillige Akteure Roblox nachahmen und Ihre Daten löschen. Weitere Informationen zur Verwendung eines Secrets finden Sie unter Webhook-Sicherheit überprüfen.
  • Wählen Sie Recht auf Löschanfrage unter Trigger.

Sie können den Webhook mit der Schaltfläche Testantwort testen, um zu sehen, ob Sie eine Benachrichtigung in Ihrem Server-#general-Kanal von Roblox erhalten. Wenn Sie die Benachrichtigung nicht erhalten, versuchen Sie es erneut oder überprüfen Sie Ihre Servereinstellungen, um den Fehler zu beheben.

Bot konfigurieren

Nachdem Sie den Webhook hinzugefügt haben, verwenden Sie ihn, um den Bot mit den folgenden Schritten zu konfigurieren. Weitere Informationen finden Sie in der Discord-Dokumentation.

  1. Navigieren Sie zur Anwendungsseite.
  2. Erstellen Sie eine neue Anwendung und benennen Sie sie in RTBF Bot.
  3. Das System leitet Sie zu den Allgemeinen Informationen-Einstellungen des Bots weiter. Kopieren und speichern Sie die Anwendungs-ID an einem sicheren Ort.
  4. Wählen Sie im Einstellungsmenü OAuth2.
  5. Navigieren Sie zu den OAuth2-Einstellungen
    1. Aktivieren Sie den Bot-Scope, eine Liste zusätzlicher Bot-Berechtigungen wird angezeigt.
    2. Fügen Sie die Berechtigung Administrator hinzu. Speichern Sie Ihre Änderungen.
    3. Speichern Sie die generierte URL.
  6. Kopieren Sie die generierte URL. Lassen Sie die Anwendungsseiteneinstellungen offen.
  7. Navigieren Sie zur generierten URL. Wählen Sie den Zielserver aus. Klicken Sie auf die Schaltfläche Weiter und dann auf die Schaltfläche Autorisieren.
  8. Navigieren Sie zurück zur Anwendungsseiteneinstellungen und gehen Sie zu den Bot-Einstellungen.
  9. Aktivieren Sie im Abschnitt Privileged Gateway Intents die Message Content Intent.
  10. Speichern Sie im Abschnitt Bot-Einstellungen > Build-A-Bot das Bot-Token an einem sicheren Ort für spätere Schritte. Wenn Sie das Token nicht sehen, klicken Sie auf die Schaltfläche Token zurücksetzen, um ein neues zu generieren.

Erstellen eines Open Cloud API-Schlüssels

Um Ihrem Drittanbieter-Bot den Zugriff auf Ihre Datenspeicher zu ermöglichen, um PII-Daten von Benutzern zu speichern, erstellen Sie einen Open Cloud API-Schlüssel, der auf Ihre Spiele zugreifen kann und die Berechtigung Eintrag löschen für Datenspeicher zum Löschen von Daten hinzufügt. Wenn Sie geordnete Datenspeicher für die Speicherung von PII verwenden, müssen Sie auch die Berechtigung Schreiben für geordnete Datenspeicher hinzufügen. Nach Abschluss kopieren und speichern Sie den API-Schlüssel an einem sicheren Ort, um ihn in späteren Schritten zu verwenden.

Identifikatoren von Spielen und Orten erhalten

Damit der Bot die PII-Daten, die von Benutzern zur Löschung angefordert werden, finden kann, erhalten Sie die folgenden Identifikatoren aller Spiele, für die Sie den Bot verwenden möchten:

  • Die Universum-ID, die eindeutige Kennung Ihres Spiels.
  • Die Startplatz-ID, die eindeutige Kennung des Startplatzes eines Spiels.

Um diese Identifikatoren zu erhalten:

  1. Navigieren Sie zum Creator Dashboard.

  2. Fahren Sie mit der Maus über das Thumbnail eines Spiels, klicken Sie auf die Schaltfläche und wählen Sie Universum-ID kopieren und Startplatz-ID kopieren.

Skripte hinzufügen

Nachdem Sie den Webhook, den Bot und den API-Schlüssel für Datenspeicher eingerichtet haben, fügen Sie sie zu den Skripten hinzu, die die Automatisierungslogik des Bots implementieren. Das folgende Beispiel verwendet Python 3.

  1. Installieren Sie Python-Bibliotheken mit den folgenden Befehlen:

    Bibliotheken installieren
    pip3 install discord
    pip3 install requests
    pip3 install urllib3==1.26.6
  2. Kopieren und speichern Sie die folgenden Skripte, die verschiedenen Teilen der Bot-Logik entsprechen, im selben Verzeichnis:

    bot_config.py
    BOT_TOKEN = ""
    OPEN_CLOUD_API_KEY = ""
    ROBLOX_WEBHOOK_SECRET = ""
    # Wörterbuch der Startplatz-ID zu
    # (Universum-ID, Liste von (Datenspeichernamen, Scope und Eintragskey)) für
    # Standard-Datenspeicher
    # Benutzerdaten, die unter diesen Einträgen gespeichert sind, werden gelöscht
    STANDARD_DATA_STORE_ENTRIES = {
    # Startplatz-ID
    111111111: (
    # Universum-ID
    222222222,
    [
    ("StandardDataStore1", "Scope1", "Key1_{user_id}"),
    ("StandardDataStore1", "Scope1", "Key2_{user_id}"),
    ("StandardDataStore2", "Scope1", "Key3_{user_id}")
    ]
    ),
    33333333: (
    444444444,
    [
    ("StandardDataStore3", "Scope1", "Key1_{user_id}")
    ]
    )
    }
    # Wörterbuch der Startplatz-ID zu
    # (Universum-ID, Liste von (Datenspeichernamen, Scope und Eintragskey)) für
    # Geordnete Datenspeicher
    # Benutzerdaten, die unter diesen Einträgen gespeichert sind, werden gelöscht
    ORDERED_DATA_STORE_ENTRIES = {
    111111111: (
    222222222,
    [
    ("OrderedDataStore1", "Scope2", "Key4_{user_id}")
    ]
    )
    }
    data_stores_api.py
    import requests
    import bot_config
    from collections import defaultdict
    """
    Ruft die Open Cloud API für Datenspeicher auf, um alle Einträge für eine user_id zu löschen, die in
    STANDARD_DATA_STORE_ENTRIES konfiguriert ist. Gibt eine Liste erfolgreicher Löschungen und Fehler beim Löschen zurück.
    """
    def delete_standard_data_stores(user_id, start_place_ids):
    successes = defaultdict(list)
    failures = defaultdict(list)
    for owned_start_place_id in bot_config.STANDARD_DATA_STORE_ENTRIES:
    if owned_start_place_id not in start_place_ids:
    continue
    universe_id, universe_entries = bot_config.STANDARD_DATA_STORE_ENTRIES[owned_start_place_id]
    for (data_store_name, scope, entry_key) in universe_entries:
    entry_key = entry_key.replace("{user_id}", user_id)
    response = requests.delete(
    f"https://apis.roblox.com/datastores/v1/universes/{universe_id}/standard-datastores/datastore/entries/entry",
    headers={"x-api-key": bot_config.OPEN_CLOUD_API_KEY},
    params={
    "datastoreName": data_store_name,
    "scope": scope,
    "entryKey": entry_key
    }
    )
    if response.status_code in [200, 204]:
    successes[owned_start_place_id].append((data_store_name, scope, entry_key))
    else:
    failures[owned_start_place_id].append((data_store_name, scope, entry_key))
    return successes, failures
    """
    Ruft die Open Cloud API für geordnete Datenspeicher auf, um alle Einträge für eine user_id zu löschen, die in
    ORDERED_DATA_STORE_ENTRIES konfiguriert ist. Gibt eine Liste erfolgreicher Löschungen und Fehler beim Löschen zurück.
    """
    def delete_ordered_data_stores(user_id, start_place_ids):
    successes = defaultdict(list)
    failures = defaultdict(list)
    for owned_start_place_id in bot_config.ORDERED_DATA_STORE_ENTRIES:
    if owned_start_place_id not in start_place_ids:
    continue
    universe_id, universe_entries = bot_config.ORDERED_DATA_STORE_ENTRIES[owned_start_place_id]
    for (data_store_name, scope, entry_key) in universe_entries:
    entry_key = entry_key.replace("{user_id}", user_id)
    response = requests.delete(
    f"https://apis.roblox.com/ordered-data-stores/v1/universes/{universe_id}/orderedDatastores/{data_store_name}/scopes/{scope}/entries/{entry_key}",
    headers={"x-api-key": bot_config.OPEN_CLOUD_API_KEY}
    )
    if response.status_code in [200, 204, 404]:
    successes[owned_start_place_id].append((data_store_name, scope, entry_key))
    else:
    failures[owned_start_place_id].append((data_store_name, scope, entry_key))
    return successes, failures
    message_parser.py
    import time
    import hmac
    import hashlib
    import re
    import base64
    import bot_config
    """
    Analysiert die empfangene Nachricht nach der Roblox-Signatur und dem Zeitstempel, die Fußzeile wird nur gesetzt, wenn Sie
    das Webhook-Secret konfiguriert haben
    """
    def parse_footer(message):
    if not message.embeds[0].footer or \
    not message.embeds[0].footer.text:
    return "", 0
    footer_match = re.match(
    r"Roblox-Signature: (.*), Timestamp: (.*)",
    message.embeds[0].footer.text
    )
    if not footer_match:
    return "", 0
    else:
    signature = footer_match.group(1)
    timestamp = int(footer_match.group(2))
    return signature, timestamp
    """
    Überprüft die Roblox-Signatur mit dem konfigurierten Secret auf Gültigkeit
    """
    def validate_signature(message, signature, timestamp):
    if not message or not signature or not timestamp:
    return False
    # Verhindert Replay-Angriffe innerhalb eines Zeitfensters von 300 Sekunden
    request_timestamp_ms = timestamp * 1000
    window_time_ms = 300 * 1000
    oldest_timestamp_allowed = round(time.time() * 1000) - window_time_ms
    if request_timestamp_ms < oldest_timestamp_allowed:
    return False
    # Validiert die Signatur
    timestamp_message = "{}.{}".format(timestamp, message.embeds[0].description)
    digest = hmac.new(
    bot_config.ROBLOX_WEBHOOK_SECRET.encode(),
    msg=timestamp_message.encode(),
    digestmod=hashlib.sha256
    ).digest()
    validated_signature = base64.b64encode(digest).decode()
    if signature != validated_signature:
    return False
    # Gültige Signatur
    return True
    """
    Analysiert eine empfangene Webhook-Nachricht auf Discord. Extrahiert die Benutzer-ID, verhindert Replay-Angriffe
    basierend auf dem empfangenen Zeitstempel und überprüft die Roblox-Signatur mit dem konfigurierten Secret auf
    Gültigkeit.
    """
    def parse_message(message):
    # Analysiert die empfangene Nachricht nach Benutzer-ID und Spiel-ID
    if len(message.embeds) != 1 or \
    not message.embeds[0].description:
    return "", []
    description_match = re.match(
    r"Sie haben eine neue Benachrichtigung für das Recht auf Löschung für die Benutzer-ID: (.*) in " +
    r"den Spiel(en) mit IDs: (.*)",
    message.embeds[0].description
    )
    if not description_match:
    return "", []
    user_id = description_match.group(1)
    start_place_ids = set(int(item.strip()) for item in description_match.group(2).split(","))
    signature, timestamp = parse_footer(message)
    if validate_signature(message, signature, timestamp):
    return user_id, start_place_ids
    else:
    return "", []
    discord_bot.py
    import discord
    import bot_config
    import data_stores_api
    import message_parser
    def run():
    intents = discord.Intents.default()
    intents.message_content = True
    client = discord.Client(intents=intents)
    @client.event
    async def on_ready():
    print(f"{client.user} hört auf Nachrichten zum Recht auf Löschung")
    """
    Handler für Webhook-Nachrichten von Roblox
    """
    @client.event
    async def on_message(message):
    # Analysiert und validiert die Nachricht
    user_id, start_place_ids = message_parser.parse_message(message)
    if not user_id or not start_place_ids:
    return
    # Löscht die Benutzerdaten in den Standard-Datenspeichern
    [successes, failures] = data_stores_api.delete_standard_data_stores(user_id, start_place_ids)
    if successes:
    await message.reply(f"Gelöschte Daten in den Standard-Datenspeichern für " +
    f"Benutzer-ID: {user_id}, Daten: {dict(successes)}")
    if failures:
    await message.reply(f"Fehler beim Löschen der Daten in den Standard-Datenspeichern für " +
    f"Benutzer-ID: {user_id}, Daten: {dict(failures)}")
    # Löscht die Benutzerdaten in den geordneten Datenspeichern
    [successes, failures] = data_stores_api.delete_ordered_data_stores(user_id, start_place_ids)
    if successes:
    await message.reply(f"Gelöschte Daten in den geordneten Datenspeichern für " +
    f"Benutzer-ID: {user_id}, Daten: {dict(successes)}")
    if failures:
    await message.reply(f"Fehler beim Löschen der Daten in den geordneten Datenspeichern für " +
    f"Benutzer-ID: {user_id}, Daten: {dict(failures)}")
    client.run(bot_config.BOT_TOKEN)
    if __name__ == "__main__":
    run()
  3. In der Datei bot_config.py für die Hauptkonfiguration des Bots:

    1. Setzen Sie BOT_TOKEN auf das Token, das von Ihrem Bot generiert wurde.
    2. Setzen Sie OPEN_CLOUD_API_KEY auf den API-Schlüssel, den Sie erstellt haben.
    3. Setzen Sie ROBLOX_WEBHOOK_SECRET auf das Secret, das Sie bei der Konfiguration des Webhooks im Creator Dashboard festgelegt haben.
    4. In den Wörterbüchern STANDARD_DATA_STORE_ENTRIES und ORDERED_DATA_STORE_ENTRIES zur Lokalisierung des Datenspeichers für jeden zu löschenden Datensatz:
      1. Fügen Sie Ihre kopierten Startplatz-IDs als Schlüssel hinzu.
      2. Fügen Sie die Universum-IDs als erstes Element des Tupelwerts hinzu.
      3. Ersetzen Sie das zweite Element des Tupels durch den Namen, den Scope, den Eintragskey-Namen und die zugehörige Benutzer-ID Ihrer Datenspeicher. Wenn Sie ein anderes Datenschema verwenden, passen Sie es entsprechend Ihrem eigenen Datenschema an.
  4. Führen Sie den folgenden Befehl aus, um den Bot zu starten:

    Discord-Bot ausführen
    python3 discord_bot.py
  5. Der Bot beginnt dann, Roblox-Webhooks für Anfragen zum Recht auf Löschung zu hören und ruft den Open Cloud-Endpunkt zum Löschen des entsprechenden Datenspeichers auf.

Test

Sie können eine Testnachricht erstellen und senden, um zu überprüfen, ob Ihr benutzerdefiniertes Programm Anfragen zum Recht auf Löschung ordnungsgemäß verarbeiten und PII-Daten löschen kann:

  1. Senden Sie eine HTTP POST-Anfrage an Ihren Discord-Webhook-Server mit dem folgenden Anfragekörper:

    Beispielanfrage
    curl -X POST {serverUrl}
    -H 'Content-Type: application/json'
    -d '{
    "embeds":[{
    "title":"RightToErasureRequest",
    "description":"Sie haben eine neue Benachrichtigung für das Recht auf Löschung für die Benutzer-ID: {userIds} in den Spiel(en) mit IDs: {gameIds}",
    "footer":{
    "icon_url":"https://create.roblox.com/dashboard/assets/webhooks/roblox_logo_metal.png",
    "text":"Roblox-Signature: {robloxSignature}, Timestamp: {timestamp}"
    }
    }]
    }'
  2. Wenn Sie ein Webhook-Secret haben:

    1. Generieren Sie eine Roblox-Signature, indem Sie HMAC-SHA256-Codierung auf Ihren Webhook-Secret-Schlüssel anwenden.
    2. Setzen Sie die aktuelle Zeit mit dem UTC-Zeitstempel in Sekunden als Timestamp.
  3. Stellen Sie die description im folgenden Format zusammen:

    Format des Beschreibungsfelds
    {Timestamp}. Sie haben eine neue Benachrichtigung für das Recht auf Löschung für die Benutzer-ID: {userId} in den Spiel(en) mit IDs: {gameIds}`.

    Zum Beispiel:

    Beispiel-Beschreibungsfeld
    1683927229. Sie haben eine neue Benachrichtigung für das Recht auf Löschung für die Benutzer-ID: 2425654247 in den Spiel(en) mit IDs: 10539205763, 13260950955

Ihr Programm sollte in der Lage sein, zu erkennen, dass Ihre Nachricht von der offiziellen Roblox-Quelle stammt, da Sie die Nachricht mit Ihrem Secret codiert haben. Es sollte dann die PII-Daten löschen, die mit Ihrer Anfrage verbunden sind.

Beispielkörper
{
"embeds": [
{
"title": "RightToErasureRequest",
"description": "Sie haben eine neue Benachrichtigung für das Recht auf Löschung für die Benutzer-ID: 2425654247 in den Spiel(en) mit IDs: 10539205763, 13260950955",
"footer": {
"icon_url": "https://create.roblox.com/dashboard/assets/webhooks/roblox_logo_metal.png",
"text": "Roblox-Signature: UIe6GJ78MHCmU/zUKBYP3LV0lAqwWRFR6UEfPt1xBFw=, Timestamp: 1683927229"
}
}
]
}
©2026 Roblox Corporation. Roblox, das Roblox-Logo und "Powering Imagination" gehören zu unseren eingetragenen und nicht eingetragenen Markenzeichen in den USA und anderen Ländern.