カタログ更新を自動化する方法
Shop Builder APIコールを使用して、カタログの作成と更新を自動化できます。自動化により、時間をかけずにカタログを最新の状態に保つことができます。カタログ自動化では、アイテムやプロモーションの作成と更新、外部システムからのデータのインポートを行うことができます。
そのため、以下のことをメンテナンスや更新にかかる時間が短縮されます:
- たくさんの商品が記載されているカタログ
- あらゆる種類のプロモーション
- 国別価格
ユーザーエンゲージメントを維持するためには、アイテムカタログを作成した後もエクソーラ側で最新の状態に保つことが重要です。アイテムの追加や価格の変更など、お客様側で更新が発生した場合には、エクソーラ側のカタログを更新することをお勧めします。
次のことができます:
基本認証は、アイテムやプロモーションを作成または更新するためのAPIコールに使用されます。Authorization:Basic <your_authorization_basic_key>
を渡し、そこで、<your_authorization_basic_key>
はマーチャントID:APIキーペア、はBase64規格に基づいてエンコードされています。パブリッシャーアカウントに移動して、以下のパラメータを見つかります:
- 「マーチャントID」は以下の場所で表示されます:
- 会社設定 > 会社セクション。
- パブリッシャーアカウントページのブラウザーアドレスバーのURL。URLは以下の形式があります:
https://publisher.xsolla.com/<merchant_id>/
。
- 「APIキー」は、作成時に一度だけパブリッシャーアカウントに表示され、お客様側で保存する必要があります。次のセクションで新しいキーを作成できます:
アイテムの作成と更新
複数のアイテムを作成する必要がある場合は、必要なアイテムタイプのAPIメソッドを必要な回数だけ呼び出すスクリプトを作成することができます。
アイテムリクエストに対する応答で返されるパラメータのリストは、カタログを更新する際に渡す必要のあるパラメータのリストとは異なります。必須パラメータおよび更新されたパラメータに加えて、アイテム更新メソッドで、アイテムリクエストに対する応答で返されるパラメータを渡します。
例:
仮想アイテムを取得するメソッドでは、ユーザーの制限データを持つ
仮想アイテム
カタログを更新するには:
- 仮想アイテムを取得するまたはすべての仮想アイテムのリストを取得API メソッドを使用してカタログからデータを取得します
- 仮想アイテムを更新するAPIメソッドを使用して新しいパラメータ値を渡します。
仮想アイテムを作成するには、仮想アイテムを作成するAPIメソッドを使用します。
仮想通貨
カタログを更新するには:
- 仮想通貨リストを取得するAPIメソッドを使用してカタログからデータを取得します。
- 仮想通貨を更新するAPIメソッドを使用して新しいパラメータ値を渡します。
仮想通貨を作成するには、仮想通貨を作成するAPIメソッドを使用します。
仮想通貨パッケージ
カタログを更新するには:
- 仮想通貨パッケージリストを取得するAPIメソッドを使用してカタログからデータを取得します。
- 仮想通貨パッケージを更新するAPIメソッドを使用して新しいパラメータ値を渡します。
仮想通貨パックを作成するには、仮想通貨パッケージを作成するAPIメソッドを使用します。
バンドル
カタログを更新するには:
- バンドルのリストを取得するAPIメソッドを使用してカタログからデータを取得します。
- バンドルを更新するAPIメソッドを使用して新しいパラメータ値を渡します。
バンドルを作成するには、バンドルを作成するAPIメソッドを使用します。
ゲームキー、国の制限、または価格をバンドルに追加する場合は、説明を使用してください。
プロモーションの作成と更新
クーポン
プロモーションを更新するには:
- クーポンのプロモーションを取得するまたはクーポンのプロモーションのリストからデータを取得します。
- クーポンのプロモーションを更新するAPIメソッドを使用して新しいパラメータ値を渡します。
- クーポンのプロモーションをアクティブ化するAPIメソッドを使用してプロモーションをアクティブにします。
プロモーションを作成するには、クーポンプロモーションを作成するAPIメソッドを使用してから、クーポンコードの作成でカスタムクーポンコードを作成するか、クーポンコードの生成でランダムなクーポンコードを生成します。
プロモーションを非アクティブ化するには、クーポンプロモーションを非アクティブ化するAPIメソッドを使用します。
プロモーションコード
プロモーションを更新するには:
- プロモーションコードのプロモーションを取得するまたはプロモーションコードのプロモーションのリストを取得するAPI メソッドを使用してカタログからデータを取得します。
- プロモーションコードを更新するAPIメソッドを使用して新しいパラメータ値を渡します。
- プロモーションコードのプロモーションをアクティブ化するAPIメソッドを使用してプロモーションをアクティブにします。
プロモーションを作成するには、プロモーションコードのプロモーションを作成するAPIメソッドを使用してから、ププロモーションコードプロモーションのコードを作成するを使用してカスタムプロモーションコードを作成するか、プロモーションコードプロモーションのコードを生成するを使用してランダムなプロモーションコードを生成します。
プロモーションを無効にするには、プロモーションコードプロモーションを無アクティブ化するAPIメソッドを使用します。
割引
プロモーションを更新するには:
- アイテムのプロモーションを取得するまたはアイテムのプロモーションのリストからデータを取得します。
- アイテムのプロモーションを更新するAPIメソッドを使用して新しいパラメータ値を渡します。
- プロモーションをアクティブ化するAPIメソッドを使用してプロモーションをアクティブにします。
プロモーションを作成するには、アイテムのディスカウントを作成するAPIメソッドを使用します。
プロモーションを非アクティブ化するには、プロモーションを非アクティブ化するAPIメソッドを使用します。
ボーナス
プロモーションを更新するには:
- ボーナスのプロモーションを取得するまたはボーナスのプロモーションのリストからデータを取得します。
- ボーナスのプロモーションを更新するAPIメソッドを使用して新しいパラメータ値を渡します。
- ボーナスのプロモーションをアクティブ化するAPIメソッドを使用してプロモーションをアクティブにします。
プロモーションを作成するには、ボーナスのプロモーションを作成するAPIメソッドを使用します。
プロモーションを非アクティブ化するには、プロモーションを非アクティブ化するAPIメソッドを使用します。
API経由でのアイテムの自動作成
システムからのデータに基づいて複数のアイテムを作成する必要がある場合は、APIを使用してこのプロセスを自動化できます。
次のことを行う必要があります:
- システムからアイテムデータをエクスポートします。
- エクスポートされたデータを、必須なアイテムタイプのAPIメソッドのデータ形式に一致する形式に変換します。
- エクスポートの各アイテムについて、必須なAPIメソッドを呼び出すスクリプトを作成します:
アイテムグループを使用する場合は、パブリッシャーアカウントインターフェースで事前に作成してください。
複数のタイプのアイテムを使用する場合は、次の順序で作成する必要があります:
- パブリッシャーアカウントのアイテムグループ。
- 仮想通貨。
- 仮想アイテム。
- 仮想通貨パッケージ。
- バンドル。
次は想アイテムを作成するメソッドを繰り返し呼び出して仮想アイテムを作成するスクリプトの例です。
スクリプトはJavaScriptとJavaScriptランタイムNode.jsを使って開発されています。
- エクソーラにHTTPリクエストを送信するために、
“node-fetch”
モジュールのfetch
関数をインポートします。
- javascript
1import fetch from "node-fetch";
- リクエスト認証に必要な定数を設定します。
と の代わりに、プロジェクトIDとAPIキーの値を挿入し、これらは後続のAPIリクエストで使用するためにBase64でエンコードされます。
- javascript
1const projectId = <your project_id from PA>;
2
3const apiKey = <your api key from PA>;
4
5const buff = new Buffer(`${projectId}:${apiKey}`);
6
7const basicAuth = buff.toString('base64')
- リクエストを送信する際に遅延を作成するために使用される
sleep
ヘルパー関数を実装します。これはAPIリクエストレート制限を超えないために必要です。
- javascript
1function sleep(ms) {
2
3 return new Promise(resolve => setTimeout(resolve, ms));
4
5}
- システムからアイテムデータを取得にはシステム固有の
getItems
関数を実装します。
- javascript
1async function getItems() {
2
3 // receive items from the original system or read from a pre-prepared file
4
5 return items;
6
7}
- 仮想アイテムを作成するAPIコールのデータフォーマットに従ってアイテムデータをフォーマットするには、システム固有の
prepareData
関数を実装します。
- javascript
1function prepareData(items) {
2
3 // format items in accordance with API requirements
4
5 return formattedItems;
6
7}
POST
リクエストをXsolla APIに送信して仮想アイテムを作成するcreateItem
関数を追加します。
- javascript
1async function createItem(item) {
2
3 const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items`;
4
5
6
7 return await fetch(url, {
8
9 method: "POST",
10
11 headers: {
12
13 Authorization: "Basic " + basicAuth,
14
15 "Content-Type": "application/json"
16
17 },
18
19 body: JSON.stringify(item),
20
21 });
22
23}
- 指定したSKUの仮想アイテムが存在するかどうかを確認する
checkItemExist
関数を追加します。この関数はXsolla APIにGET
リクエストを送信します:- 指定されたSKUのアイテムが見つからない場合は、
404
のHTTPコードの応答が受信され、作成する必要があります。 200
のHTTPコードを含む応答を受信した場合、指定されたSKUを持つアイテムが見つかり、作成する必要はありません。
- 指定されたSKUのアイテムが見つからない場合は、
- javascript
1async function checkItemExist(sku) {
2
3 const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items/sku/${sku}`;
4
5 const response = await fetch(url, {
6
7 method: "GET",
8
9 headers: {
10
11 Authorization: "Basic " + basicAuth
12
13 }
14
15 });
16
17 return response.status !== 404;
18
19}
- アイテムのリストを処理し、エクソーラ側にシステムのSKUを持つアイテムが存在するかどうかを確認する
createItems
関数を追加します。該当するSKUを持つアイテムがない場合、関数はアイテムを作成します。進行状況がコンソールに表示されます。
- javascript
1async function createItems(items) {
2
3 let success = 0;
4
5 let alreadyCreated = 0;
6
7 for (let i = 0; i < items.length; i++) {
8
9 const item = items[i];
10
11 if (item['sku'] === undefined) {
12
13 console.log(`${i} Field "sku" not specified`);
14
15 continue;
16
17 }
18
19 const sku = item['sku'];
20
21 if (await checkItemExist(sku)) {
22
23 console.log(`${i} Item with sku "${sku}" already created`);
24
25 alreadyCreated++;
26
27 continue;
28
29 }
30
31 const response = await createItem(item);
32
33 if (response.status === 201) {
34
35 console.log(`${i} Item with sku "${sku}" successfully created`)
36
37 success++;
38
39 } else {
40
41 const jsonData = await response.json();
42
43 console.log(`${i} An error occurred while creating the items with sku "${sku}"`);
44
45 console.log(jsonData);
46
47 }
48
49 // add a delay so as not to run into rate limits
50
51 await sleep(500);
52
53 }
54
55 console.log(`${success} items out of ${items.length} created. ${alreadyCreated} items already existed`);
56
57}
- 正しい順序で上記のすべての関数を呼び出す
run
関数を追加します。
- javascript
1async function run() {
2
3 const items = await getItems();
4
5 const formattedItems = prepareData(items);
6
7 await createItems(formattedItems);
8
9}
完全なコードは:
- javascript
1import fetch from "node-fetch";
2
3const projectId = <your project_id from PA>;
4const apiKey = <your api key from PA>;
5const buff = new Buffer(`${projectId}:${apiKey}`);
6const basicAuth = buff.toString('base64')
7
8function sleep(ms) {
9 return new Promise(resolve => setTimeout(resolve, ms));
10}
11
12async function getItems() {
13 // receive items from the original system or read from a pre-prepared file
14 return items;
15}
16
17function prepareData(items) {
18 // format items in accordance with API requirements
19 return formatedItems;
20}
21
22async function createItem(item) {
23 const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items`;
24
25 return await fetch(url, {
26 method: "POST",
27 headers: {
28 Authorization: "Basic " + basicAuth,
29 "Content-Type": "application/json"
30 },
31 body: JSON.stringify(item),
32 });
33}
34
35async function isItemExisted(sku) {
36 const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items/sku/${sku}`;
37 const response = await fetch(url, {
38 method: "GET",
39 headers: {
40 Authorization: "Basic " + basicAuth
41 }
42 });
43 return response.status !== 404;
44}
45
46async function createItems(items) {
47 let success = 0;
48 let alreadyCreated = 0;
49 for (let i = 0; i < items.length; i++) {
50 const item = items[i];
51 if (item['sku'] === undefined) {
52 console.log(`${i} Field "sku" not specified`);
53 continue;
54 }
55 const sku = item['sku'];
56 if (await isItemExisted(sku)) {
57 console.log(`${i} Item with sku "${sku}" already created`);
58 alreadyCreated++;
59 continue;
60 }
61 const response = await createItem(item);
62 if (response.status === 201) {
63 console.log(`${i} Item with sku "${sku}" successfully created`)
64 success++;
65 } else {
66 const jsonData = await response.json();
67 console.log(`${i} An error occurred while creating the items with sku "${sku}"`);
68 console.log(jsonData);
69 }
70 // add a delay so as not to run into rate limits
71 await sleep(500);
72 }
73 console.log(`${success} items out of ${items.length} created. ${alreadyCreated} items already existed`);
74}
75
76async function run() {
77 const items = await getItems();
78 const formattedItems = prepareData(items);
79 await createItems(formattedItems);
80}
81
82run();
外部システムからインポートして更新する
PlayFabやGoogle Playなどの外部システムからデータをインポートするには、説明に従ってください。
誤字脱字などのテキストエラーを見つけましたか? テキストを選択し、Ctrl+Enterを押します。