Zusätzlich zu dem Zugriff auf Datenspeicher mit Lua DataStoreService in Studio oder Live-Servern können Sie Open Cloud-APIs verwenden, um auf Standard und 1>aufgeorderte Datenstores1> von externen Skripts und Tools mit granularer Zugriffssteuerung und Sicherheitskontrolle zuzugreifen.
Verwendung
Sie können mehrere Bereiche Ihres Workflows verbessern, indem Sie mit diesen APIs auf Ihre Daten zugreifen, z. B.:
Kunden-Support-Portal : Datenspeicher ist nützlich für das Speichern persistenter Benutzerressourcen, wie z. B. Artikel in Benutzerinventaren oder Fertigkeitspunkten. Manchmal müssen Sie diese Ressourcen für Kunden-Support aktualisieren. Statt Studio oder dem Beitreten eines Erlebnisses manuell zu aktualisieren, können Sie eine Web-Anwendung erstellen, um Ihre Kunden-Support-Agenten direkt auf Kunden-Support-Anfragen zu reagieren
LiveOps-Dashboard : Sie können ein LiveOps-Dashboard mit den APIs erstellen, um die Effizienz von Live-Operationen zu verbessern, z. B. die Schedulerung von Erlebnissen. Sie können ein Ereignis im Voraus kodieren, es unter einem Feature-Flag als Teil der Konfigurationsdaten in einem Daten-Store verbergen und eine Zeit einstellen, um die Flagge zu aktivieren, um das Ereignis zu veröffentlichen. Ihre Erlebnisse-Server können diesen Änderungspro
Externe Bestenliste : Um Ihre Erfahrungen außerhalb von Roblox zu befördern, können Sie die Informationen Ihrer Erlebnis, z. B. die Bestenliste eines Rennens, in Echtzeit abrufen und sie auf einer externen Website anzeigen. Sie können den Zugriff auf Ihre bestellten Daten-Stores für die Website gewähren, um die neuesten Daten per HTTP-Anfrage zu aktualisieren und die Webseite zu aktualisieren.
Daten-Migrations-Automatisierung : Die Daten können sich ändern oder aktualisieren, wenn deine Erfahrung entwickelt, z. B. alte Datenschemata aktualisieren, um neue Funktionen zu unterstützen. Um bestehende Benutzerdaten zu verlieren, musst du manchmal deine Datenstores aus dem alten Schema in ein neues übertragen. Du kannst ein externes Skript schreiben, das jeden Eintrag aus der aktuellen D
Unterschiede mit der Lua-API
Obwohl Open Cloud-APIs ähnlich sind wie die Lua DataStoreService, gibt es einige verschiedene Anforderungen zu berücksichtigen:
Universum-ID und -Datenspeichername : Im Gegensatz zur Lua-API sind Open Cloud-APIs stateless und können von überall aus kommen, so dass Sie die Universum-ID , die einzigartige Identifikator Ihres Erlebnisses, und den Daten-Store Namen immer bereitstellen müssen, wenn Sie die Anfragen senden. Weitere Informationen darüber, wie Sie eine Universe ID erhalten, finden Sie unter 0> Universe
Separate Berechtigungen für das Erstellen und Aktualisieren : Die Lua-API erstellt neue Einreichungen, wenn sie nicht existieren, wenn Sie DataStore:SetAsync() aufrufen, aber die Open-Cloud-Methode zum Erstellen und Aktualisieren von Einreichungen ist separat. Separate Berechtigungen können in bestimmten Situationen sicherer und flexibler sein. Zum Beispiel können Sie ein Kundenunterst
DatenserIALisierung : Alle Open Cloud-Endpunkte erfordern Sie, um alle Daten vor dem Netzwerktransport zu serIALisieren. Die SerIALisierung bedeutet, dass ein Objekt in diese Strings umgewandelt wird, und die Deserialisierung ist seine Gegenleistung (Konvertieren eines Strings in ein Objekt). Die Lua-API serIALisiert und deserialisiert den Inhalt des Eintrags automatisch, aber für Open Cloud müssen Sie Ihre Eingabedaten mit JSON besitzengenerieren oder parsaleifen.
Sicherheitsberechtigungen
Datenspeicherung speichert in der Regel sensible Informationen, wie BenutzerProfile und virtuelle Währung. Um die Sicherheit zu gewährleisten, hat jede Open Cloud-API entsprechende erforderliche Berechtigungen, die Sie zu Ihrem API-Schlüssel hinzufügen müssen, wie die List Keys- Berechtigung für die Liste-API. Wenn Sie die erforderlichen Berechtigungen nicht hinzufü
Wenn du deine API-Schlüssel konfigurierst, kannst du granularere Berechtigungen, wie z. B. gelesen, Schreiben und Einträge in der Liste, für jeden Datenstores innerhalb eines bestimmten Erlebnisses konfigurieren, oder du kannst einen Schlüssel geben, um alle Datenstores innerhalb eines Erlebnisses zu lesen oder zu schreiben. Dies verringert den Einfluss, wenn dein Schlüssel verloren geht.
Bausteine
Sie können die Sprache Ihrer Wahl verwenden, um Werkzeuge mit Open Cloud APIs for Data Stores zu erstellen, um Ihren Betriebsbedarf zu erfüllen. Die folgenden Beispiele zeigen die Prozesse der Erstellung eines Inventar-Support-Portals in Python mit Standard-Datenspeicher und einer Externen persistente Leaderboard mit bestellten Daten-Stores.
User Inventory-Supportportal
Dieser Abschnitt bietet ein konkretes Beispiel dafür, wie Sie ein Benutzer-Inventar-Support-Portal in Python aufbauen, in dem Sie ein Untermenü Ihres Benutzerinventars aufzählen und lesen können, Bearbeitungen vornehmen und dann zurück zu einem Storeaktualisieren.
Für dieses Beispiel nehmen wir an, dass gefolgte Profilezutrifft:
Der Name des Datenstoßes, der das Benutzerinventar speichert, ist Inventory .
Das Datenmodell für jeden Datenbeitrag ist "userId": {"currency": number, "weapon": string, "level": number} . Der Schlüssel ist nur userId .
Das Python-Skript listet einen Unter-Set von Benutzer-Inventaren basierend auf Präfixen, erhöht seine virtuelle Währung um 10 für eine Aktionund aktualisiert die Daten.
Von einem hohen Stufeaus kannst du deine Python-App aufbauen, indem du API-Schlüssel-Berechtigungen hinzufügst und dann Skripte hinzufügst.
API-Schlüsselberechtigungen für Daten-Speicher hinzufügen
Wenn einen API-Schlüssel für dieses Beispiel erstellt hast, stelle sicher, dass du die folgenden Einstellungen durchführst:
Aus dem Auswählen-API-System-Menü in der Zulassungen-Zugriff-Sektion wählen Sie Universum-Datenspeicher .
(Optional) In der Datenspeicher-Sektion wählen Sie API-Operationen für bestimmte Datenspeicher-Stores.
- Aktivieren Sie die Spezifische Daten-Store-Operationen umschalten. Standardmäßig laden fünf Daten-Stores automatisch, aber Sie können zusätzliche Daten-Stores über den + Datenspeicher hinzufügen -Button hinzufügen.
- Wählen Sie die Dropdown-Pfeile neben dem Namen eines Storeaus und wählen Sie die API-Operationen aus, an denen Sie möchten, dass der Datenspeicher zugänglich ist.
Wählen Sie API-Operationen für die gesamte Erlebnis.
- Klicken Sie auf das Erlebnis zum Hinzufügen auswählen -Dropdown und wählen Sie ein Erlebnis aus.
- In der Erfahrungsbetriebsmodus , klicken Sie auf die Dropdown-Pfeile und wählen Sie die Operationen, die Sie zu Ihrer API hinzufügen möchten. Dieses Beispiel wählt Eintritt lesen , Eintritt aktualisieren und 1> Eintritt-Schlüssel liste1> für die gesamte Erlebnis.
In der Sicherheits-Sektion, setzen Sie explizit den Zugriff auf die IP-Adresse mit der CIDR-Notation und setzen Sie ein explizites Ablaufdatum, damit Ihr Schlüssel nach diesem Datum automatisch nicht mehr funktioniert. Für dieses Beispiel können Sie die IP-Restriktion durch das Festlegen auf 0.0.0.0/0 und das A
Scripts für das Benutzer-Inventar-Supportportal hinzufügen
Nachdem du den API-Schlüssel mit den Berechtigungen für die Beispiel-App erstellt hast, musst du Python-Skripte hinzufügen, um App-Funktionen auszuführen. Die data_stores_methods.py
data_stores_methoden.py
import hashlib
import requests
import json
import base64
class DataStores:
def __init__(self):
self._base_url = "https://apis.roblox.com/datastores/v1/universes/{universeId}"
# API-Schlüssel wird in einer Umgebungs variablen gespeichert, die mit 'API_KEY' gekennzeichnet ist
self._apiKey = str(os.environ['API_KEY'])
self._universeId = "UNIVERSE_ID"
self.ATTR_HDR = 'Roblox-entry-Attributes'
self.USER_ID_HDR = 'Roblox-entry-UserIds'
self._objects_url = self._base_url +self._universeId+'/standard-datastores/datastore/entries/entry'
self._increment_url = self._objects_url + '/increment'
self._version_url = self._objects_url + '/versions/version'
self._list_objects_url = self._base_url +self._universeId+'/standard-datastores/datastore/entries'
def _H(self):
return { 'x-api-key' : self._apiKey }
def _get_url(self, path_format: str):
return f"{self._config['base_url']}/{path_format.format(self._config['universe_id'])}"
return r, attributes, user_ids
def get_entry(self, datastore, object_key, scope = None):
self._objects_url = self._base_url +self._universeId+'/standard-datastores/datastore/entries/entry'
headers = { 'x-api-key' : self._apiKey }
params={"datastoreName" : datastore, "entryKey" : object_key}
if scope:
params["scope"] = scope
r = requests.get(self._objects_url, headers=headers, params=params)
if 'Content-MD5' in r.headers:
expected_checksum = r.headers['Content-MD5']
checksum = base64.b64encode(hashlib.md5(r.content).digest())
#print(f'Expected {Expected_checksum}, hat {checksum})
attributes = None
if self.ATTR_HDR in r.headers:
attributes = json.loads(r.headers[self.ATTR_HDR])
user_ids = []
if self.USER_ID_HDR in r.headers:
user_ids = json.loads(r.headers[self.USER_ID_HDR])
return r
def list_entries(self, datastore, scope = None, prefix="", limit=100, allScopes = False, exclusive_start_key=None):
self._objects_url = self._base_url +self._universeId+'/standard-datastores/datastore/entries'
headers = { 'x-api-key' : self._apiKey }
r = requests.get(self._objects_url, headers=headers, params={"datastoreName" : datastore, "scope" : scope, "allScopes" : allScopes, "prefix" : prefix, "limit" : 100, "cursor" : exclusive_start_key})
return r
def increment_entry(self, datastore, object_key, incrementBy, scope = None, attributes=None, user_ids=None):
self._objects_url = self._base_url +self._universeId+'/standard-datastores/datastore/entries/entry/increment'
headers = { 'x-api-key' : self._apiKey, 'Content-Type': 'application/octet-stream' }
params={"datastoreName" : datastore, "entryKey" : object_key, "incrementBy" : incrementBy}
if scope:
params["scope"] = scope
r = requests.post(self._objects_url, headers=headers, params=params)
attributes = None
if self.ATTR_HDR in r.headers:
attributes = json.loads(r.headers[self.ATTR_HDR])
user_ids = []
if self.USER_ID_HDR in r.headers:
user_ids = json.loads(r.headers[self.USER_ID_HDR])
return r
update_inventar
import tutorialFunctionsDatastoresApi = tutorialFunctions.DataStores()# VeranlassendatastoreName = "Inventory"# Führe Schlüssel für ein Untermenü von Benutzern auf (vielleicht musst du den nächstenPageCursor verwenden, um andere Einreichungen anzuzeigen)keys = DatastoresApi.list_entries(datastoreName)print(keys.content)# Lesen Sie das Inventar für jeden Benutzerfor x in range(5):updatedObjectKey = "User_"+str(x+1)value = DatastoresApi.get_entry(datastoreName, updatedObjectKey)# ändere die antworttyp zu einer stringupdatedValue = value.json()print(updatedObjectKey + " has "+str(updatedValue)+" gems in their inventory")# Aktualisieren Sie die Währung jedes Benutzers um 10for x in range(5):updatedObjectKey = "User_"+str(x+1)value = DatastoresApi.increment_entry(datastoreName, updatedObjectKey, 10)# ändere die antworttyp zu einer stringupdatedValue = value.json()print(updatedObjectKey + " now has "+str(updatedValue)+" robux in their inventory")
Um zu testen, setzen Sie die API_KEY Umgebung variablen und führen Sie update_inventory Datei aus:
export API_KEY=... \python update_inventory
Externe persistente Leaderboard
Dieser Abschnitt zeigt ein konkretes Beispiel für die Erstellung einer externen persistenden Leaderboard in Python, in der Sie die Informationen Ihrer Benutzer in sortierten Daten-Stores aufzählen und lesen, Änderungen vornehmen und dann auf eine externe Website für die Aktionveröffentlichen.
Für dieses Beispiel nehmen wir an, dass gefolgte Profilezutrifft:
Das Codebeispiel erstellt eine vordefinierte Liste von Benutzernamen für die Demo-Zwecke. Für Ihre eigene Anwendung sollten Sie die Liste der tatsächlichen Benutzer in Ihrem Erlebnis verwenden.
Das Codebeispiel fügt jedem Benutzer, der sich dem Erlebnis für die Demo anschließt, 50 Punkte hinzu. Für Ihre eigene Anwendung sollten Sie die Regel basierend auf der Designphilosophie Ihres Erlebnisses definieren.
Von einem hohen Stufeaus kannst du deine Python-App aufbauen, indem du API-Schlüssel-Berechtigungen hinzufügst und dann Skripte hinzufügst.
API-Schlüsselberechtigungen für bestellte Datenstores hinzufügen
Die Beispiel-App erfordert vier Methoden, um ihre Funktionalitäten zu erreichen: List , 1> Create1> 2> , 5> 6> Update6> und 8> 9> Increment9>, so musst du die folgenden API-Schlüssel-Berechtigungen hinzufügen:
- Lesen für die Methode list.
- Schreiben Sie für Create , Update und 0> Increment0> Methoden.
Wenn einen API-Schlüssel für dieses Beispiel erstellt hast, stelle sicher, dass du die folgenden Operationen ausführst:
Vom Auswählen-Menü-System -Menü im Zugriffsberechtigungen-Bereich wählen Sie Ordnungskalte Daten-Speicher .
Fügen Sie Berechtigungen für API-Operationen hinzu, um auf die Ziel-Erlebnissen sortierte Daten zu lesen und zu schreiben.
- Klicken Sie auf das Select Experience to Add -Dropdown und wählen Sie die Ziel-Erlebnisse aus.
- In den Erlebnissen-Betriebsoperationen , erweitern Sie das Dropdown, um Lesen und Schreiben Operationen auszuwählen.
In der Sicherheits-Sektion, setzen Sie explizit den Zugriff auf die IP-Adresse mit der CIDR-Notation und setzen Sie ein explizites Ablaufdatum, damit Ihr Schlüssel nach diesem Datum automatisch nicht mehr funktioniert. Für dieses Beispiel können Sie die IP-Restriktion durch das Festlegen auf 0.0.0.0/0 und das A
Skripte für die Rangliste hinzufügen
Nachdem du den API-Schlüssel mit den Berechtigungen für die Beispiel-App erstellt hast, musst du Python-Skripte hinzufügen, um App-Funktionen auszuführen.
Die ordenado_data_stores.py -Datei zeigt, wie
ordered_data_stores.py
import hashlib
import requests
import json
class DataStores:
def __init__(self, config_file):
with open(config_file) as f:
self._config = json.load(f)
def _H(self):
return { 'x-api-key' : self._config["api_key"], 'Content-Type': 'application/json'}
def _get_url(self, path_format: str):
return f"{self._config['base_url']}/{path_format.format(self._config['universe_id'])}"
def list(self, datastore, scope, pageSize = 10, orderBy = "", filter = "", exclusiveStartKey = ""):
self._objects_url = self._config['api_key_url']+"universes/"+self._config["universe_id"]+"/orderedDataStores/"+datastore+"/scopes/"+scope+"/entries"
headers = { 'x-api-key' : self._config["api_key"] }
r = requests.get(self._objects_url, headers=headers, params={"max_page_size": pageSize, "order_by" : orderBy, "filter" : filter, "page_token" : ""})
return r
def create(self, datastore, scope, entry, data):
self._objects_url = self._config['api_key_url']+"universes/"+self._config["universe_id"]+"/orderedDataStores/"+datastore+"/scopes/"+scope+"/entries"
headers = self._H()
payload = json.dumps({
"value": 11
})
return requests.post(self._objects_url, params = {"id": entry }, data=payload, headers=headers)
def increment(self, datastore, scope, entry, incrementBy):
self._objects_url = self._config['api_key_url']+"universes/"+self._config["universe_id"]+"/orderedDataStores/"+datastore+"/scopes/"+scope+"/entries/"+entry+":increment"
headers = { 'x-api-key' : self._config["api_key"] }
payload = json.dumps({
"amount": 1
})
r = requests.post(self._objects_url, headers=headers, data=payload)
return r
bestenliste.py
import leaderboardEndpoints# konfigurationsdatei hier eingebendatastores = leaderboardEndpoints.DataStores("config.json")# VariableorderedDataStore = "PlayerScores"scope = "global"entryNames = ["Ragdoll", "Balinese", "Tabby", "Siamese"]# Erstellen Sie einen Eintrag und geben Sie jedem neuen Spieler 50 Punkte für den Beitritt zum Spielfor x in range(len(entryNames)):r = datastores.create(orderedDataStore, scope, entryNames[x], 50)# Zeige die Punktzahlen der Spieler anplayerScores = datastores.list(orderedDataStore, scope)print(playerScores.content)# Erhöhen Sie die erste Spieler-Punktzahl, um das Spiel zu gewinnendatastores.increment(orderedDataStore, scope, entryNames[0], 100)# Erhöhen Sie die Gesamtpunktzahl aller Spieler für die Teilnahme am Spielfor x in range(len(entryNames)):datastores.increment(orderedDataStore, scope, entryNames[x], 10)# Zeigen Sie die Rangliste mit den aktualisierten Punktzahlen anplayerScores = datastores.list(orderedDataStore, scope)print(playerScores.content)
konfigurieren
{
"universe_id": "",
"api_key_url": "https://apis.roblox.com/datenspeicher/bestellte-v1/",
"api_key": ""
}
Um zu testen, setzen Sie die API_KEY Umgebung variablen und führen Sie die leaderboard Datei aus:
export API_KEY=... \python leaderboard
Nachdem Sie das Testen abgeschlossen haben, können Sie die Rangliste auf der Website veröffentlichen oder in Roblox veröffentlichen, um mehr Reichweite zu erhalten.