데이터 저장소 사용자 가이드

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

Lua Class.DataStoreService 를 Studio 또는 라이브 서버에서 사용하는 것 외에도 개방 클라우드 API를 사용하여 외부 스크립트 및 도구에서 표준 데이터 저장소 및 주문형 데이터 저장소에 액세스하고 사용할 수 있습니다.

사용

이러한 API를 사용하여 작업 흐름의 여러 영역을 개선할 수 있습니다. 예를 들어:

  • 고객 지원 포털 : 데이터 저장소는 사용자 인벤토리 또는 기술 포인트와 같은 지속적인 사용자 자원을 지원 센터데 유용합니다. 고객 지원을 위해 이러한 자원을 업데이트해야 하는 경우 Studio 또는 경험에 매번 수동으로 참여하는 대신 웹 �

  • LiveOps 대시보드 : 라이브 운영 대시보드를 빌드하려면 API를 사용하여 경험 내 이벤트 예약 등의 라이브 운영 효율성을 개선할 수 있습니다. 예를 들어, 경험 내 이벤트를 예약하고 시간을 지정하여 발행하는 경우 깃발을 변경

  • 외부 순위표 】 : Roblox 외부에서 경험을 홍보하려면 순위표, 레이스의 순위표 등의 경험 정보를 실시간으로 가져와 외부 웹 사이트에 표시할 수 있습니다. 순위표에 액세스할 수 있도록 주문된 데이터 저장소에 대해 읽기 전용 액세스를 부여할 수 있습니다

  • 데이터 이민 자동화 : 데이터는 경험이 진화함에 따라 변경되거나 업데이트될 수 있습니다, 예를 들어 데이터 스키마를 업그레이드하여 새 기능을 수용하도록 데이터를 업데이트하는 경우. 데이터 손실을 피하려면 외부 스크립

Lua API와의 차이

Open Cloud API는 Lua DataStoreService 와 유사하지만, 몇 가지 다른 요구 사항을 알아야 합니다.

  • 유니버스 ID 및 데이터 저장소 이름 : Lua API와는 달리 Open Cloud APIs는 상태가 없으며 모든 곳에서 올 수 있므로 항상 유니버스 ID , 경험의 고유 식별자 및 데이터 저장소 이름을 보내면 됩니다. 유니버스 ID를 가져오는 방법에

  • 생성 및 업데이트용 별도 권한 생성 및 업데이트용 별도 권한 : Lua API는 DataStore:SetAsync() 를 호출했을 때 새로운 항목을 만들지만, Open Cloud 메서드는 별도입니다. 별도 권한은 특정 상황에서 더 안전하고 유연

  • 데이터 serialization : 모든 개방 클라우드 엔드포인트에서 네트워크 전송 전에 모든 데이터를 서IAL라이즈해야 합니다. 서IAL라이즈는 개체를 그 문자열로 변환하고 데시리얼라이즈는 그 반대입니다(문자열을 개체로 변환). Lua API는 보유서IAL라이즈

보안 권한

데이터 저장소는 일반적으로 사용자 프로필 및 가상 통화와 같은 민감한 정보를 저장합니다. 보안을 유지하기 위해 각 Open Cloud API에는 필요한 권한을 추가해야 하는 필수 권한이 있습니다. 예를 들어, 목록 기반 API에 대한 권

API 키 구성 을 사용하면 특정 경험 내의 모든 데이터 스토어에 대해 읽기, 읽음및 목록 항목을 포함한 세밀한 권한을 설정할 수 있습니다. 또는 키를 사용하여 모든 데이터 스토어 내에 필요한 하위 집합의 데이터 스토어에 액세스할

건축 도구

선호하는 언어를 사용하여 도구를 빌드하려면 Open Cloud APIs for data stores 를 사용하여 작업 요구 사항을 충족할 수 있습니다. 다음 예시에서는 데이터 저장소 및 순차 데이터 저장소를 사용하여 사용자 인벤토리 지원 포털을 구축하는 프로세스를 보여줍니다.

사용자 인벤토리 지원 포털

이 섹션에서는 Python에서 사용자 인벤토리 지원 포털을 구축하는 방법에 대한 구체적인 예를 제공합니다. 여기에서 하위 인벤토리 목록을 만들고 읽고 편집하고 다시 경험의 데이터 상점업데이트할 수 있습니다.

