> For the complete documentation index, see [llms.txt](https://docs.ggwp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ggwp.com/kr/api/ggwp.md).

# 기술 가이드: GGWP로 마이그레이션

## 1. 기본 통합

### 1.1 시작하기

* GGWP 담당자에게서 API 키와 환경 정보(dev/prod)를 받으세요.
* 저희의 [표준 패키지](/kr/api/standard-package.md#authentication) 인증 관련 자세한 내용은 섹션을 검토하세요.

### 1.2 데이터 준비

GGWP의 채팅 API는 최소 필수 필드로 구성된 간단한 JSON 페이로드를 받습니다:

* **session\_id** (예: "match\_123")
* **user\_id** (예: "player\_456")
* **message** (예: "fuck you")

참고: 다음과 같은 선택적 메타데이터(예:) *타임스탬프, 사용자명, 언어, message\_url, 채널,* 또는 *참여자* 도 포함될 수 있습니다.

### 1.3 GGWP에 데이터 전송

REST API 엔드포인트를 사용하여 실시간으로 채팅 메시지를 전송하세요.

* POST /chat/v2/message
* 응답에는 카테고리 플래그, 심각도 및 필터링된 텍스트가 포함됩니다.

{% tabs %}
{% tab title="cURL" %}

```bash
curl --request POST 'https://api.ggwp.com/chat/v2/message' \
--header 'x-api-key: <GGWP_API_KEY>' \
--header 'x-api-config: <BASE64_ENCODED_CONFIG>' \
--header 'Content-Type: application/json' \
--data-raw '{
  "session_id": "match_1234",
  "message": "You are such an idiot!",
  "user_id": "user001",
  "username": "playerOne",
  "timestamp": "2024-09-01 12:00:00"
}'

```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import json

# API 엔드포인트
url = "https://api.ggwp.com/chat/v2/message"

# API 키와 구성을 헤더에 설정하세요
headers = {
    "x-api-key": "<GGWP_API_KEY>",
    "x-api-config": "<BASE64_ENCODED_CONFIG>",
    "Content-Type": "application/json"
}

# 메시지 데이터로 페이로드를 정의하세요
payload = {
    "session_id": "match_1234",
    "message": "You are such an idiot!",
    "user_id": "user001",
    "username": "playerOne",
    "timestamp": "2024-09-01 12:00:00"
}

# POST 요청 전송
response = requests.post(url, headers=headers, data=json.dumps(payload))

# 응답 상태 코드와 JSON 응답을 출력하세요
print(response.status_code)
print(response.json())

```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// API 엔드포인트
const url = 'https://api.ggwp.com/chat/v2/message';

// API 키와 구성을 헤더에 설정하세요
const headers = {
  'x-api-key': '<GGWP_API_KEY>',
  'x-api-config': '<BASE64_ENCODED_CONFIG>',
  'Content-Type': 'application/json'
};

// 메시지 데이터로 페이로드를 정의하세요
const payload = {
  session_id: 'match_1234',
  message: 'You are such an idiot!',
  user_id: 'user001',
  username: 'playerOne',
  timestamp: '2024-09-01 12:00:00'
};

// POST 요청 전송
axios.post(url, payload, { headers })
  .then(response => {
    console.log(response.status);    // 상태 코드 출력
    console.log(response.data);      // 응답 데이터 출력
  })
  .catch(error => {
    console.error(error);            // 오류 처리
  });

```

{% endtab %}

{% tab title="Java" %}

```java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ChatApiRequest {
    public static void main(String[] args) throws Exception {
        // API 엔드포인트
        String url = "https://api.ggwp.com/chat/v2/message";

        // API 키 및 base64로 인코딩된 구성
        String apiKey = "<GGWP_API_KEY>";
        String apiConfig = "<BASE64_ENCODED_CONFIG>";

        // 메시지 데이터로 페이로드를 정의하세요
        String payload = "{"
                + "\"session_id\": \"match_1234\","
                + "\"message\": \"You are such an idiot!\","
                + "\"user_id\": \"user001\","
                + "\"username\": \"playerOne\","
                + "\"timestamp\": \"2024-09-01 12:00:00\""
                + "}";

        // HTTP 클라이언트 생성
        HttpClient client = HttpClient.newHttpClient();

        // 헤더와 페이로드로 POST 요청 구성
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("x-api-key", apiKey)
                .header("x-api-config", apiConfig)
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(payload))
                .build();

        // 요청 전송 및 응답 수신
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        // 응답 상태 코드와 본문 출력
        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}

```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // API 엔드포인트
        string url = "https://api.ggwp.com/chat/v2/message";

        // API 키 및 base64로 인코딩된 구성
        string apiKey = "<YOUR_API_KEY>";
        string apiConfig = "<BASE64_ENCODED_CONFIG>";

        // 메시지 데이터로 페이로드를 정의하세요
        string payload = @"{
            ""session_id"": ""match_1234"",
            ""message"": ""You are such an idiot!"",
            ""user_id"": ""user001"",
            ""username"": ""playerOne"",
            ""timestamp"": ""2024-09-01 12:00:00""
        }";

        // HttpClient 인스턴스 생성
        using HttpClient client = new HttpClient();

        // 요청에 헤더 추가
        client.DefaultRequestHeaders.Add("x-api-key", apiKey);
        client.DefaultRequestHeaders.Add("x-api-config", apiConfig);

        // 보낼 콘텐츠 준비
        var content = new StringContent(payload, Encoding.UTF8, "application/json");

        // POST 요청 전송 및 응답 수신
        HttpResponseMessage response = await client.PostAsync(url, content);

        // 응답 상태 코드와 본문 출력
        Console.WriteLine(response.StatusCode);
        Console.WriteLine(await response.Content.ReadAsStringAsync());
    }
}

