Open Cloud API ของเอนจินช่วยให้คุณจัดการวัตถุ Instance ในเกม Roblox ของคุณจากเว็บ
ข้อจำกัดของเบต้า
API เหล่านี้อยู่ในสถานะเบต้าและมีข้อจำกัดดังต่อไปนี้:
คุณสามารถอ่านและอัพเดตวัตถุ Script, LocalScript, และ ModuleScript เท่านั้น
คุณไม่สามารถอัพเดตสคริปต์ที่เปิดอยู่ใน Roblox Studio
คุณไม่สามารถอัพเดตสคริปต์ที่เป็นส่วนหนึ่งของ แพ็คเกจ
คุณสามารถใช้การตรวจสอบ API key เท่านั้น สร้าง API key โดยเพิ่ม universe-place-instances เป็นระบบ API
คุณต้องระบุเกมที่คุณต้องการให้คีย์เข้าถึง พร้อมกับขอบเขตการอนุญาตการอ่านและการเขียนที่ต้องการ

คุณต้องเปิดใช้งาน เซสชันร่วม สำหรับเกมที่คุณต้องการเข้าถึง
เนื้อหาของการร้องขอ เช่น การ อัพเดตอินสแตนซ์ จะมีขนาดจำกัดที่ 200 KB
รายชื่อเด็ก
แสดงรายชื่อเด็กทั้งหมดของอินสแตนซ์เฉพาะโดยการระบุ ID ของอินสแตนซ์และ เรียกใช้เมธอด รายการเด็กของอินสแตนซ์
import requests
# สร้างที่ https://create.roblox.com/dashboard/credentials
apiKey = "<API_KEY>"
# หาที่ https://create.roblox.com/dashboard/creations ในเมนูที่ล้นของกระเบื้องเกม
universeId = "<UNIVERSE_ID>"
# หาที่ ID ของ Start Place ที่ https://create.roblox.com/dashboard/creations ในเมนูที่ล้นของกระเบื้องเกม
placeId = "<PLACE_ID>"
# ID เริ่มต้นสำหรับรากของโมเดลข้อมูลของสถานที่ใด ๆ
instanceId = "root"
# ส่วนหัวการร้องขอ
apiKeyHeaderKey = "x-api-key"
# URL จุดสิ้นสุดสำหรับวิธีการรายการเด็ก
listChildrenUrl = "https://apis.roblox.com/cloud/v2/universes/%s/places/%s/instances/%s:listChildren"
def ListChildren():
url = listChildrenUrl % (universeId, placeId, instanceId)
headerData = {apiKeyHeaderKey: apiKey}
results = requests.get(url, headers=headerData)
return results
response = ListChildren()
print("ผลลัพธ์ของการดำเนินการ:", response.status_code, response.text)
# แยกพาธของวัตถุ Operation เพื่อใช้ในการรับข้อมูล Resource อินสแตนซ์ ดูส่วนการ Polling for Results สำหรับข้อมูลเพิ่มเติม
operationPath = response.json()['path']
แทนที่จะเพียงแค่แสดงรายการเด็ก การตอบกลับจะรวมถึงวัตถุ Operation ที่มีจุดสิ้นสุดที่แตกต่างกัน ให้ poll จุดสิ้นสุดนี้ เพื่อดึงข้อมูลจริงของรายชื่อเด็กแบบไม่ซิงโครนัส ตัวอย่างโค้ดที่สมบูรณ์ยิ่งขึ้นมีลักษณะดังนี้:
import requests
import time
apiKey = "<API_KEY>"
universeId = "<UNIVERSE_ID>"
placeId = "<PLACE_ID>"
instanceId = "root"
apiKeyHeaderKey = "x-api-key"
listChildrenUrl = "https://apis.roblox.com/cloud/v2/universes/%s/places/%s/instances/%s:listChildren"
getOperationUrl = "https://apis.roblox.com/cloud/v2/%s"
numberOfRetries = 10
retryPollingCadence = 5
doneJSONKey = "done"
def ListChildren():
url = listChildrenUrl % (universeId, placeId, instanceId)
headerData = {apiKeyHeaderKey: apiKey}
results = requests.get(url, headers=headerData)
return results
def GetOperation(operationPath):
url = getOperationUrl % (operationPath)
headerData = {apiKeyHeaderKey: apiKey}
results = requests.get(url, headers=headerData)
return results
def PollForResults(operationPath):
currentRetries = 0
while (currentRetries < numberOfRetries):
time.sleep(retryPollingCadence)
results = GetOperation(operationPath)
currentRetries += 1
if (results.status_code != 200 or results.json()[doneJSONKey]):
return results
response = ListChildren()
print("ผลลัพธ์ของการดำเนินการ:", response.status_code, response.text)
# แยกพาธของวัตถุ Operation เพื่อใช้ในการ poll ข้อมูล Resource อินสแตนซ์
operationPath = response.json()['path']
response = PollForResults(operationPath)
print("การตอบกลับ:", response.status_code, response.text)
ผลลัพธ์สุดท้ายอาจมีลักษณะดังนี้:
{
"path": "universes/1234567890/places/98765432109/instances/root/operations/a1a2a3a4-a1a2-a1a2-a1a2-a1a2a3a4a5a6",
"done": true,
"response": {
"@type": "type.googleapis.com/roblox.open_cloud.cloud.v2.ListInstanceChildrenResponse",
"instances": [
{
"path": "universes/1234567890/places/98765432109/instances/b1b2b3b4-b1b2-b1b2-b1b2-b1b2b3b4b5b6",
"hasChildren": true,
"engineInstance": {
"Id": "b1b2b3b4-b1b2-b1b2-b1b2-b1b2b3b4b5b6",
"Parent": "a1a2a3a4-a1a2-a1a2-a1a2-a1a2a3a4a5a6",
"Name": "Workspace",
"Details": {}
}
},
...
]
}
}
คุณสามารถวนซ้ำผ่าน JSON เพื่อหาหมายเลข ID ของอินสแตนซ์เฉพาะได้:
instances = response.json()['response']['instances']replicatedStorageId = ""for i in instances:if i['engineInstance']['Name'] == "ReplicatedStorage":replicatedStorageId = i['engineInstance']['Id']if replicatedStorageId:# ตอนนี้คุณมี ID อินสแตนซ์และสามารถรับข้อมูลหรืออัพเดตมันได้else:# ไม่พบชื่อ
สคริปต์มีข้อมูลเพิ่มเติมในวัตถุ Details เช่น ประเภทของสคริปต์ แหล่งที่มา และว่าเปิดใช้งานอยู่หรือไม่
รับอินสแตนซ์
วิธีนี้จะคืนค่า อินสแตนซ์ เดียว
import requests
# สร้างที่ https://create.roblox.com/dashboard/credentials
apiKey = "<API_KEY>"
# หาที่ https://create.roblox.com/dashboard/creations ในเมนูที่ล้นของกระเบื้องเกม
universeId = "<UNIVERSE_ID>"
# หาที่ ID ของ Start Place ที่ https://create.roblox.com/dashboard/creations ในเมนูที่ล้นของกระเบื้องเกม
placeId = "<PLACE_ID>"
# ID เริ่มต้นสำหรับรากของโมเดลข้อมูลของสถานที่ใด ๆ
instanceId = "<INSTANCE_ID>"
# ส่วนหัวการร้องขอ
apiKeyHeaderKey = "x-api-key"
# URL จุดสิ้นสุดสำหรับวิธีการรับอินสแตนซ์
getInstanceUrl = "https://apis.roblox.com/cloud/v2/universes/%s/places/%s/instances/%s"
def GetInstance():
url = getInstanceUrl % (universeId, placeId, instanceId)
headerData = {apiKeyHeaderKey: apiKey}
return requests.get(url, headers=headerData)
response = GetInstance()
print("การตอบกลับ:", response.status_code, response.text)
# แยกพาธของวัตถุ Operation จากการตอบกลับ ดูส่วนการ Polling for Results สำหรับข้อมูลเพิ่มเติม
operationPath = response.json()['path']
เช่นเดียวกับวิธีการรายการเด็กของอินสแตนซ์ การตอบกลับจะรวมถึงวัตถุ Operation ที่คุณต้อง polling เพื่อดึงข้อมูลอินสแตนซ์ที่แท้จริง ดู poll for results สำหรับข้อมูลเพิ่มเติม
อัพเดตอินสแตนซ์
หลังจากที่คุณได้รับ ID อินสแตนซ์ที่เหมาะสมแล้ว คุณสามารถอัพเดตได้ Poll for results หลังจากทำการเรียกคำขออัพเดตครั้งแรก
import json
import requests
# สร้างที่ https://create.roblox.com/dashboard/credentials
apiKey = "<API_KEY>"
# หาที่ https://create.roblox.com/dashboard/creations ในเมนูที่ล้นของกระเบื้องเกม
universeId = "<UNIVERSE_ID>"
# หาที่ ID ของ Start Place ที่ https://create.roblox.com/dashboard/creations ในเมนูที่ล้นของกระเบื้องเกม
placeId = "<PLACE_ID>"
instanceId = "<INSTANCE_ID>"
instanceType = ""
propertyName = ""
propertyValue = ""
# ส่วนหัวการร้องขอ
apiKeyHeaderKey = "x-api-key"
contentTypeHeaderKey = "Content-type"
contentTypeHeaderValue = "application/json"
# URL จุดสิ้นสุดสำหรับวิธีการอัพเดตอินสแตนซ์
updateInstanceUrl = "https://apis.roblox.com/cloud/v2/universes/%s/places/%s/instances/%s"
# คีย์ JSON
detailsJSONKey = "Details"
engineInstanceJSONKey = "engineInstance"
def GeneratePostData():
propertiesDict = {propertyName: propertyValue}
detailsDict = {instanceType: propertiesDict}
instanceDict = {detailsJSONKey: detailsDict}
outerDict = {engineInstanceJSONKey: instanceDict}
return json.dumps(outerDict)
def UpdateInstance(postData):
url = updateInstanceUrl % (universeId, placeId, instanceId)
headerData = {apiKeyHeaderKey: apiKey,
contentTypeHeaderKey: contentTypeHeaderValue}
return requests.patch(url, headers=headerData, data=postData)
postData = GeneratePostData()
response = UpdateInstance(postData)
print("การตอบกลับ:", response.status_code, response.text)
# แยกพาธของวัตถุ Operation จากการตอบกลับ Poll for results เพื่อดำเนินการ
# อัพเดต
operationPath = response.json()['path']
Poll for results
วิธีการ Instance ขณะนี้ทั้งหมดส่งคืนวัตถุ Operation แทนทรัพยากรที่คุณร้องขอ วัตถุนี้ช่วยให้คุณดำเนินการตามต้นฉบับแบบไม่ซิงโครนัส ใช้พาธของวัตถุ Operation (รวมอยู่ในคำตอบครั้งแรก) เพื่อ polling เมื่อต้นฉบับพร้อมใช้งาน
คุณสามารถใช้กลยุทธ์การ polling ที่หลากหลาย เช่น ใช้การถอยกลับแบบเพิ่มขึ้น หรือการหน่วงเวลาคงที่ในระหว่างการร้องขอ ตัวอย่างต่อไปนี้จะทำการ polling ทุกห้าส่วนวินาที โดยสูงสุดถึง 10 ครั้ง
import requests
import time
# สร้างที่ https://create.roblox.com/dashboard/credentials
apiKey = "<API_KEY>"
# ใช้พาธของ Operation จากคำขอเริ่มต้นของคุณ
# มีรูปแบบ "universes/<UNIVERSE_ID>/places/<PLACE_ID>/instances/<INSTANCE_ID>/operations/<OPERATION_ID>"
operationPath = "<OPERATION_PATH>"
# คงที่การ polling
numberOfRetries = 10
retryPollingCadence = 5
# ส่วนหัวการร้องขอ
apiKeyHeaderKey = "x-api-key"
# URL จุดสิ้นสุดสำหรับการ polling การดำเนินการระยะยาว
getOperationUrl = "https://apis.roblox.com/cloud/v2/%s"
# คีย์ JSON
doneJSONKey = "done"
def GetOperation(operationPath):
url = getOperationUrl % (operationPath)
headerData = {apiKeyHeaderKey: apiKey}
results = requests.get(url, headers=headerData)
return results
def PollForResults(operationPath):
currentRetries = 0
while (currentRetries < numberOfRetries):
time.sleep(retryPollingCadence)
results = GetOperation(operationPath)
currentRetries += 1
if (results.status_code != 200 or results.json()[doneJSONKey]):
return results
response = PollForResults(operationPath)
print("การตอบกลับ:", response.status_code, response.text)
เดโมร้านขายยา
เดโมร้านขายยาจาก Google Sheets แสดงให้คุณเห็นวิธีการอัพเดตสคริปต์ในเกมจากเว็บ เดโมประกอบด้วยดังนี้:
- สถานที่ที่ไม่ได้ล็อคที่มี UI ปลอมที่แสดงน้ำยาต่าง ๆ และราคา
- ไฟล์ .ods ที่คุณนำเข้าไปยัง Google Sheets สเปรดชีตนี้ช่วยให้คุณ ระบุและอัพเดตค่าต่าง ๆ สำหรับคุณสมบัติภายในเกม
- โค้ดสำหรับ Google Apps Script ที่อ่านข้อมูลจาก Google Sheet และ อัพเดตสคริปต์ ReplicatedStorage > ItemList ในเกมร้านขายยา
ตั้งค่าเดโม
ไปที่ เดโมร้านขายยา หน้า Discover คลิกที่เมนูที่ล้น แล้วคลิก Edit in Studio Studio จะเปิดด้วยสำเนาของสถานที่
คลิก File → Save to Roblox และกรอกข้อมูลที่จำเป็นเพื่อ บันทึกเดโมร้านขายยาเป็นสถานที่เริ่มต้นสำหรับเกมของคุณ ทดสอบ เกม คุณควรเห็น UI สำหรับเดโมร้านขายยา สังเกตชื่อ ค่าใช้จ่าย และสีของน้ำยา คุณจะต้องเปลี่ยนแปลงภายหลังโดยใช้ Open Cloud!
ตั้งค่าตาราง
- ดาวน์โหลด ไฟล์ สเปรดชีตร้านขายยา
- ไปที่ Google Sheets และคลิก Blank Spreadsheet
- ในแผ่นงานที่ปรากฏขึ้น คลิก File > Import และคลิกที่ แท็บ Upload
- ลากไฟล์สเปรดชีตร้านขายยาไปยังหน้าต่างการอัปโหลด
- เลือก Replace spreadsheet และคลิก Import data
- ในแท็บ AppScript ของแผ่นงาน ให้นำโค้ดในเซลล์ A1 ไปวาง
- คลิกที่เมนู Extensions > Apps Script และวางโค้ดลงในไฟล์ Code.gs จากนั้นบันทึกโปรเจ็กต์
- กลับไปที่สเปรดชีต เลือกแท็บ Update Potion Shop คลิกปุ่ม Update Script คลิกที่เมนูที่ล้นแล้วเลือก Assign script
- ในหน้าต่าง Assign script ให้ป้อน UpdateScript และคลิก OK
สร้าง API key
ไปที่หน้า Creator Hub Open Cloud API Keys และคลิก Create API Key
กรอกแบบฟอร์มด้วยข้อมูลต่อไปนี้
- Name: PotionShop
- API System: เพิ่มระบบ API universe-place-instances เพิ่มเกมร้านขายยาของคุณไปยังระบบนี้ สำหรับ Experience Operations ให้เพิ่มการเข้าถึงการอ่านและการเขียน
- Accepted IP Addresses: เพิ่ม 0.0.0.0/0 เป็นที่อยู่ IP
- Expiration: ไม่มีวันหมดอายุ
- คลิก Save & Generate Key และคลิก Copy Key to Clipboard
วาง API key ในเซลล์ API Key (D2) บนแถบ Intro ของ Google Sheet ของคุณ
รับ ID เอกภพและสถานที่
- ไปที่หน้า Creator Hub Creations เลื่อนเมาส์ไปที่กระเบื้องเกมของร้านขายยาแล้วคลิกที่เมนูที่ล้น
- เลือก Copy Universe ID และวางลงในเซลล์ Universe ID (E2) บนแทบ Intro ของ Google Sheet ของคุณ
- เลือก Copy Start Place ID และวางลงในเซลล์ Place ID (F2) บนแทบ Intro ของ Google Sheet ของคุณ
อัพเดตค่าของสคริปต์
- ในแท็บ Update Potion Shop ของแผ่นงาน ให้ปรับค่าใด ๆ ที่คุณ ต้องการและคลิกปุ่ม Update Script
- หาก Google Sheets ขอให้คุณอนุญาตให้คลิก OK และอนุญาตให้ บัญชีของคุณเรียกใช้สคริปต์
- ใน Studio เล่นเกมเพื่อดูการเปลี่ยนแปลงที่สะท้อนอยู่ จากหน้าต่าง Explorer คุณสามารถเปิดสคริปต์ ReplicatedStorage > ItemList เพื่อดูการเปลี่ยนแปลงได้