이 예에서는 팔로잉가정합니다:

  • 사용자 인벤토리를 저장하는 데이터 스토어의 이름은 Inventory 입니다.

  • 각 데이터 항목의 데이터 스키마는 #number개의 통화및 레벨포함합니다. 키는 단지 userId입니다.

  • Python 스크립트는 사전자를 기반으로 사용자 인벤토리의 하위 집합을 나열하고, 프로모션을 위해 가상 통화를 10개 증가하고 데이터를 업데이트합니다.

높은 레벨피톤치 키 권한을 추가한 다음 스크립트를 추가하여 Python 앱을 빌드할 수 있습니다.

데이터 저장소에 API 키 권한 추가

이 예에 대한 API 키를 생성할 때 다음 설정을 수행하세요: 키 생성 기능을 사용하여 키를 생성하세요

  1. 액세스 권한 섹션의 Select API System 메뉴에서 universe-datastores 를 선택합니다.

  2. (옵션) 데이터 스토어 섹션에서 API 작업을 사용자 정의 데이터 스토어에 대해 선택합니다.

    1. 특정 데이터 저장소 작업 토글을 활성화합니다. 기본적으로 다섯 개의 데이터 저장소가 자동으로 불러오다, 데이터 추가 버튼을 통해 추가 데이터 저장소를 더할 수 있습니다.
    2. 데이터 저장소 이름 옆에 있는 드롭다운 화살표를 선택한 다음 API 작업을 선택하십시오.Data 상점name, then select the API operations you want the data store to have access to.
  3. 전체 경험에 대한 API 작업을 선택합니다.

    1. 경험 추가 드롭다운을 클릭하고 경험을 선택합니다.
    2. In the 경험 작업 , click the dropdown arrow and select the operations you want to add to your API. This example selects 엔트리 읽기 , 엔트리 업데이트 and 1> 목록 키 읽기1> for the entire experience.
  4. In the 보안 보안 section, explicitly set IP access to the key using CIDR notation , and set an explicit expiration date so your key automatically stops working after that date. For this example, if you plan to do local testing first, you can remove the IP restriction by setting it to 0.0.0.0/0 and let it expire in 1>30 days1> .

사용자 인벤토리 지원 포털에 스크립트 추가

예시 앱에 필요한 권한을 가진 API 키를 만든 후 피트툰 스크립트를 추가하여 앱 기능을 수행해야 합니다. 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}, {checknum} 을 얻었습니다)
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
업데이트_인벤토리

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점을 추가합니다. 자신의 응용 프로그램에 대해 규칙을 기반으로 정의해야 합니다.

높은 레벨피톤치 키 권한을 추가한 다음 스크립트를 추가하여 Python 앱을 빌드할 수 있습니다.

주문된 데이터 저장소에 대한 API 키 권한 추가

예시 앱에는 기능을 구현하기 위해 네 가지 메서드가 필요합니다. List , 1> Create1> , 2> 5> Update5> 및 8> 9> Increment9> , 즉 다음 API 키 권한을 추가해야

  • 읽기 메서드에 대한 list 메서드.
  • 쓰기 for Create , Update , and 0>증가0> 메서드.

이 예에 대한 API 키를 생성할 때 다음 작업을 수행하세요: 키 생성

  1. 액세스 권한 섹션의 Select API System 메뉴에서 Ordered Data Stores를 선택합니다.

  2. 대상 경험에서 순차적 데이터 저장소를 읽고 쓰도록 API 작업에 권한을 추가합니다.

    1. 경험 추가 선택 대화 상자를 클릭하고 대상 경험을 선택합니다.
    2. In the 경험 작업 , the dropdown을 확장하여 ReadWrite 작업을 선택합니다.
  3. In the 보안 보안 section, explicitly set IP access to the key using CIDR notation , and set an explicit expiration date so your key automatically stops working after that date. For this example, if you plan to do local testing first, you can remove the IP restriction by setting it to 0.0.0.0/0 and let it expire in 1>30 days1> .

순위표에 스크립트 추가

예시 앱에 필요한 권한을 가진 API 키를 만든 후 앱 기능을 수행하기 위해 Python 스크립트를 추가해야 합니다.

ippedi 파일은 정렬된 데이터

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
리더보드.py

import leaderboardEndpoints
# 여기에 구성 파일 입력
datastores = leaderboardEndpoints.DataStores("config.json")
# 변수
orderedDataStore = "PlayerScores"
scope = "global"
entryNames = ["Ragdoll", "Balinese", "Tabby", "Siamese"]
# 새 플레이어 50 포인트 생성 및 게임에 참여하는 각 플레이어에게 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

테스트를 완료한 후 리더보드를 웹 사이트 밖에 게시하거나 삽입하여 더 많은 접근을 얻을 수 있습니다.