```

{% endtab %}
{% endtabs %}

## 2. 정책 정렬 및 맞춤화

### 2.1 카테고리 매핑

GGWP는 아래에 설명된 모델 카테고리의 포괄적인 목록을 제공합니다.

저희 팀은 이러한 카테고리를 기존의 검열 구성과 매핑하여 전환이 원활하고 정책에 부합하도록 긴밀히 협력할 것입니다.

자세한 모델 정의와 예시는 저희의 [텍스트 및 음성 모델 용어집](/kr/text-and-voice-model-glossary.md).

#### **파괴적 탐지**

* **정체성 공격**
  * 정체성 혐오
  * 정체성 편향
  * 성별 편향
* **괴롭힘**
  * 자해
  * 위협
  * 성폭력
  * 성희롱
  * 성적 콘텐츠
  * 언어적 학대
  * 집단 괴롭힘
* **부적절한 콘텐츠**
  * 모욕적 언어
  * 게임 플레이 비판
  * 비건설적 비판
  * 마약 언급
  * 스팸
  * 링크 공유
  * 개인식별정보(PII)
  * 사기
  * 권유
  * 연령 관련 우려

#### **경고(Alerts)**

* 아동 유인
* 극단주의
* 정신 건강 위험

#### **친사회적 탐지**

* 감사
* 칭찬
* 팀워크
* 친절
* 긍정적 태도

### 2.2 필터 구성

대시보드의 구성 레버를 사용하여 각 탐지 카테고리의 엄격성을 사용자화하거나 [채팅 API v2 (레거시)](/kr/api/standard-package/api-v2.md#headers) 또는 대시보드를 통해 직접:

* **임계값 제어**: 필터링 민감도 조정(낮음, 보통, 높음)
* **맞춤 차단 목록 및 허용 목록**: 탐지 동작을 세밀 조정하기 위해 자체 용어나 예외를 추가

## 3. 중재 도구

### 3.1 대시보드 접근

저희의 [대시보드 사용자 가이드](/kr/dashboard-user-guide.md) 을(를) 따라 중재된 콘텐츠에 대한 전체 가시성을 확보하세요:

* 사건 검색 및 검토
* 언어, 심각도, 세션 또는 플레이어별 필터링
* 수동 조치 수행(경고, 음소거, 차단)

### 3.2 구성 관리

코드 변경 없이 GGWP 대시보드에서 필터 설정을 직접 수정하세요. 업데이트는 즉시 적용됩니다.

## 4. 자동화

### 4.1 실시간 필터링

GGWP의 API 출력을 채팅 시스템에 직접 통합하여 유해한 콘텐츠를 실시간으로 자동 차단하거나 마스킹하세요. 주로 API 응답의 `recommended_message` 키를 클라이언트로 전달하여 다른 사용자에게 표시합니다. 다음은 부분적인 응답 예시입니다:

```json
{
  "message_details": {
    "message_id": "20240901120000.000000-ae254ea9-f9ca-4dd8-bfd1-f1ac98f84f83",
    "original_message": "You are such an idiot!",
    "flag": true,
    "severity": "medium",
    "filtered_message": "You are such an *****!",
    "replaced_message": "team edward >>>>>> team jacob",
    "recommended_message": "",
    "language": "english",
    "violence": false,
    "verbal_abuse": true,
    ...
  },
  "player_details": {
    ...
    "user_status": {
      "status": "muted",
      "expiry_at": "2024-09-02 11:59:48"
    }
  },
  ...
}
```

#### 룸별 필터 설정 via `x-api-config`

채팅룸 유형(예: 공개 채팅은 더 엄격하게, 파티 채팅은 더 관대하게)에 따라 다른 필터 민감도를 설정하려면 헤더에 base64로 인코딩된 JSON 객체를 전달하세요. `x-api-config` 아래 예시는 “공개 룸”(더 엄격)과 “파티/DM”(더 관대)을 보여줍니다.&#x20;

* 생성 `config.json`&#x20;

{% tabs %}
{% tab title="공개 룸(더 엄격)" %}

```json
{
  "violence":"high",
  "sexual_content":"high",
  "verbal_abuse":"high",
  "identity_hate":"high",
  "profanity":"high",
  "link_sharing":"high",
  "drugs":"on",
  "spam":"on",
  "self_harm":"on",
  "pii":"on",
  "scam":"on",
  "solicitation":"on",
  "age_concern":"on"
}

