> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 審核使用者產生的內容

> 使用 ReportItem 和審核 API 在 PlayFab Economy v2 中建置 UGC 審核流程，以標記、審核及下架不當的使用者產生的內容。

本指南將逐一說明可用來為遊戲中的內容建立審核流程的 API 呼叫。

## 檢舉物品

玩家可以從用戶端呼叫 `ReportItem` API 來檢舉物品。必須提供物品 `Id` 或 `AlernateId`。也可以新增其他**選用**參數，包括：

* `ConcernCategory`：檢舉的疑慮類別
* `Reason`：檢舉的自由文字輸入

以下是範例要求本文：

```json theme={null}
{
  "Id": "3f5dd8d4-4ee1-4748-8855-56a8a0277bf9"
  "ConcernCategory": "Profanity",
  "Reason": "There was swearing in the description."
}
```

如果未指定，`ConcernCategory` 會預設為 `None`。有效的 `ConcernCategory` 值如下：

* `None`
* `OffensiveContent`
* `ChildExploitation`
* `MalwareOrVirus`
* `PrivacyConcerns`
* `MisleadingApp`
* `PoorPerformance`
* `ReviewResponse`
* `SpamAdvertising`
* `Profanity`

呼叫 `ReportItem` API **只會**以事件名稱 `item_reported` 觸發 PlayStream 事件。您可以使用 Game Manager 中的 [Data Explorer](/zh-TW/services/playfab/data-analytics/learn-data/data-explorer/getting-started-with-data-explorer-basic) 查詢此事件。範例查詢如下所示：

下列查詢會傳回**過去 3 天內每個 ItemId 依 ConcernCategory 區分的檢舉總數**

```kusto theme={null}
['events.all']
| where Timestamp > ago (3d)
| where FullName_Name == "item_reported"
| project ItemId = tostring(EventData.Payload.ItemId), ConcernCategory = tostring(EventData.Payload.ConcernCategory)
| summarize TotalReportCount = count() by ItemId, ConcernCategory
| sort by TotalReportCount desc
| render columnchart kind=stacked
```

下列查詢會傳回**過去 3 天內針對特定 ItemId 提交的所有檢舉**

```kusto theme={null}
['events.all']
| where Timestamp > ago (3d)
| where FullName_Name == "item_reported"
| where EventData.Payload.ItemId == "3f5dd8d4-4ee1-4748-8855-56a8a0277bf9"
| project Timestamp, ItemId = tostring(EventData.Payload.ItemId), ConcernCategory = tostring(EventData.Payload.ConcernCategory), Reason = tostring(EventData.Payload.Reason), ReportingPlayer = Entity_Id
| sort by Timestamp
```

## 變更物品的審核狀態

您可以使用 `SetItemModerationState` API 變更**已發佈**物品的審核狀態。處於 `Approved` 以外任何狀態的物品，所有玩家都無法在公用目錄上存取。物品建立者仍然可以使用 `GetItem` 和 `GetDraftItems` API 存取該物品。**遊戲實體**和**系統管理員**將能夠透過 `SearchItems`、`GetDraftItems` 和 `GetItem` 看到未核准的物品。

此 API 只能由**遊戲實體**呼叫。必須提供物品 `Id` 或 `AlernateId` 以及 `Status`。也可以新增**選用**的 `Reason` 自由文字參數。以服務呼叫來說，大致如下所示：

```json theme={null}
{
  "Status": "AwaitingModeration",
  "Reason": "User reports over threshold",
  "Id": "3f5dd8d4-4ee1-4748-8855-56a8a0277bf9"
}
```

根據預設，已發佈的物品不會有審核狀態。重新發佈草稿物品**不會**變更審核狀態。有效的 `Status` 值如下：

* `AwaitingModeration`
* `Approved`
* `Rejected`

下列查詢會傳回**過去 3 天內目前處於 `AwaitingModeration` 狀態的所有物品**

```kusto theme={null}
let TimeRange = ago(3d);
['events.all']
| where Timestamp > TimeRange
| where FullName_Name == "item_moderation_state_changed"
| project Timestamp, ItemId = tostring(EventData.Payload.ItemId)
| summarize MaxTimestamp = max(Timestamp) by ItemId
| extend TimeAndId = strcat(MaxTimestamp, "|", ItemId)
| join kind = leftouter (
    ['events.all']
    | where Timestamp > TimeRange
    | where FullName_Name == "item_moderation_state_changed"
    | project Timestamp, ItemId = tostring(EventData.Payload.ItemId), TargetStatus = tostring(EventData.Payload.TargetStatus), Reason = tostring(EventData.Payload.Reason)
    | extend TimeAndId = strcat(Timestamp, "|", ItemId)) on TimeAndId
| project Timestamp, ItemId, TargetStatus, Reason
| where TargetStatus == "AwaitingModeration"
```

## 刪除物品

您可以呼叫 `DeleteItem` API 來刪除物品。此呼叫會從草稿目錄中移除物品，並從公用目錄中移除對應的物品 (如果已發佈)。必須提供物品 `Id` 或 `AlernateId`。

```json theme={null}
{
  "Id": "852a2d2b-7754-427e-9ad4-fce2b24a4cef"
}
```


## Related topics

- [PlayFab 使用者產生的內容](/zh-TW/services/playfab/economy-monetization/economy-v2/ugc/overview.md)
- [XR-018：使用者產生的內容](/zh-TW/publishing/certification/xr/xr-018.md)
- [XR018 使用者產生的內容](/zh-TW/publishing/certification/fma/xr-018.md)
- [使用者產生的內容 (UGC) 快速入門](/zh-TW/services/playfab/economy-monetization/economy-v2/ugc/quickstart.md)
- [什麼是 PlayFab？](/zh-TW/services/playfab/get-started/what-is-playfab.md)
