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 메소드를 필요한 횟수만큼 호출하는 스크립트 생성을 수행할 수 있습니다.

주의

아이템 요청에 대한 응답으로 반환되는 매개 변수 목록은 카탈로그를 업데이트할 때 전달해야 하는 매개 변수 목록과 다릅니다. 필수 및 업데이트된 매개 변수 외에도 아이템 요청에 대한 응답으로 반환되는 아이템 업데이트 메소드에서 매개 변수를 전달해 주세요.

예시:

가상 아이템 가져오기 메소드에서는 사용자 제한 데이터가 포함된 limits 개체가 반환됩니다. 아이템의 가격이나 이름만 업데이트하려면 가상 아이템 업데이트 메소드에서 limits 개체의 현재 데이터를 전달해 주세요. limits 개체를 전달하지 않으면 가상 아이템 업데이트 메소드로 아이템을 업데이트할 때 제한 데이터가 삭제됩니다.

가상 아이템

카탈로그를 업데이트하는 방법:

  1. 가상 아이템 가져오기모든 가상 아이템 목록 가져오기 API 메소드를 사용하여 카탈로그에서 데이터를 가져옵니다.
  2. 가상 아이템 업데이트 API 메소드를 사용하여 새 매개변수 값을 전달합니다.

가상 아이템을 생성하려면 가상 아이템 생성 API 메소드를 사용합니다.

번들

카탈로그를 업데이트하는 방법:

  1. 번들 목록 가져오기 API 메소드를 사용하여 카탈로그에서 데이터를 가져옵니다.
  2. 번들 업데이트 API 메소드를 사용하여 새 매개변수 값을 전달합니다.

번들을 생성하려면 번들 생성 API 메소드를 사용합니다.
번들에 게임 키, 국가 제한 또는 가격을 추가하려면 지침을 따라주세요.

프로모션 생성 및 업데이트

주의
API 가져오기 메소드에서 반환되는 매개변수 목록은 프로모션 업데이트 메소드에서 전달하는 매개변수와 다릅니다. 필수 및 업데이트된 매개변수 외에도 요청에 대한 응답으로 반환되는 업데이트 메소드의 매개변수를 프로모션 목록 가져오기에 사용하는 메소드에 전달합니다.

쿠폰

알림
쿠폰 프로모션이 올바르게 작동하도록 하려면 먼저 프로모션을 생성한 다음 이 프로모션에 대한 코드를 생성해야 합니다.

프로모션을 업데이트하는 방법:

  1. 쿠폰 프로모션 가져오기 또는 쿠폰 프로모션 목록 가져오기 API 메소드를 사용하여 카탈로그에서 데이터를 가져옵니다.
  2. 쿠폰 프로모션 업데이트 API 메소드를 사용하여 새 매개변수 값을 전달합니다.
  3. 쿠폰 프로모션 활성화 API 메소드를 사용하여 프로모션을 활성화합니다.

프로모션을 생성하려면 쿠폰 프로모션 생성 API 메소드를 사용한 후 쿠폰 코드 생성을 사용하여 사용자 정의 쿠폰 코드를 생성하거나 쿠폰 코드 생성을 사용하여 무작위 쿠폰 코드를 생성합니다.
프로모션을 비활성화하려면 쿠폰 프로모션 비활성화 API 메소드를 사용합니다.

프로모션 코드

알림
프로모션 코드 프로모션이 올바르게 작동하도록 하려면 먼저 프로모션을 생성한 다음 이 프로모션에 대한 코드를 생성해야 합니다.

프로모션을 업데이트하는 방법:

  1. 프로모션 코드 프로모션 가져오기 또는 프로모션 코드 프로모션 목록 가져오기 API 메소드를 사용하여 카탈로그에서 데이터를 가져옵니다.
  2. 프로모션 코드 프로모션 업데이트 API 메소드를 사용하여 새 매개변수 값을 전달합니다.
  3. 프로모션 코드 프로모션 활성화 API 메소드를 사용하여 프로모션을 활성화합니다.