```

{% endtab %}

{% tab title="파티/DM(더 관대)" %}

```json
{
  "violence":"off",
  "sexual_content":"low",
  "verbal_abuse":"low",
  "identity_hate":"medium",
  "profanity":"off",
  "link_sharing":"off",
  "drugs":"off",
  "spam":"off",
  "self_harm":"on",
  "pii":"off",
  "scam":"on",
  "solicitation":"off",
  "age_concern":"off"
}

```

{% endtab %}
{% endtabs %}

* Base64로 변환:

{% code overflow="wrap" %}

```bash
$ base64 config.json
ewogICJub25fZXhwbGljaXRfbnVkaXR5IjogIm9mZiIsCiAgImdhbWJsaW5nIjogIm9mZiIsCiAgInZpb2xlbmNlIjogIm9uIgp9
```

{% endcode %}

* 요청 예:

{% code overflow="wrap" %}

```bash
curl --request POST 'https://api.ggwp.com/chat/v2/message' \
--header 'x-api-key: <GGWP_API_KEY>' \
--header 'x-api-config: <BASE64_ENCODED_CONFIG>' \
--header 'Content-Type: application/json' \
--data-raw '{
  "session_id": "match_1234",
  "message": "You are such an idiot!",
  "user_id": "user001",
  "username": "playerOne",
  "timestamp": "2024-09-01 12:00:00"
}'

