データストアの使用ガイド

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

Lua Class.DataStoreService を Studio やライブサーバーで使用することに加えて、DataStoreServiceおよび注文のデータストアを外部のスクリプトやツールでアクセスし、使用できます。

使用

これらの API を使用して、ワークフローのいくつかのエリアを改善できます:

  • カスタマーサポートポータル : データストアは、ユーザーのインベントリやスキルポイントなどの持続的なユーザーリソースを保存するのに便利です。たとえば、アイテムやユーザーのインベントリなどの持続的なユーザーリソースを保存するために、Studio を使用するか、エクスペ

  • LiveOps ダッシュボード : ライブオペレーションズダッシュボードを構築するには、AP保管を使用してライブオペレーションズの効率を向上させるために、スケジュールイベントなどのライブオペレーションをスケジュールできます。コードを事前に読み込み、データストアの機能フィー

  • エクスペリエンスのリーダーボードを外部に掲載する : エクスペリエンスの外の Roblox を昇進するために、レースのリーダーボードなどのエクスペリエンス情報をリアルタイムで取得し、外部のウェブサイトに表示できます。サーバーによって期間的に最新のデータをリクエストし、ウェブページを更新す

  • データの移行オートメーション : データは、エクスペリエンスが進化するにつれて変更されたり、更新されたりする可能性があります。たとえば、データのスキーマをアップグレードして新機能に対応させるなど、既存のユーザーデータを失わないようにするためにデータ

Lua API との違い

Open Cloud API は Lua の DataStoreService と似ていますが、いくつかの異なる要件に気をつけてください:

  • ユニバース ID とデータストア名 : Lua API とは異なり、Open Cloud API はステートレスであり、どこからでも来ることができるため、 ユニバース ID 、エクスペリエンスのユニークな識別子、およびデータストア名を必ず提供する必要があります。For more information on how to

  • 作成と更新の許可を分離することができます。 : Lua API は、DataStore:SetAsync() が存在しない場合に新しいエントリを作成および更新しますが、Open Cloud メソッド は、特定の状況ではセキュアであり、より柔軟なオプシ

  • データ serialization : すべてのオープンクラウドのエン文字列ポイントには、ネットワークの前にすべてのデータをシリアライズする必要があります。シリアライズは、オブジェクトをそのストリングに変換することを意味し、デシリアル化はその逆です(オブジェクトをストリングに変換する)。Lua API は自動

セキュリティ許可

データストアは通常、ユーザープロフィールやバーチャル通貨などの敏感な情報を保存します。セキュリティを維持するためには、各 Open Cloud API に対応する必要な権限を追加する必要があります。たとえ、必要な権限を追加しない場合は、API コー

API キーを構成する とき、既読み取り、書き込み、およびリストのエントリなど、各データストア内のデータストアのためのグラナイアルパーミッションを設定できます。また、키を読み込む 、すべてのデータストア内のデータストアを読み取る、および、ツールを展開する

構築ツール

お好みの言語を使用して、ツールを データストアのオープンクラウド API を使用して、オペレーションのニーズに応えるために構築できます。次の例は、Python で ユーザーインベントリサポートポータル を構築するプロセスを示しています。標準データストアとオーダーデータストアを使用し

ユーザーインベントリサポートポータル

このセクションでは、Python でユーザーインベントリのサポートポータルを構築する方法のコンクリートな例を提供します。ここでは、ユーザーのインベントリのサブセットをリストし、編集し、エクスペリエンスのデータストアに更新します。

この例には、フォロー中のことを想定してください:

  • ユーザーのインベントリを保存するデータストアの名前は Inventory です。

  • 各データエントリのデータスキームは "userId": {"currency": number, "weapon": string, "level": number} 武通貨は strin文字列、 レベルは number です。キーは userId です。

  • Python スクリプトは、プレフィックスに基づくユーザーのインベントリのサブセットをリストし、プロモーションのためにバーチャル通貨を 10 増やし、データを更新します。

高度なレベルでは、API キーの権限を追加してからスクリプトを追加することで、Python アプリを構築できます。

データストアの API キー権限を追加する

この例の API キーを作成するときは、次の設定を行ってください:

  1. [アクセス権限] セクションの Select API System メニューから universe-datastores を選択します。

  2. (オプション) データストアの データストア セクションで、特定のデータストアの API オペレーションを選択します。

    1. 特定のデータストアオペレーション トグルを有効にします。デフォルトで読み込む、5つのデータストアが自動的にロードされますが、 [データストアをリストに追加] ボタンを通じて追加のデータストアを追加できます。
    2. データスト保管の名前の隣にあるドロップダウン矢印を選択し、データストアにアクセスしたい API オペレーションを選択します。
  3. エクスペリエンス全体の API オペレーションを選択します。

    1. クリックして、 エクスペリエンスを選択して追加 ドロップダウンとエクスペリエンスを選択します。
    2. エクスペリエンスオペレーションズ で、ドロップダウンアローをクリックし、API に追加するオペレーションを選択します。この例では、エクスペリエンスの読み込み、エクスペリエンスの更新、およびエクスペリエンスのキーをリストを選択しています。
  4. In the セキュリティ セクション, CIDR 記号 を使用して、キーに IP アクセスを明示的に設定し、その後のエクスピレーション日を明示的に設定して、キーがその日後に自動的に作動を停止するようにします。この例では、最初に

