นอกจากการเข้าถึง คลังข้อมูล โดยใช้ API เครื่องยนต์ ( ) ใน Studio หรือเซิร์ฟเวอร์สดแล้ว คุณสามารถใช้ API เปิดคลาวด์เพื่อเข้าถึงและใช้ ข้อมูลมาตรฐาน และ คลังข้อมูลที่สั่งซื้อ จากสคริปต์และเครื่องมือภายนอกที่มีการควบคุมการเข้าถึงและความปลอดภัยแบบละเอียด โดยใช้การควบคุมการเข้าถึงและความปลอดภัยแบบละเอียด
การใช้งาน
คุณสามารถปรับปรุงหลายพื้นที่ในกระบวนการทำงานของคุณโดยการเข้าถึงข้อมูลด้วย API เหล่านี้ เช่น:
พอร์ทัลสนับสนุนลูกค้า : คลังข้อมูลมีประโยชน์สำหรับการจัดเก็บทรัพยากรผู้ใช้ถาวร เช่น รายการในคลังสินค้าของผู้ใช้หรือจุดทักษะบางครั้งคุณต้องอัปเดตทรัพยากรเหล่านี้เพื่อสนับสนุนลูกค้าแทนที่จะใช้ Studio หรือเข้าร่วมประสบการณ์โดยตรง คุณสามารถสร้างแอปพลิเคชันเว็บเพื่อให้ตัวแทนบริการลูกค้าสามารถจัดการคำขอสนับสนุนลูกค้าได้โดยตรง เช่น ดูและแก้ไขคลังสินค้าของผู้ใช้และออกใบเสร็จคืน
แดชบอร์ด LiveOps : คุณสามารถสร้างแดชบอร์ด LiveOps โดยใช้ API เพื่อเพิ่มประสิทธิภาพของการดำเนินการสดตัวอย่างเช่น คุณอาจกำหนดการจัดกิจกรรมล่วงหน้า ซ่อนไว้ภายใต้ธงคุณสมบัติในฐานข้อมูลในฐานะส่วนหนึ่งของข้อมูลการกำหนดค่าในคลังข้อมูล และกำหนดเวลาที่จะพลิกธงเพื่อเผยแพร่กิจกรรมเซิร์ฟเวอร์ประสบการณ์ของคุณสามารถตรวจพบการเปลี่ยนแปลงนี้โดยอ่านธงเพื่อเปิดตัวเหตุการณ์
ลีดเดอร์บอร์ดภายนอก : เพื่อส่งเสริมประสบการณ์ของคุณนอก Roblox คุณสามารถดึงข้อมูลประสบการณ์ของคุณ เช่น ลีดเดอร์บอร์ดของการแข่งขัน ในเวลาจริงและแสดงบนเว็บไซต์ภายนอกคุณสามารถให้การเข้าถึงอ่านได้เฉพาะสำหรับที่เก็บข้อมูลที่สั่งซื้อไว้สำหรับเว็บไซต์เพื่อร้องขอข้อมูลล่าสุดผ่านทาง HTTP และอัปเดตหน้าเว็บได้เป็นระยะ
การอัตโนมัติการย้ายข้อมูล : ข้อมูลอาจเปลี่ยนแปลงหรืออัปเดตตามประสบการณ์ของคุณ เช่น อัปเกรดสเต็มภาพข้อมูลเพื่อรองรับคุณสมบัติใหม่เพื่อหลีกเลี่ยงการสูญเสียข้อมูลผู้ใช้ที่มีอยู่ บางครั้งคุณต้องย้ายคลังข้อมูลของคุณจากสคูลเก่าไปยังใหม่คุณสามารถเขียนสคริปต์ภายนอกที่อ่านแต่ละรายการจากคลังข้อมูลปัจจุบันและแปลงข้อมูลเป็นสคริปต์ใหม่และเขียนรายการกลับไปยังคลังข้อมูลใหม่เพื่ออัตโนมัติการย้ายข้อมูล
ความแตกต่างกับ Engine API
แม้ว่า API เมฆเปิดจะคล้ายกับ DataStoreService แต่มีความแตกต่างสำคัญไม่กี่อย่าง:
ชื่อ ID และชื่อร้านข้อมูลของจักรวาล : ไม่เหมือนกับ Engine APIเครื่องยนต์, Open Cloud APIs เป็นไร้สถานะและสามารถมาจากทุกที่, ดังนั้นคุณต้องให้ universal ID , ตัวระบุเฉพาะของประสบการณ์ของคุณ, และชื่อร้านข้อมูล เมื่อส่งคำขอ เสมอสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีรับ ID จักรวาล ดูที่ ID จักรวาล
สิทธิ์ที่แยกต่างหากสำหรับการสร้างและการปรับปรุง : API เครื่องยนต์สร้างบันทึกใหม่หากไม่มีอยู่เมื่อคุณเรียก DataStore:SetAsync() แต่วิธีการ Open Cloud สำหรับการสร้างและการปรับปรุงบันทึกแยกต่างหากสิทธิ์ที่แยกออกจากกันสามารถปลอดภัยและยืดหยุ่นมากขึ้นในสถานการณ์บางอย่างตัวอย่างเช่น คุณสามารถสร้างเครื่องมือสนับสนุนลูกค้าที่สามารถแก้ไขโปรไฟล์ของผู้ใช้ที่มีอยู่ได้ แต่ไม่สามารถสร้างโปรไฟล์ผู้ใช้ใหม่ได้
การเขียนโค้ดข้อมูล : จุดจบเครือข่ายทั้งหมดของคลาวด์เปิดทั้งหมดต้องการให้คุณเขียนโค้ดข้อมูลทั้งหมดก่อนการส่งเครือข่ายการเซริฟิเคชันหมายถึงการแปลงวัตถุเป็นสตริงการถอดรหัสคือสิ่งที่ตรงกันข้าม (แปลงสตริงเป็นวัตถุ)อินเทอร์เฟซ API เขียนและถอดรหัสเนื้อหาการเข้าสู่ระบบโดยอัตโนมัติ แต่สำหรับ Open Cloud คุณต้องสร้างหรือแยกข้อมูลการเข้าสู่ระบบของคุณด้วย JSON เป็นเจ้าของ
สิทธิ์ความปลอดภัย
คลังข้อมูลมักจะเก็บข้อมูลที่ละเอียดอ่อน เช่น สกุลเงิน, Open Cloud API แต่ละรายการมีสิทธิ์ที่จำเป็นที่คุณต้องเพิ่มลงในคีย์ API ของคุณ, เช่นสิทธิ์ List Keys สำหรับ API รายการหากคุณไม่เพิ่มสิทธิ์ที่จำเป็น การโทร API ของคุณจะส่งคืนข้อผิดพลาดสำหรับสิทธิ์เฉพาะที่จำเป็นสำหรับแต่ละการดำเนินการดูข้อมูลอ้างอิง API ของ มาตรฐาน และ ร้านข้อมูลที่สั่งซื้อ
เมื่อ กำหนดค่ากุญแจ API ของคุณ คุณสามารถกำหนดสิทธิ์ระดับละเอียด เช่น อ่าน เขียน และรายการรายละเอียดสำหรับแต่ละคลังข้อมูลภายในประสบการณ์เฉพาะหรือคุณสามารถให้กุญแจสำหรับอ่านหรือเขียนข้อมูลทั้งหมดภายในประสบการณ์ได้คุณยังสามารถจำกัดการเข้าถึงส่วนหนึ่งของคลังข้อมูลที่จำเป็นสำหรับเครื่องมือของคุณแทนที่จะเปิดเผยคลังข้อมูลทั้งหมดการดำเนินการนี้ช่วยลดผลกระทบในกรณีที่กุญแจของคุณรั่วไหล
เครื่องมือสร้าง
คุณสามารถใช้ภาษาที่คุณเลือกเพื่อสร้างเครื่องมือด้วย API เปิดของคลาวด์สำหรับร้านข้อมูล เพื่อตอบสนองความต้องการการดำเนินการของคุณตัวอย่างต่อไปนี้จะเดินผ่านกระบวนการสร้างพอร์ทัลสนับสนุนสินค้าคงคลังผู้ใช้ ในภาษา Python โดยใช้ร้านข้อมูลมาตรฐานและกระดานผู้นำถาวรภายนอกโดยใช้ร้านข้อมูลที่จัดเรียงตามลําดับ
พอร์ทัลสนับสนุนสินค้าคงคลังผู้ใช้
ส่วนนี้ให้ตัวอย่างที่ชัดเจนของการสร้างพอร์ทัลสนับสนุนรายการสิ่งของผู้ใช้ในภาษาพายธองใน Python คลังไอเท็มทำการแก้ไข ร้านค้า
สำหรับตัวอย่างนี้, กำลังติดตาม:
ชื่อของคลังข้อมูลที่เก็บสินค้าคงคลังของผู้ใช้มีชื่อว่า Inventory
สคูลข้อมูลสำหรับแต่ละรายการข้อมูลคือ "userId": {"currency": number, "weapon": string, "level": number} คีย์คือเพียง userId
สคริปต์ Python ระบุชุดย่อยของคลังสินค้าของผู้ใช้ที่ขึ้นต้นด้วยคํานําหน้า เพิ่มเงินสดเสมือนของพวกเขาโดย 10 สําหรับการโปรโมท และอัปเดตข้อมูล
จากระดับสูง คุณสามารถสร้างแอป Python โดยเพิ่มสิทธิ์การเข้าถึง API แล้วเพิ่มสคริปต์
เพิ่มสิทธิ์การใช้คีย์ API สำหรับร้านข้อมูล
เมื่อสร้างคีย์ API สําหรับตัวอย่างนี้ ให้แน่ใจว่าคุณดําเนินการตามการตั้งค่าต่อไปนี้:
จากเมนู เลือกระบบ API ในส่วน สิทธิ์การเข้าถึง เลือก universe-datastores
(เลือกได้) ในส่วน ร้านข้อมูล เลือกการดำเนินการ API สำหรับร้านข้อมูลเฉพาะ
- เปิดใช้งานสวิตช์ การดำเนินการเก็บข้อมูลเฉพาะ โดยค่าเริ่มต้นแล้ว ร้านข้อมูลห้าแห่งจะโหลดโดยอัตโนมัติ แต่คุณสามารถเพิ่มร้านข้อมูลเพิ่มเติมผ่านปุ่ม + เพิ่มร้านข้อมูลในรายการ 2. ร้านค้าจากนั้นเลือกการดำเนินการ API ที่คุณต้องการให้คลังข้อมูลมีการเข้าถึง
เลือกการดำเนินการ API สำหรับประสบการณ์ทั้งหมด
- คลิกที่ เลือกประสบการณ์เพื่อเพิ่ม กล่องเลื่อนและเลือกประสบการณ์
- ใน การดำเนินการประสบการณ์ คลิกลูกศรเลื่อนลงและเลือกการดำเนินการที่คุณต้องการเพิ่มให้กับ API ของคุณตัวอย่างนี้เลือก อ่านรายการ , อัปเดตรายการ และ รายการคีย์รายการ สำหรับประสบการณ์ทั้งหมด
ในส่วน ความปลอดภัย กำหนดการเข้าถึง IP โดยเฉพาะเพื่อกุญแจโดยใช้ การบันทึก CIDR และตั้งวันหมดอายุโดยเฉพาะเพื่อให้กุญแจหยุดทำงานหลังวันที่นั้นโดยอัตโนมัติสำหรับตัวอย่างนี้ หากคุณวางแผนที่จะทดสอบท้องถิ่นก่อน คุณสามารถลบการจำกัด IP โดยการตั้งค่าเป็น 0.0.0.0/0 และปล่อยให้หมดอายุใน 30 วัน
เพิ่มสคริปต์สำหรับพอร์ทัลสนับสนุนสินค้าคงคลังของผู้ใช้
หลังจากสร้างคีย์ API ด้วยสิทธิ์ที่จำเป็นสำหรับแอปตัวอย่างแล้ว คุณต้องเพิ่มโค้ด JavaScript เพื่อดําเนินการฟังก์ชันของแอปไฟล์ แสดงวิธีการกำหนด , และ วิธีการไฟล์ update_inventory.js ใช้วิธีที่กำหนดเพื่อระบุชุดส่วนหนึ่งของคลังสินค้าของผู้ใช้ เพิ่มเงินเสมือนสำหรับแต่ละผู้ใช้ และอัปเดตข้อมูล
dataStoresMethods.js
const fetch = require('node-fetch');
class DataStores {
constructor() {
this._baseUrl =
'https://apis.roblox.com/datastores/v1/universes/{universeId}';
this._apiKey = process.env.API_KEY;
this._universeId = 'UNIVERSE_ID';
this.ATTR_HDR = 'Roblox-entry-Attributes';
this.USER_ID_HDR = 'Roblox-entry-UserIds';
this._objectsUrl = `${this._baseUrl}${this._universeId}/standard-datastores/datastore/entries/entry`;
this._incrementUrl = `${this._objectsUrl}/increment`;
this._listObjectsUrl = `${this._baseUrl}${this._universeId}/standard-datastores/datastore/entries`;
}
async _getHeaders() {
return { 'x-api-key': this._apiKey };
}
async getEntry(datastore, objectKey, scope = null) {
const url = `${
this._objectsUrl
}?datastoreName=${datastore}&entryKey=${objectKey}&scope=${scope || ''}`;
const response = await fetch(url, { headers: await this._getHeaders() });
const data = await response.json();
return data;
}
async listEntries(datastore, scope = null, prefix = '', limit = 100) {
const url = `${this._listObjectsUrl}?datastoreName=${datastore}&scope=${scope}&prefix=${prefix}&limit=${limit}`;
const response = await fetch(url, { headers: await this._getHeaders() });
const data = await response.json();
return data;
}
async incrementEntry(datastore, objectKey, incrementBy, scope = null) {
const url = `${
this._incrementUrl
}?datastoreName=${datastore}&entryKey=${objectKey}&incrementBy=${incrementBy}&scope=${
scope || ''
}`;
const response = await fetch(url, {
method: 'POST',
headers: await this._getHeaders(),
});
const data = await response.json();
return data;
}
}
module.exports = DataStores;
updateInventory.js
const DataStores = require('./dataStoresMethods');
const dataStoresApi = new DataStores();
// Set up
const datastoreName = 'Inventory';
// List keys for a subset of users
dataStoresApi.listEntries(datastoreName).then((keys) => {
console.log(keys);
});
// Read inventory for each user
for (let x = 0; x < 5; x++) {
const updatedObjectKey = `User_${x + 1}`;
dataStoresApi.getEntry(datastoreName, updatedObjectKey).then((value) => {
console.log(
`${updatedObjectKey} has ${value.gems} gems in their inventory`
);
});
}
// Update the currency of each user by 10
for (let x = 0; x < 5; x++) {
const updatedObjectKey = `User_${x + 1}`;
dataStoresApi
.incrementEntry(datastoreName, updatedObjectKey, 10)
.then((value) => {
console.log(
`${updatedObjectKey} now has ${value.robux} robux in their inventory`
);
});
}
เพื่อทดสอบตั้งแปลงตัวแปรสภาพแวดล้อม API_KEY และดำเนินไฟล์ JavaScript:
export API_KEY=... \node updateInventory.js
ตารางอันดับ
ส่วนนี้จะเดินผ่านตัวอย่างที่ชัดเจนของการสร้างลีดเดอร์บอร์ดถาวรภายนอกในภาษาพายธองใน Python ซึ่งคุณสามารถระบุและอ่านข้อมูลผู้ใช้ที่เก็บไว้ในคลังข้อมูลที่จัดเรียงตามลําดับและจากนั้นเผยแพร่ไปยังเว็บไซต์ภายนอกเพื่อการโปรโมท
สำหรับตัวอย่างนี้, กำลังติดตาม:
ตัวอย่างโค้ดสร้างรายการที่กําหนดไว้ล่วงหน้าของชื่อผู้ใช้สําหรับวัตถุประสงค์การสาธิตสำหรับแอปพลิเคชันของคุณเอง คุณควรใช้รายชื่อผู้ใช้จริงในประสบการณ์ของคุณ
ตัวอย่างโค้ดเพิ่ม 50 จุดให้กับผู้ใช้แต่ละคนที่เข้าร่วมประสบการณ์เพื่อวัตถุประสงค์ในการสาธิตสำหรับแอปพลิเคชันของคุณเอง คุณควรกำหนดกฎตามการออกแบบประสบการณ์ของคุณ
จากระดับสูง คุณสามารถสร้างแอป Python โดยเพิ่มสิทธิ์การเข้าถึง API แล้วเพิ่มสคริปต์
เพิ่มสิทธิ์การใช้คีย์ API สำหรับร้านข้อมูลที่สั่งซื้อ
แอปตัวอย่างต้องการสี่วิธีในการบรรลุฟังก์ชันของมัน: List , Create และ Update และ Increment , ดังนั้นคุณจึงต้องเพิ่มสิทธิ์ API ต่อไปนี้:
- อ่าน สำหรับวิธี list
- เขียน สำหรับ Create , Update และ Increment วิธี
เมื่อสร้างคีย์ API สําหรับตัวอย่างนี้ ให้แน่ใจว่าคุณดําเนินการดังต่อไปนี้:
จากเมนู เลือกระบบ API ในส่วน สิทธิ์การเข้าถึง เลือก ร้านข้อมูลที่จัดเรียง
เพิ่มสิทธิ์การดำเนินการของ API เพื่ออ่านและเขียนคลังข้อมูลที่สั่งซื้อในประสบการณ์เป้าหมาย
- คลิกที่ เลือกประสบการณ์เพื่อเพิ่ม กล่องเลื่อนและเลือกประสบการณ์เป้าหมาย
- ใน การดำเนินการประสบการณ์ ขยายการเลื่อนลงเพื่อเลือก อ่าน และ เขียน การดำเนินการ
ในส่วน ความปลอดภัย กำหนดการเข้าถึง IP โดยเฉพาะเพื่อกุญแจโดยใช้ การบันทึก CIDR และตั้งวันหมดอายุโดยเฉพาะเพื่อให้กุญแจหยุดทำงานหลังวันที่นั้นโดยอัตโนมัติสำหรับตัวอย่างนี้ หากคุณวางแผนที่จะทดสอบท้องถิ่นก่อน คุณสามารถลบการจำกัด IP โดยการตั้งค่าเป็น 0.0.0.0/0 และปล่อยให้หมดอายุใน 30 วัน
ตารางอันดับ
หลังจากสร้างคีย์ API ด้วยสิทธิ์ที่จำเป็นสำหรับแอปตัวอย่างแล้ว คุณต้องเพิ่มโค้ด JavaScript เพื่อดําเนินการฟังก์ชันของแอป
ไฟล์ แสดงวิธีการกำหนด , , และ วิธีการไฟล์ leaderboard.js ใช้วิธีที่กำหนดไว้ในการสร้างรายการของผู้ใช้ในคลังข้อมูลที่เรียงลําดับได้ แสดงคะแนน เพิ่มคะแนนของผู้ชนะ และอัปเดตลีดเดอร์บอร์ดไฟล์ leaderboard.js ยังนำเข้าไฟล์ config.json สำหรับการกำหนดค่ารหัสจักรวาล โดเมน API และคีย์ API ของคุณ
ordered_data_stores.js
const axios = require('axios');
const fs = require('fs');
class DataStores {
constructor(configFile) {
this._config = JSON.parse(fs.readFileSync(configFile, 'utf-8'));
}
_H() {
return {
'x-api-key': this._config.api_key,
'Content-Type': 'application/json',
};
}
async list(
datastore,
scope,
pageSize = 10,
orderBy = '',
filter = '',
exclusiveStartKey = ''
) {
const url = `${this._config.api_key_url}universes/${this._config.universe_id}/orderedDataStores/${datastore}/scopes/${scope}/entries`;
const response = await axios.get(url, {
headers: this._H(),
params: {
max_page_size: pageSize,
order_by: orderBy,
filter: filter,
page_token: exclusiveStartKey,
},
});
return response.data;
}
async create(datastore, scope, entry, data) {
const url = `${this._config.api_key_url}universes/${this._config.universe_id}/orderedDataStores/${datastore}/scopes/${scope}/entries`;
const payload = JSON.stringify({ value: 11 });
const response = await axios.post(url, payload, {
headers: this._H(),
params: { id: entry },
});
return response.data;
}
async increment(datastore, scope, entry, incrementBy) {
const url = `${this._config.api_key_url}universes/${this._config.universe_id}/orderedDataStores/${datastore}/scopes/${scope}/entries/${entry}:increment`;
const payload = JSON.stringify({ amount: incrementBy });
const response = await axios.post(url, payload, { headers: this._H() });
return response.data;
}
}
leaderboard.js
const leaderboardEndpoints = require('./ordered_data_stores');
const datastores = new leaderboardEndpoints.DataStores('config.json');
// Variables
const orderedDataStore = 'PlayerScores';
const scope = 'global';
const entryNames = ['Ragdoll', 'Balinese', 'Tabby', 'Siamese'];
// Create an entry and give each new player 50 points for joining the game
entryNames.forEach(async (name) => {
await datastores.create(orderedDataStore, scope, name, 50);
});
// Display the players' scores
datastores.list(orderedDataStore, scope).then((playerScores) => {
console.log(playerScores);
});
// Increment the first player's score for winning the game
datastores.increment(orderedDataStore, scope, entryNames[0], 100);
// Increment all the players' scores for participating in the game
entryNames.forEach(async (name) => {
await datastores.increment(orderedDataStore, scope, name, 10);
});
// Display the updated leaderboard
datastores.list(orderedDataStore, scope).then((updatedPlayerScores) => {
console.log(updatedPlayerScores);
});
กำหนดค่า
{
"universe_id": "",
"api_key_url": "https://apis.roblox.com/datastores/ordered-v1/"
"api_key": ""
}
เพื่อทดสอบตั้งแปรสภาพแวดล้อม API_KEY และดำเนินไฟล์ leaderboard.js :
export API_KEY=... \node leaderboard.js
หลังจากทำการทดสอบเสร็จแล้ว คุณสามารถเผยแพร่หรือฝังลีดเดอร์บอร์ดไปยังเว็บไซต์นอก Roblox เพื่อเพิ่มการเข้าถึง