Veri depoları için kullanım kılavuzu

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Studio veya canlı sunucularda veri depolarına Engine API'yi kullanarak erişimin yanı sıra, granüler erişim ve güvenlik kontrolü ile dışarıdan standart ve sıralı siparişli veri depolarına erişmek ve kullanmak için Open Cloud API'lerini kullanabilirsiniz.

Kullanım

Verilerinize bu API'lerle erişerek çalışma akışınızın birkaç alanını geliştirebilirsiniz, örneğin:

  • Müşteri Destek Portalı : Veri depoları, kullanıcı envanterlerindeki öğeler veya beceri noktaları gibi kalıcı kullanıcı kaynaklarını depolamak için yararlıdır.Bazen bu kaynakları müşteri desteği için güncellemeniz gerekir.Studio'yu kullanmak veya deneyime manuel olarak katılmak yerine, müşteri hizmeti temsilcilerinin müşteri destek isteklerini doğrudan ele almasına izin veren bir web uygulaması oluşturabilirsiniz, örneğin kullanıcı envanterlerini görüntülemek ve değiştirmek ve geri ödeme yapmak gibi.

  • LiveOps Panosu : Canlı operasyonların verimliliğini artırmak için API'leri kullanarak bir LiveOps panosu oluşturabilirsiniz.Örneğin, bir etkinliği önceden planlayabilir, bir veri mağazayapılandırma verilerinin bir parçası olarak bir özellük bayrağı altında gizleyebilir ve etkinliğin yayınlanması için bir süre belirleyebilirsiniz.Deneyim sunucularınız, olayı başlatmak için bayrağı okuyarak bu değişikliği tespit edebilir.

  • Dış Liderlik Tablosu : Roblox dışındaki deneyimlerinizi teşvik etmek için, deneyiminizin lider tablosunu, bir yarışın lider tablosu gibi, gerçek zamanlı olarak çekip dış bir web sitesinde gösterin.Web sitesinin düzenli olarak en yeni verileri HTTP üzerinden isteyerek ve web sayfasını güncelleyerek sıralı veri depolarına yalnızca okuma erişimi verebilirsiniz.

  • Veri Migrasyon Otomasyonu : Veriler, yeni özellikleri barındırmak için veri şemalarını yükselterek deneyiminiz geliştikçe değişebilir veya güncellenebilir.Mevcut kullanıcı verilerini kaybetmekten kaçınmak için, bazen veri depolarınızı eski şemadan yeni birine taşımanız gerekir.Mevcut veri depolarından her girişi okuyan, verileri yeni şemaya yönlendiren ve girişi veri migasyonunu otomatikleştirmek için yeni bir veri depolarına geri yazan dış bir senaryo yazabilirsiniz.

Motor API ile Farklılıklar

Açık Bulut API'leri DataStoreService ile benzer olmasına rağmen, birkaç önemli fark vardır:

  • Evren ID'si ve veri depolama adı : Motor API'den farklı olarak, Açık Bulut API'ler statersizdir ve her yerden gelebilir, bu nedenle istek gönderirken daima evren ID'sini, deneyimin benzersiz tanımlayıcısını ve veri deposu adını sağlamalısınız.Bir evren ID'si almak için daha fazla bilgi için, Evren ID'si bakın.

  • Yaratma ve güncelleme için ayrı izinler : Motor API, çağırdığınızda mevcut olmadığında yeni girişler oluşturur DataStore:SetAsync() , ancak girişlerin oluşturulması ve güncellenmesi için Açık Bulut yöntemleri ayrıdır.Belirli durumlarda ayrı izinler daha güvenli ve daha esnek olabilir.Örneğin, mevcut bir kullanıcının profilini düzenleyebilecek bir müşteri destek aracı oluşturabilirsiniz, ancak yeni bir kullanıcının profilini oluşturamaz.

  • Veri seri hale getirme : Tüm Açık Bulut uç noktaları, ağ taşıma öncesi tüm verileri seri hale getirmenizi gerektirir.Seri çevirme, bir nesneyi bir dizidönüştürmek demektir.Deserializasyon tersidir (bir dizeyi nesneye dönüştürmek).Motor API giriş içeriğini otomatik olarak serialize eder ve deserialize eder, ancak Açık Bulut için giriş verilerinizi JSON ile sahip olüretmeniz veya parçalamanız gerekir.