ユーザーインベントリサポートポータルのスクリプトを追加する

例のアプリに必要なパーミッションを持つ API キーを作成した後、Python スクリプトを追加してアプリの機能を実行する必要があります。data

data_stores_methods.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 キーは 'API_KEY' で表示される環境変数に保存されます
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}, が {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 inventory

import tutorialFunctions
DatastoresApi = tutorialFunctions.DataStores()
# セットアップ
datastoreName = "Inventory"
# ユーザーのサブセットのキーをリストします (次のページカーソルを使用して他のエントリを表示する必要がある場合があります)
keys = DatastoresApi.list_entries(datastoreName)
print(keys.content)
# 各ユーザーのインベントリを読み取る
for x in range(5):
updatedObjectKey = "User_"+str(x+1)
value = DatastoresApi.get_entry(datastoreName, updatedObjectKey)
# 応答タイプを文字列楽器に変更
updatedValue = value.json()
print(updatedObjectKey + " has "+str(updatedValue)+" gems in their inventory")
# 各ユーザーの通貨を 10 単位更新
for x in range(5):
updatedObjectKey = "User_"+str(x+1)
value = DatastoresApi.increment_entry(datastoreName, updatedObjectKey, 10)
# 応答タイプを文字列楽器に変更
updatedValue = value.json()
print(updatedObjectKey + " now has "+str(updatedValue)+" robux in their inventory")

テストするには、API_KEY 環境変数を設定し、update_inventory ファイルを実行します:


export API_KEY=... \
python update_inventory

外部の持続的なリーダーボード

このセクションでは、Python で外部の持続的リーダーボードを作成する方法のコンクリートな例を説明しています。ここでは、ユーザーの情報を順序化されたデータストアに格納し、編集し、最終的に外部のウェブサイトにプロモーション開することができます。

この例には、フォロー中のことを想定してください:

  • コードサンプルは、デモ目的のユーザー名のプレディファインドリストを作成します。自分のアプリケーションでは、エクスペリエンス内のユーザー名リストを使用する必要があります。

  • コードサンプルは、エクスペリエンスのデモ目的で参加するユーザーに 50 ポイントを追加します。自分のアプリケーションの場合、エクスペリエンスのデザインに基づいてルールを定義する必要があります。

高度なレベルでは、API キーの権限を追加してからスクリプトを追加することで、Python アプリを構築できます。

注文データストア用のAPI キー許可を追加する

このアプリの機能を実装するには、ListCreate 、Increment 、2> Update2> 、5> Increment5> 、8> Update8> 、1> Increment1> 、4> Increment4> 、7> Increment

  • Read for the list メソッド。
  • 書き込み for Create , Update , and 0> Increment0> メソッド。

この例の API キーを作成するときは、次の操作を実行する必要があります:

  1. [アクセス権限] セクションの Select API System メニューから Ordered Data Stores を選択します。

  2. API オペレーションの権限を追加して、ターゲットエクスペリエンスでオーダーされたデータストアを読み書きします。

    1. クリックして、 エクスペリエンスを選択して追加 ドロップダウンをクリックし、ターゲットエクスペリエンスを選択します。
    2. In the エクスペリエンスオペレーションズ , expand the dropdown to select Read and Write オペレーション。
  3. In the セキュリティ セクション, CIDR 記号 を使用して、キーに IP アクセスを明示的に設定し、その後のエクスピレーション日を明示的に設定して、キーがその日後に自動的に作動を停止するようにします。この例では、最初に

リーダーボードにスクリプトを追加する

例のアプリに必要なパーミッションを持つ API キーを作成した後、Python スクリプトを追加してアプリの機能を実行する必要があります。

ファイル ordened_data_stores.py

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
leaderboard.py

import leaderboardEndpoints
# ここに設定ファイルを入力
datastores = leaderboardEndpoints.DataStores("config.json")
# 変数
orderedDataStore = "PlayerScores"
scope = "global"
entryNames = ["Ragdoll", "Balinese", "Tabby", "Siamese"]
# エントリを作成し、新規プレイヤー 50 ポイントを与えゲーム
for x in range(len(entryNames)):
r = datastores.create(orderedDataStore, scope, entryNames[x], 50)
# プレイヤーのスコアを表示
playerScores = datastores.list(orderedDataStore, scope)
print(playerScores.content)
# ゲームに勝利するために最初のプレイヤーのスコアを増加させます
datastores.increment(orderedDataStore, scope, entryNames[0], 100)
# ゲームに参加するすべてのプレイヤーのスコアをすべて増加させます
for x in range(len(entryNames)):
datastores.increment(orderedDataStore, scope, entryNames[x], 10)
# 更新されたスコアでリーダーボードを表示する
playerScores = datastores.list(orderedDataStore, scope)
print(playerScores.content)
設定

{
"universe_id": "",
"api_key_url": "https://apis.roblox.com/datastores/ordered-v1/",
"api_key": ""
}

テストするには、API_KEY環境変数を設定し、leaderboardファイルを実行します:


export API_KEY=... \
python leaderboard

テストを完了した後、リーダーボードを Roblox 以外のウェブサイトに公開または挿入して、より多くのリーチを得ることができます。