インゲームストア / カタログ更新を自動化する方法
  ドキュメントに戻る

インゲームストア

カタログ更新を自動化する方法

In-Game Store APIコールを使用して、カタログの作成と更新を自動化できます。自動化により、時間をかけずにカタログを最新の状態に保つことができます。カタログ自動化では、アイテムやプロモーションの作成と更新、外部システムからのデータのインポートを行うことができます。

そのため、以下のことをメンテナンスや更新にかかる時間が短縮されます:

  • たくさんの商品が記載されているカタログ
  • あらゆる種類のプロモーション
  • 国別価格

注意

ユーザーエンゲージメントを維持するためには、アイテムカタログを作成した後もエクソーラ側で最新の状態に保つことが重要です。製品の追加や価格の変更など、お客様側で更新が発生した場合には、エクソーラ側のカタログを更新することをお勧めします。

次のことができます:

基本認証は、アイテムやプロモーションを作成または更新するためのAPIコールに使用されます。Authorization:Basic <your_authorization_basic_key>を渡し、そこで、<your_authorization_basic_key>マーチャントID:APIキーペア、はBase64規格に基づいてエンコードされています。アドミンページに移動して、以下のパラメータを見つかります:

  • マーチャントIDは以下の場所で表示されます:
    • 会社設定 > 会社セクション。
    • アドミンページページのブラウザーアドレスバーのURL。URLは以下の形式があります:https:​//publisher.xsolla.com/<merchant ID>/<Publisher Account section>

  • APIキーは、作成時に一度だけアドミンページに表示され、お客様側で保存する必要があります。次のセクションで新しいキーを作成できます:
    • 会社設定 > APIキー
    • プロジェクト設定 > APIキー

アイテムの作成と更新

複数のアイテムを作成する必要がある場合は、必要なアイテムタイプのAPIメソッドを必要な回数だけ呼び出すスクリプトを作成することができます。

注意

アイテムリクエストに対する応答で返されるパラメータのリストは、カタログを更新する際に渡す必要のあるパラメータのリストとは異なります。必須パラメータおよび更新されたパラメータに加えて、アイテム更新メソッドで、アイテムリクエストに対する応答で返されるパラメータを渡します。

例:

仮想アイテムを取得するメソッドでは、ユーザーの制限データを持つlimitsオブジェクトが返されます。アイテムの価格または名前だけを更新したい場合は、仮想アイテムを更新するメソッドでlimitsオブジェクトの現在のデータを渡します。limitsオブジェクトを渡さない場合、仮想アイテムを更新するメソッドでアイテムがアップデートされた後、制限データは削除されます。

仮想アイテム

カタログを更新するには:

  1. 仮想アイテムを取得するまたはすべての仮想アイテムのリストを取得API メソッドを使用してカタログからデータを取得します
  2. 仮想アイテムを更新するAPIメソッドを使用して新しいパラメータ値を渡します。

仮想アイテムを作成するには、仮想アイテムを作成するAPIメソッドを使用します。

仮想通貨

カタログを更新するには:

  1. 仮想通貨リストを取得するAPIメソッドを使用してカタログからデータを取得します。
  2. 仮想通貨を更新するAPIメソッドを使用して新しいパラメータ値を渡します。

仮想通貨を作成するには、仮想通貨を作成するAPIメソッドを使用します。

仮想通貨パッケージ

カタログを更新するには:

  1. 仮想通貨パッケージリストを取得するAPIメソッドを使用してカタログからデータを取得します。
  2. 仮想通貨パッケージを更新するAPIメソッドを使用して新しいパラメータ値を渡します。

仮想通貨パックを作成するには、仮想通貨パッケージを作成するAPIメソッドを使用します。

バンドル

カタログを更新するには:

  1. バンドルのリストを取得するAPIメソッドを使用してカタログからデータを取得します。
  2. バンドルを更新するAPIメソッドを使用して新しいパラメータ値を渡します。

バンドルを作成するには、バンドルを作成するAPIメソッドを使用します。
ゲームキー、国の制限、または価格をバンドルに追加する場合は、説明を使用してください。

プロモーションの作成と更新

注意
取得APIメソッドから返されるパラメータのリストは、プロモーション更新メソッドで渡すパラメータとは異なります。必須パラメータと更新パラメータに加えて、リクエストのレスポンスで返される更新メソッドのパラメータを、プロモーションリストの取得に使用するメソッドに渡します。

クーポン

お知らせ
クーポンのプロモーションが正しく機能するようにするには、まずプロモーションを作成し、次にこのプロモーションコードを生成する必要があります。

プロモーションを更新するには:

  1. クーポンのプロモーションを取得するまたはクーポンのプロモーションのリストからデータを取得します。
  2. クーポンのプロモーションを更新するAPIメソッドを使用して新しいパラメータ値を渡します。
  3. クーポンのプロモーションをアクティブ化するAPIメソッドを使用してプロモーションをアクティブにします。