프로모션을 생성하려면 프로모션 코드 프로모션 생성 API 메소드를 사용한 후 프로모션 코드 프로모션용 코드 생성을 사용하여 사용자 정의 프로모션 코드를 생성하거나 프로모션 코드 프로모션용 코드 생성을 사용하여 무작위 프로모션 코드를 생성합니다.
프로모션을 비활성화하려면 프로모션 코드 프로모션 비활성화 API 메소드를 사용합니다.

할인

프로모션을 업데이트하는 방법:

  1. 아이템 프로모션 가져오기 또는 아이템 프로모션 목록 가져오기 API 메소드를 사용하여 카탈로그에서 데이터를 가져옵니다.
  2. 아이템 프로모션 업데이트 API 메소드를 사용하여 새 매개변수 값을 전달합니다.
  3. 프로모션 활성화 API 메소드를 사용하여 프로모션을 활성화합니다.

프로모션을 생성하려면 아이템용 할인 프로모션 생성 API 메소드를 사용합니다.
프로모션을 비활성화하려면 프로모션 비활성화 API 메소드를 사용합니다.

보너스

프로모션을 업데이트하는 방법:

  1. 보너스 프로모션 가져오기 또는 보너스 프로모션 목록 가져오기 API 메소드를 사용하여 카탈로그에서 데이터를 가져옵니다.
  2. 보너스 프로모션 업데이트 API 메소드를 사용하여 새 매개변수 값을 전달합니다.
  3. 프로모션 활성화 API 메소드를 사용하여 프로모션을 활성화합니다.

프로모션을 생성하려면 보너스 프로모션 생성 API 메소드를 사용합니다.
프로모션을 비활성화하려면 프로모션 비활성화 API 메소드를 사용합니다.

API를 통한 아이템 생성 자동화

시스템에서 데이터를 기반으로 다수의 아이템을 생성해야 하는 경우 API를 사용하여 이 프로세스를 자동화할 수 있습니다.

필요한 작업:

아이템 그룹을 사용하려면 관리자 페이지 인터페이스에서 아이템 그룹을 미리 생성하세요.

여러 유형의 아이템을 사용하려면 다음 순서로 생성해야 합니다.

  1. 관리자 페이지의 아이템 그룹
  2. 인게임 재화
  3. 가상 아이템
  4. 인게임 재화 패키지.
  5. 번들

다음은 가상 아이템 생성 메소드를 반복적으로 호출하여 가상 아이템을 생성하는 스크립트의 예시입니다.

이 스크립트는 JavaScript와 JavaScript 런타임인 Node.js를 사용하여 개발되었습니다.

  1. “node-fetch” 모듈의 fetch 함수를 가져와서 엑솔라 서버로 HTTP 요청을 전송합니다.
Copy
Full screen
Small screen
import fetch from "node-fetch";
  1. 요청 인증에 필요한 상수를 설정합니다. <your project_id from PA><your api key from PA> 대신 프로젝트 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. 가상 아이템을 생성하기 위해 엑솔라 API에 POST 요청을 전송하는 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 함수를 추가합니다. 이 함수는 엑솔라 API에 GET 요청을 보냅니다.
    • 404 HTTP 코드가 포함된 응답이 수신되면 지정된 SKU를 가진 아이템을 찾을 수 없으므로 해당 아이템을 생성해야 합니다.
    • 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년 11월 8일

오자 또는 기타 텍스트 오류를 찾으셨나요? 텍스트를 선택하고 컨트롤+엔터를 누르세요.

문제 보고
콘텐츠를 항상 검토합니다. 여러분의 피드백은 콘텐츠를 개선에 도움이 됩니다.
후속 조치를 위해 이메일을 제공해 주세요
의견을 보내 주셔서 감사드립니다!