Güvenlik izinleri

Veri depoları genellikle kullanıcı profilleri ve sanal para birimigibi hassas bilgileri saklar.Güvenliği korumak için, her Açık Bulut API'sinin API anahtarına eklemek zorunda olduğunuz ilgili izinleri vardır, örneğin listeleme API için List Keys izni.Gerekli izinleri eklemezseniz, API çağrınız bir hata döndürür.Her işlem için gerekli olan belirli izinler için, standart ve sıralı veri depoları API referansına bakın.

API anahtarlarınızı yapılandırırken, belirli bir deneyim içinde her bir veri depolarına okuma, yazma ve liste girişi gibi granüler izinler ayarlayabilir veya deneyim içindeki tüm veri depolarını okuma veya yazma için bir anahtar verebilirsiniz.Ayrıca, tüm veri depolarını göstermek yerine, aracınız için gerekli veri depolarının bir kısmına erişimi sınırlandırabilirsiniz.Bu, anahtarın sızdırılması durumunda etkiyi azaltır.

Yapı araçları

Operasyon ihtiyaçlarınızı yerine getirmek için Veri depoları için Açık Bulut API'leri ile araçlar oluşturmak için seçtiğiniz dili kullanabilirsiniz.Aşağıdaki örnekler, Python'da standart veri depoları ve sıralı veri depoları kullanarak bir kullanıcı envanter destek portali oluşturma süreçlerini geçer ve sıralı veri depoları kullanarak dışarıdan kalıcı bir lider tablosu oluşturur.

Kullanıcı envanter destek portalı

Bu bölüm, Python'da bir kullanıcı envanter destek portalının nasıl oluşturulacağına dair somut bir örnek verir, böylece kullanıcıların envanterinin bir kısmını listeleyip okuyabilir, düzenlemeler yapabilir ve ardından bir deneyimin veri mağazageri güncelleyebilirsiniz.

Bu örnek için, takip edilenvarsayalım:

  • Kullanıcı envanterini saklayan veri depolama adı Inventory dir.

  • Her veri girişi için veri şeması "userId": {"currency": number, "weapon": string, "level": number} dir. Anahtar sadece userId dir.

  • Python senaryosu, tercihlere dayalı olarak kullanıcı envanterlerinin bir kısmını listeler, bir tanıtımiçin onların sanal para birimini 10 artırır ve verileri günceller.

Yüksek seviye, API anahtar izinlerini ekleyerek ve ardından kodları ekleyerek Python uygulamanızı oluşturabilirsiniz.

Veri depoları için API anahtar izinleri ekleyin

Bu örnek için bir API anahtarı oluştururken örneğin, aşağıdaki ayarları yaptığınızdan emin olun:

  1. Erişim İzinleri bölümündeki API Sistemi Seç menüsünden evrensel veri depoları seçin.

  2. (Opsiyonel) Veri Depoları bölümünde, belirli veri depoları için API operasyonlarını seçin.

    1. Belirli Veri Deposu İşlemlerini Etkinleştir geçidini etkinleştirin.Varsayılan olarak, beş veri depoları otomatik olarak yüklenir, ancak + Veri Deposu Listesine Ekle düğmesi aracılığıyla ek veri depoları ekleyebilirsiniz.
    2. Veri depolamasının adının yanındaki kaydırma okunu seçin, ardından veri depolamasına erişmesini istediğiniz API operasyonlarını seçin.
  3. Tüm deneyim için API operasyonlarını seçin.

    1. Seçim eklemek için deneyimi seçin düşme listesine tıklayın ve bir deneyim seçin.
    2. Deneyim Operasyonlarında , düşen ok tuşuna tıklayın ve API'ye eklemek istediğiniz işlemleri seçin.Bu örnek tüm deneyim için Girişi Oku , Girişi Güncelle ve Giriş Anahtarlarını Listele seçer.
  4. Güvenlik bölümünde , IP erişimini CIDR notasyonu kullanarak açıkça anahtara ayarlayın ve anahtarın o tarihten sonra otomatik olarak çalışmayı durdurması için açık bir son kullanma tarihi ayarlayın.Bu örnek için, önce yerel test yapmayı planlıyorsanız, IP sınırlamasını 0.0.0.0/0 olarak ayarlayarak kaldırabilir ve 30 gün içinde sona erdirilebilir.