プロモーションを作成するには、クーポンプロモーションを作成するAPIメソッドを使用してから、クーポンコードの作成でカスタムクーポンコードを作成するか、クーポンコードの生成でランダムなクーポンコードを生成します。
プロモーションを非アクティブ化するには、クーポンプロモーションを非アクティブ化するAPIメソッドを使用します。

プロモーションコード

お知らせ
プロモーションコードのプロモーションが正しく機能するには、まずプロモーションを作成し、次にこのプロモーションコードを生成する必要があります。

プロモーションを更新するには:

  1. プロモーションコードのプロモーションを取得するまたはプロモーションコードのプロモーションのリストを取得するAPI メソッドを使用してカタログからデータを取得します。
  2. プロモーションコードを更新するAPIメソッドを使用して新しいパラメータ値を渡します。
  3. プロモーションコードのプロモーションをアクティブ化するAPIメソッドを使用してプロモーションをアクティブにします。

プロモーションを作成するには、プロモーションコードのプロモーションを作成するAPIメソッドを使用してから、ププロモーションコードプロモーションのコードを作成するを使用してカスタムプロモーションコードを作成するか、プロモーションコードプロモーションのコードを生成するを使用してランダムなプロモーションコードを生成します。
プロモーションを無効にするには、プロモーションコードプロモーションを無アクティブ化するAPIメソッドを使用します。

割引

プロモーションを更新するには:

  1. アイテムのプロモーションを取得するまたはアイテムのプロモーションのリストからデータを取得します。
  2. アイテムのプロモーションを更新するAPIメソッドを使用して新しいパラメータ値を渡します。
  3. プロモーションをアクティブ化するAPIメソッドを使用してプロモーションをアクティブにします。

プロモーションを作成するには、アイテムのディスカウントを作成するAPIメソッドを使用します。
プロモーションを非アクティブ化するには、プロモーションを非アクティブ化するAPIメソッドを使用します。

ボーナス

プロモーションを更新するには:

  1. ボーナスのプロモーションを取得するまたはボーナスのプロモーションのリストからデータを取得します。
  2. ボーナスのプロモーションを更新するAPIメソッドを使用して新しいパラメータ値を渡します。
  3. ボーナスのプロモーションをアクティブ化するAPIメソッドを使用してプロモーションをアクティブにします。

プロモーションを作成するには、ボーナスのプロモーションを作成するAPIメソッドを使用します。
プロモーションを非アクティブ化するには、プロモーションを非アクティブ化するAPIメソッドを使用します。

API経由でのアイテムの自動作成

システムからのデータに基づいて複数のアイテムを作成する必要がある場合は、APIを使用してこのプロセスを自動化できます。

次のことを行う必要があります:

アイテムグループを使用する場合は、アドミンページインターフェースで事前に作成してください。

複数のタイプのアイテムを使用する場合は、次の順序で作成する必要があります:

  1. アドミンページのアイテムグループ。
  2. 仮想通貨。
  3. 仮想アイテム。
  4. 仮想通貨パッケージ。
  5. バンドル。

次は想アイテムを作成するメソッドを繰り返し呼び出して仮想アイテムを作成するスクリプトの例です。

スクリプトはJavaScriptとJavaScriptランタイムNode.jsを使って開発されています。

  1. エクソーラにHTTPリクエストを送信するために、“node-fetch”モジュールのfetch関数をインポートします。
Copy
Full screen
Small screen
import fetch from "node-fetch";
  1. リクエスト認証に必要な定数を設定します。の代わりに、プロジェクトIDとAPIキーの値を挿入し、これらは後続のAPIリクエストで使用するためにBase64でエンコードされます。
Copy
Full screen
Small screen
const projectId = <your project_id from PA>;

const apiKey = <your api key from PA>;

const buff = new Buffer(`${projectId}:${apiKey}`);

const basicAuth = buff.toString('base64')
  1. リクエストを送信する際に遅延を作成するために使用されるsleepヘルパー関数を実装します。これはAPIリクエストレート制限を超えないために必要です。
Copy
Full screen
Small screen
function sleep(ms) {

   return new Promise(resolve => setTimeout(resolve, ms));

}
  1. システムからアイテムデータを取得にはシステム固有のgetItems関数を実装します。
Copy
Full screen
Small screen
async function getItems() {

   // receive items from the original system or read from a pre-prepared file

   return items;

}
  1. 仮想アイテムを作成するAPIコールのデータフォーマットに従ってアイテムデータをフォーマットするには、システム固有のprepareData関数を実装します。
Copy
Full screen
Small screen
function prepareData(items) {

   // format items in accordance with API requirements

   return formattedItems;

}
  1. POSTリクエストをXsolla APIに送信して仮想アイテムを作成するcreateItem関数を追加します。
