> ## 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](/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 访问该物品。**Title 实体**和**管理员**可以通过 `SearchItems`、`GetDraftItems` 和 `GetItem` 查看非已批准的物品。

该 API 只能由 **title 实体**调用。必须提供物品的 `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-CN/services/playfab/economy-monetization/economy-v2/ugc/overview.md)
- [发布你的第一个用户生成内容](/zh-CN/services/playfab/economy-monetization/economy-v2/tutorials/publish-ugc.md)
- [用户生成内容 (UGC) 快速入门](/zh-CN/services/playfab/economy-monetization/economy-v2/ugc/quickstart.md)
- [PlayFab Economy v2 文档](/zh-CN/services/playfab/economy-monetization/index.md)
- [FMA：XR-018 用户生成内容](/zh-CN/publishing/certification/fma/xr-018.md)
