API를 사용하여 카탈로그 업데이트를 자동화하는 방법
IGS API 호출로 카탈로그 생성 및 업데이트를 자동화할 수 있습니다. 자동화를 도입하면 시간을 적게 들여도 카탈로그를 최신 상태로 유지할 수 있습니다. 카탈로그 자동화를 사용하면 아이템과 프로모션을 생성 및 업데이트하고, 외부 시스템에서 데이터를 가져올 수 있습니다.
이를 통해 다음을 유지 관리하고 업데이트하는 데 소요되는 시간을 줄일 수 있습니다.
- 다수의 아이템이 포함된 카탈로그
- 모든 유형의 프로모션
- 국가별 가격
사용자 참여를 유지하려면 아이템 카탈로그를 생성한 후 엑솔라 측에서 최신 상태로 유지해야 합니다. 제품을 추가하거나 가격을 변경하는 등 업데이트를 수행한 경우 엑솔라 측에서 카탈로그를 업데이트하는 것이 좋습니다.
수행 가능 작업:
기본 인증은 아이템과 프로모션을 생성하고 업데이트하는 API 호출에 사용됩니다. Authorization:Basic <your_authorization_basic_key>
를 전달합니다. 여기에서 <your_authorization_basic_key>
는 Base64 표준으로 인코딩된 판매자 ID:API 키 쌍입니다. 이러한 매개변수를 찾으려면 관리자 페이지으로 이동합니다.
- 판매자 ID 표시 위치:
- 회사 설정 > 회사 섹션.
- 관리자 페이지의 브라우저 주소 표시줄에 있는 URL. 해당 URL은
https://publisher.xsolla.com/<merchant ID>/<Publisher Account section>
형식으로 되어 있습니다.
- 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를 사용하여 개발되었습니다.
“node-fetch”
모듈의fetch
함수를 가져와서 엑솔라 서버로 HTTP 요청을 전송합니다.
- javascript
import fetch from "node-fetch";
- 요청 인증에 필요한 상수를 설정합니다.
<your project_id from PA>
및<your api key from PA>
대신 프로젝트 ID 및 API 키 값을 입력하면 나중에 API 요청에서 사용할 수 있도록 Base64를 사용하여 인코딩됩니다.
- javascript
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')
- 요청을 보낼 때 지연을 생성하는 데 사용되는 도우미 함수인
sleep
를 구현합니다. 이는 API 요청 속도 제한을 초과하지 않기 위해 필요합니다.
- javascript
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
- 시스템에서 아이템 데이터를 가져오려면 시스템 고유의
getItems
함수를 구현합니다.
- javascript
async function getItems() {
// receive items from the original system or read from a pre-prepared file
return items;
}
- 가상 아이템 생성 API 호출의 데이터 형식에 따라 아이템 데이터의 형식을 지정하려면 시스템에 맞는
prepareData
함수를 구현해야 합니다.
- javascript
function prepareData(items) {
// format items in accordance with API requirements
return formattedItems;
}
- 가상 아이템을 생성하기 위해 엑솔라 API에
POST
요청을 전송하는createItem
함수를 추가합니다.
- javascript
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),
});
}
- 지정된 SKU가 있는 가상 아이템의 존재 여부를 확인하는
checkItemExist
함수를 추가합니다. 이 함수는 엑솔라 API에GET
요청을 보냅니다.404
HTTP 코드가 포함된 응답이 수신되면 지정된 SKU를 가진 아이템을 찾을 수 없으므로 해당 아이템을 생성해야 합니다.200
HTTP 코드가 포함된 응답이 수신되면 지정된 SKU를 가진 아이템이 있으며, 해당 아이템을 생성할 필요가 없습니다.
- javascript
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;
}
- 아이템 목록을 살펴보고 엑솔라 측 시스템에 해당 SKU를 보유한 아이템이 있는지 확인하는
createItems
함수를 추가합니다. 해당 SKU를 보유한 아이템이 없는 경우, 이 함수가 해당 아이템을 생성합니다. 진행 정보는 콘솔에 표시됩니다.
- javascript
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`);
}
- 위의 모든 함수를 올바른 순서로 호출하는
run
함수를 추가합니다.
- javascript
async function run() {
const items = await getItems();
const formattedItems = prepareData(items);
await createItems(formattedItems);
}
전체 코드:
- javascript
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와 같은 외부 시스템에서 데이터를 가져오려면 지침을 따라주세요.오자 또는 기타 텍스트 오류를 찾으셨나요? 텍스트를 선택하고 컨트롤+엔터를 누르세요.