Copy
Full screen
Small screen
async function createItem(item) {

   const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items`;



   return await fetch(url, {

       method: "POST",

       headers: {

           Authorization: "Basic " + basicAuth,

           "Content-Type": "application/json"

       },

       body: JSON.stringify(item),

   });

}
  1. 指定したSKUの仮想アイテムが存在するかどうかを確認するcheckItemExist関数を追加します。この関数はXsolla APIにGETリクエストを送信します:
    • 指定されたSKUのアイテムが見つからない場合は、404のHTTPコードの応答が受信され、作成する必要があります。
    • 200のHTTPコードを含む応答を受信した場合、指定されたSKUを持つアイテムが見つかり、作成する必要はありません。
Copy
Full screen
Small screen
async function checkItemExist(sku) {

   const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items/sku/${sku}`;

   const response = await fetch(url, {

       method: "GET",

       headers: {

           Authorization: "Basic " + basicAuth

       }

   });

   return response.status !== 404;

}
  1. アイテムのリストを処理し、エクソーラ側にシステムのSKUを持つアイテムが存在するかどうかを確認するcreateItems関数を追加します。該当するSKUを持つアイテムがない場合、関数はアイテムを作成します。進行状況がコンソールに表示されます。
Copy
Full screen
Small screen
async function createItems(items) {

   let success = 0;

   let alreadyCreated = 0;

   for (let i = 0; i < items.length; i++) {

       const item = items[i];

       if (item['sku'] === undefined) {

           console.log(`${i} Field "sku" not specified`);

           continue;

       }

       const sku = item['sku'];

       if (await checkItemExist(sku)) {

           console.log(`${i} Item with sku "${sku}" already created`);

           alreadyCreated++;

           continue;

       }

       const response = await createItem(item);

       if (response.status === 201) {

           console.log(`${i} Item with sku "${sku}" successfully created`)

           success++;

       } else {

           const jsonData = await response.json();

           console.log(`${i} An error occurred while creating the items with sku "${sku}"`);

           console.log(jsonData);

       }

       // add a delay so as not to run into rate limits

       await sleep(500);

   }

   console.log(`${success} items out of ${items.length} created. ${alreadyCreated} items already existed`);

}
  1. 正しい順序で上記のすべての関数を呼び出すrun関数を追加します。
Copy
Full screen
Small screen
async function run() {

 const items = await getItems();

 const formattedItems = prepareData(items);

 await createItems(formattedItems);

}

完全なコードは:

Copy
Full screen
Small screen
import fetch from "node-fetch";

const projectId = <your project_id from PA>;
const apiKey = <your api key from PA>;
const buff = new Buffer(`${projectId}:${apiKey}`);
const basicAuth = buff.toString('base64')

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getItems() {
    // receive items from the original system or read from a pre-prepared file
    return items;
}

function prepareData(items) {
    // format items in accordance with API requirements
    return formatedItems;
}

async function createItem(item) {
    const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items`;

    return await fetch(url, {
        method: "POST",
        headers: {
            Authorization: "Basic " + basicAuth,
            "Content-Type": "application/json"
        },
        body: JSON.stringify(item),
    });
}

async function isItemExisted(sku) {
    const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items/sku/${sku}`;
    const response = await fetch(url, {
        method: "GET",
        headers: {
            Authorization: "Basic " + basicAuth
        }
    });
    return response.status !== 404;
}

async function createItems(items) {
    let success = 0;
    let alreadyCreated = 0;
    for (let i = 0; i < items.length; i++) {
        const item = items[i];
        if (item['sku'] === undefined) {
            console.log(`${i} Field "sku" not specified`);
            continue;
        }
        const sku = item['sku'];
        if (await isItemExisted(sku)) {
            console.log(`${i} Item with sku "${sku}" already created`);
            alreadyCreated++;
            continue;
        }
        const response = await createItem(item);
        if (response.status === 201) {
            console.log(`${i} Item with sku "${sku}" successfully created`)
            success++;
        } else {
            const jsonData = await response.json();
            console.log(`${i} An error occurred while creating the items with sku "${sku}"`);
            console.log(jsonData);
        }
        // add a delay so as not to run into rate limits
        await sleep(500);
    }
    console.log(`${success} items out of ${items.length} created. ${alreadyCreated} items already existed`);
}

async function run() {
  const items = await getItems();
  const formattedItems = prepareData(items);
  await createItems(formattedItems);
}

run(); 

外部システムからインポートして更新する

PlayFabやGoogle Playなどの外部システムからデータをインポートするには、説明に従ってください。

この記事は役に立ちましたか?
ありがとうございます!
改善できることはありますか? メッセージ
申し訳ありません
この記事が参考にならなかった理由を説明してください。 メッセージ
ご意見ありがとうございました!
あなたのメッセージを確認し、体験を向上させるために利用させていただきます。
最終更新日: 2024年10月3日

誤字脱字などのテキストエラーを見つけましたか? テキストを選択し、Ctrl+Enterを押します。

問題を報告する
当社は常にコンテンツを見直しています。お客様のご意見は改善に役立ちます。
フォローアップ用のメールをご提供してください
ご意見ありがとうございました!