Kullanıcı envanter destek portalı için senaryolar ekleyin

Örnek uygulama için gerekli izinlerle API anahtarı oluşturduktan sonra, uygulama işlevlerini gerçekleştirmek için JavaScript kodu eklemelisiniz.The data_stores_methods.js dosyası, nasıl tanımlanacağını gösterir List Entries , Get Entry ve Increment Entry yöntemleri.update_inventory.js dosyası tanımlanan yöntemleri kullanarak kullanıcı envanterlerinin bir kısmını listeler, her kullanıcı için sanal para artırır ve verileri günceller.

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`
);
});
}

Test etmek için, API_KEY çevre değişkenini ayarlayın ve JavaScript dosyasını çalıştırın:


export API_KEY=... \
node updateInventory.js

Dış kalıcı liderlik tablosu

Bu bölüm, Python'da dış kalıcı bir lider tablosu oluşturmanın somut bir örneğini geçer, ki bunun içinde kullanıcı bilgilerinizi sıralayıp okuyabilir, düzenlemeler yapabilir ve ardından tanıtımiçin dış bir web sitesine yayınlayabilirsiniz.

Bu örnek için, takip edilenvarsayalım:

  • Kod örneği, demo amacı için önceden tanımlanmış bir kullanıcı adı listesi oluşturur.Kendi uygulamanız için deneyiminizdeki gerçek kullanıcıların listesini kullanmalısınız.

  • Kod örneği, deneme amacıyla deneyime katılan her kullanıcıya 50 puan ekler.Kendi uygulamanız için, deneyiminizin tasarımına dayanarak kuralı tanımlamanız gerekir.

Yüksek seviye, API anahtar izinlerini ekleyerek ve ardından kodları ekleyerek Python uygulamanızı oluşturabilirsiniz.

Sipariş edilmiş veri depoları için API anahtar izinleri ekleyin

Örnek uygulama, işlevlerini elde etmek için dört yönteme ihtiyaç duyar: List , Create , Update ve Increment , bu yüzden aşağıdaki API anahtar izinlerini eklemelisiniz:

  • Oku list yöntemi için.
  • Yaz for Create , Update ve Increment yöntemleri için.

Bu örnek için bir API anahtarı oluştururken , aşağıdaki işlemleri yaptığınızdan emin olun:

  1. Erişim İzinleri bölümündeki API Sistemi Seç menüsünden, Sıralanmış Veri Depoları seçin.

  2. Hedef deneyimde sıralı veri depolarını okumak ve yazmak için API operasyonlarının izinlerini ekleyin.

    1. Seçim eklemek için deneyimi seçin düşmesine tıklayın ve hedef deneyimi seçin.
    2. Deneyim Operasyonlarında , Oku ve Yaz operasyonlarını seçmek için kaydı genişletin.
  3. Güvenlik bölümünde , IP erişimini CIDR notasyonu kullanarak açıkça anahtara ayarlayın ve anahtarın o tarihten sonra otomatik olarak çalışmayı durdurması için açık bir son kullanma tarihi ayarlayın.Bu örnek için, önce yerel test yapmayı planlıyorsanız, IP sınırlamasını 0.0.0.0/0 olarak ayarlayarak kaldırabilir ve 30 gün içinde sona erdirilebilir.

liderlik tablosuiçin kodlar ekleyin

Örnek uygulama için gerekli izinlerle API anahtarı oluşturduktan sonra, uygulama işlevlerini gerçekleştirmek için JavaScript kodu eklemelisiniz.

The dosyası, nasıl tanımlanacağını gösterir , , ve yöntemleri.leaderboard.js dosyası tanımlanan yöntemleri kullanarak sıralı veri depolarında kullanıcı girişleri oluşturur, puanları görüntürür, kazanan kullanıcıların puanlarını artırır ve lider liderlik tablosugünceller.leaderboard.js dosyası da Evren Kimliği, API alanı ve API anahtarını yapılandırmak için bir config.json dosyası ithal eder.

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);
});
yapılandırma

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

Test etmek için, API_KEY çevre değişkenini ayarlayın ve leaderboard.js dosyasını çalıştırın:


export API_KEY=... \
node leaderboard.js

Testleri tamamladıktan sonra, daha fazla ulaşım için Roblox dışındaki web sitelerine lider tablosunu yayınlayabilir veya entegre edebilirsiniz.