> ## 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.

# PlayFab GDPR - 删除和导出玩家数据

> 如何使用 PlayFab 管理 API 导出或删除玩家的数据，以便你可以符合通用数据保护条例 (GDPR)。

PlayFab 致力于遵守通用数据保护条例 (GDPR)——作为你的服务提供商，确保为你提供允许玩家查看或删除关于他们所存储数据的必要钩子。

虽然我们不能为你提供法律建议——*我们确实鼓励你寻求法律顾问以确保你符合 GDPR*——但我们在这里帮助你履行 GDPR 下的义务。

PlayFab 有三个可用的 API 来帮助你响应玩家数据请求：

* [GetPlayedTitleList](xref:titleid.playfabapi.com.admin.accountmanagement.getplayedtitlelist) - 调用此 API 以获取具有与给定玩家关联数据的 TitleId 列表。此列表按 PublisherID 划定范围，并代表如果你要删除或导出该玩家的数据时会受到影响的标题集。
* [DeleteMasterPlayerAccount](xref:titleid.playfabapi.com.admin.accountmanagement.deletemasterplayeraccount) - 调用此 API 以删除给定玩家的记录。
* [ExportMasterPlayerData](xref:titleid.playfabapi.com.admin.accountmanagement.exportmasterplayerdata) - 调用此 API 以导出给定玩家的所有关联数据和记录。

## 确保找到所有数据

在使用 `DeleteMasterPlayerAccount` 或 `ExportMasterPlayerData` API 之前，务必要记住你的玩家可能在你的工作室中创建了多个主玩家账户。

当玩家使用不同的设备或不同的凭据来玩你的标题时可能会发生这种情况。因为他们提供的是不同且不相关的凭据（例如，不同的电子邮件地址或社交媒体账户），我们将他们解释为唯一的玩家。

玩家可能拥有多个主玩家账户的另一种方式是，如果你已将工作室配置为使用多个 Publisher ID；然而，拥有多个 Publisher ID 并不常见。

你可以在 PlayFab Game Manager 中每个标题设置菜单的 **API Features** 选项卡上检查标题的 Publisher ID。

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/player-progression/player-data/tutorials/playfab-settings-api-tab.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=b26ea6fe4188ebef5fb76a58b4ae1b07" alt="PlayFab - 设置 - API 选项卡" width="2560" height="1184" data-path="images/playfab/player-progression/player-data/tutorials/playfab-settings-api-tab.png" />

你了解你的标题以及它们如何对玩家进行身份验证。在调用 `DeleteMasterPlayerAccount` 或 `ExportMasterPlayerData` 之前，请确保从玩家那里收集正确的设备 ID 和/或凭据集。

有了这些凭据，我们就可以识别*每个*主玩家账户的 PlayFabId。

以下 API 帮助你将凭据转换为 `PlayFabId`：

* [GetUserAccountInfo](xref:titleid.playfabapi.com.admin.accountmanagement.getuseraccountinfo) - 此 API 帮助你按电子邮件、`TitleDisplayName`、`PlayFabId` 或 `PlayFabUsername` 查找玩家。
* [GetPlayerIdFromAuthToken](xref:titleid.playfabapi.com.admin.accountmanagement.getplayeridfromauthtoken) - 此 API 允许你根据玩家登录时授予的特定 `AuthToken` 查找玩家。
* [GetPlayFabIDsFromFacebookIDs](xref:titleid.playfabapi.com.server.accountmanagement.getplayfabidsfromfacebookids) - 此 API 从一个或多个 `FacebookId` 派生玩家的 `PlayFabId`。
* [GetPlayFabIDsFromSteamIDs](xref:titleid.playfabapi.com.server.accountmanagement.getplayfabidsfromsteamids) - 此 API 从一个或多个 `SteamIds` 派生玩家的 `PlayFabId`。

<Note>
  所有这些 API 都是特定于标题的。前两个是管理 API，后两个是服务器 API。
</Note>

即使你的玩家只有一个 PlayFabId，他们也可能使用该 ID 玩过你多个标题中的一个以上。这意味着他们的数据请求可能跨多个标题。

要获取此标题列表，请为每个 PlayFabId 调用 `GetPlayedTitleList`。你*可能*希望告知玩家他们的请求将影响返回的标题列表。

此外，`GetPlayedTitleList` 返回 `TitleIds`，*而不是* `Title Names` - 请考虑在确认页面上显示之前将这些 ID 转换为 `Title Names`。

以下是一段小的伪代码，可以更好地描绘我们的意思...

```csharp theme={null}
//Here you would iterate through a request of known Ids, Emails, linked accounts  
//or other PlayFab searchable info on the player that you have.
//and store it in user credentials for that player.
user {
  credentials: (email/ids/linked accounts)
}

//create a variable to hold a list of all the PlayFabIds you want to remove.
PlayFabIdList

//create a list of affected titles
AffectedTitles

//Keep track of all your titles, this is important
//and should include all titles across all your namespaces.
foreach(title in <all my titles>){

    //each user record you have for the player, you should have a list of credentials for that player
    //so you can find them in PlayFab
    foreach(cred in user.credentials){
      //There are a few helper Admin and Server API's that help you do this part.
      //See below this pseudo code block for some tips!
      pfid = <find PlayFabId in Title using the credential>
      PlayFabIdList.add(pfid)
    }

    //go through the list of PlayFabIds that you have and fine all titles that
    //performing the action would affect
    foreach(pfid in PlayFabIdList){
      AffectedTitles = title.GetPlayedTitleList(pfid)
    }
}
```

以下是关于如何使用 **GetPlayedTitleList** 的快速示例。

```csharp theme={null}
public static async void StartFindTitlesExample(Action<PlayFabError> callback)
{

    var task = await PlayFabAdminAPI.GetPlayedTitleListAsync(new GetPlayedTitleListRequest() {
        PlayFabId = PlayFabId
    });

    if(task.Error != null)
    {
        callback(task.Error);
        return;
    }

    var TitleList = task.Result.TitleIds;
    foreach (var title in TitleList)
    {
        Console.WriteLine(string.Format("Title Found: {0}", title));
    }
    callback(null);
}
```

此时你已经有了该玩家的 `PlayFabId` 列表（基于他们共享的凭据）以及每个 `PlayFabId` 的标题列表。现在怎么办？

现在你已准备好删除或导出了！

## 其他注意事项

使用这些 API 很容易造成伤害。为错误的玩家导出数据或删除错误的玩家可能会非常有害，而且是**永久性的**！

作为游戏开发者，你有责任验证凭据是否与请求导出或删除其玩家数据的玩家匹配。使用这些 API 时，PlayFab 不提供任何类型的验证。

不过，PlayFab 确实提供了[电子邮件验证功能](/services/playfab/live-service-management/game-configuration/title-communications/emails/using-a-rule-to-verify-a-contact-email-address)。但我们的解决方案并不是唯一的验证选项。你也可以创建自己的流程。

无论你使用哪种技术，我们建议你在执行任何这些操作之前进行某种验证。


## Related topics

- [PlayFab GDPR - 导出玩家数据](/zh-CN/services/playfab/data-analytics/privacy-compliance/gdpr-exporting-player-data.md)
- [PlayFab GDPR - 删除玩家数据](/zh-CN/services/playfab/data-analytics/privacy-compliance/gdpr-deleting-player-data.md)
- [PlayFab 玩家进程文档](/zh-CN/services/playfab/player-progression/index.md)
- [PlayFab 数据与分析文档](/zh-CN/services/playfab/data-analytics/index.md)
- [玩家数据](/zh-CN/services/playfab/player-progression/player-data/index.md)