```

{% endcode %}

### 4.2 GGWP 자동모드

GGWP 자동모드를 활성화하여 간단한 설정으로 플레이어 경고, 제재 또는 기타 조치를 트리거하세요 [웹훅](/kr/webhooks.md).

#### **웹후크 설정**

* **웹후크 엔드포인트 정의**:\
  POST 요청을 받을 수 있는 서버상의 URL을 만드세요.
* **웹후크 이벤트 구독**:\
  다음은 플레이어 제재 처리를 위해 처리해야 할 관련 이벤트 목록입니다:

  * [/pages/bfafcf6045df9435008fc1b2294984eb324bcf63#id-1.-player-sanctioned](https://docs.ggwp.com/kr/api/pages/bfafcf6045df9435008fc1b2294984eb324bcf63#id-1.-player-sanctioned "mention")
  * [/pages/bfafcf6045df9435008fc1b2294984eb324bcf63#id-2.-player-reinstated](https://docs.ggwp.com/kr/api/pages/bfafcf6045df9435008fc1b2294984eb324bcf63#id-2.-player-reinstated "mention")
  * [/pages/bfafcf6045df9435008fc1b2294984eb324bcf63#id-3.-warning](https://docs.ggwp.com/kr/api/pages/bfafcf6045df9435008fc1b2294984eb324bcf63#id-3.-warning "mention")

  이벤트 유형을 구독하려면 다음 API 요청을 사용하세요:

```bash
curl --request POST 'https://api.ggwp.com/webhook/v1/subscriptions' \
--header 'x-api-key: <GGWP_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
  "url": "https://example.com/customerapi",
  "enabled": true,
  "event_type": "player-sanctioned",
  "version": "1.1"
}'
```

* **이벤트 수신**

  구독이 완료되면 귀하의 웹후크 엔드포인트는 다음과 같은 이벤트를 받기 시작합니다 `player-sanctioned`. 엔드포인트가 다음을 수행하도록 구성되어 있는지 확인하세요:

  * **요청이 GGWP에서 온 것인지 확인하기 위해 `secret_key`** 를 검증하세요.
    * 참고: 각 구독에는 고유한 `secret_key`가 있습니다. 이를 안전하게 저장하세요; GGWP에서 온 웹후크 요청인지를 검증하는 데 사용됩니다.
  * **들어오는 페이로드를 파싱** 하고 사건 데이터를 처리하세요.
  * **응답으로 `200 OK`** 를 반환하여 수신을 확인하세요.

**샘플 웹후크 페이로드**

주로 웹후크 페이로드의 `player_sanction` 키를 보고 해당 행동을 클라이언트에 전달하세요. 다음은 부분적인 응답 예시입니다:

```json
{
  "type": "player-sanctioned",
  "event_id": "edce24d3-bf56-46b4-b5ea-40266mnaa5a84",
  "created_at": "2022-06-02 16:49:00",
  "data": {
    "session_id": "freeforallsession_o34u2",
    "incident_id": "20230629051500.000000-1aaf864e-1cdc-4c10-b1f2-ec90bfd4b244",
    "user_id": "12aladf91",
    "username": "sharonsfakeaccount",
    "reputation_score": 150,
    "player_sanction": {
      "status": "muted",
      "duration": 86400,
      "expiry_at": "2022-06-03 16:49:00"
    },
    "ladder_level_change": {
      "current_ladder_level": 1,
      "previous_ladder_level": 0
    },
    ...
  }
}
```

#### **자동모드 규칙 구성**

규칙은 완전히 구성 가능하며 사건 심각도, 신뢰도, 플레이어 평판 점수 또는 최근 사건 등 다양한 요인의 조합을 고려할 수 있습니다.

저희 팀은 자동모드를 귀하의 커뮤니티 요구에 최적화되고 자동 조치의 영향에 대한 투명성을 제공하는 방식으로 배포할 수 있도록 긴밀히 협력할 것입니다. &#x20;

## 5. 다른 워크플로 연결

### 5.1 멀티모달 중재

텍스트 채팅을 넘어 중재를 확장하세요. GGWP는 또한 다음을 지원합니다:

* [음성 중재](https://docs.ggwp.com/api-docs-voice): 오디오 네이티브 모델 + STT 파이프라인을 통해 텍스트 엔진에 연결
* [사용자명](https://docs.ggwp.com/api-docs-usernames): 부적절한 핸들 및 기타 짧은 형식 텍스트 감지를 위해
* [플레이어 신고](https://docs.ggwp.com/api-docs-reports): 플레이어가 제출한 신고를 수집, 분석 및 분류
* 이미지(베타): 노골적이거나 폭력적인 시각 자료 감지

### 5.2 외부 시스템 통합

* [티켓팅](https://docs.ggwp.com/webhooks/webhook-events#id-4.-workflow-integrations): 사건을 Jira, Zendesk 또는 내부 중재 큐로 푸시.
* [항소](https://docs.ggwp.com/api-docs-appeals): 전체 수명주기 관리를 위해 플레이어 항소 시스템을 연결.
* [맥락 데이터](https://docs.ggwp.com/api-docs-contextual-information): 플레이어 지출, 활동, 소셜 그래프 정보 및 기타 관련 입력으로 중재 컨텍스트를 강화하세요.<br>
