请注意 我们已为 X API v2 推出名为批量合规的新合规工具。该工具支持你上传包含大量 Post 或用户 id 的数据集,以获取其合规状态,从而确定需要采取哪些操作,使你的数据集达到合规要求。
此外,批量合规和合规 Firehose 均已更新以支持 Post 编辑。对于合规 Firehose,新增了“tweet_edit”事件。有关更多详情,请参阅合规数据对象文档。前往编辑 Post 基础页面了解 Edit Post 元数据的工作方式。
概览
Enterprise
X 的核心价值之一是捍卫并尊重用户的声音。这包括在用户删除、修改或编辑其在 X 上分享的内容时,尊重其期望和意图。我们认为,这对于作为全球最大公共、实时信息平台之一的长期健康至关重要。X 将控制权交到用户手中,使个人能够掌控自己的 X 使用体验。我们认为,接收 X 数据的商业用户有责任尊重终端用户的期望和意图。
有关 X 平台上可能发生的合规事件类型的更多信息,请参阅我们的文章:在 X 上尊重用户意图。
任何通过 API 使用 X 数据的开发者或公司都有义务尽一切合理努力来遵循用户内容的变更。该义务同样适用于删除、修改以及共享选项的更改(例如,内容变为受保护或被限制)等用户事件。这也包括当用户编辑其 Post 时。请参考开发者政策和/或您的 X 数据协议中的具体措辞,以了解该义务如何影响您对 X 数据的使用。
X 提供以下解决方案,用于提供这些用户合规事件的信息,以及某条特定 Post 或 User 是否对公众可见。以下是这些解决方案及其通用集成模式的简要概述:
GET statuses/lookup 和 GET users/lookup
- 格式:REST API。请参见:GET statuses/lookup 和 GET users/lookup。
- 这些端点始终返回任意 Post 编辑的最新版本。所有在编辑功能推出后创建的 Post 对象都会包含 Post 编辑元数据,即便该 Post 实际上未被编辑。
- 对于所有 Post,创建后超过 30 分钟再发起的请求将表示其最终状态。
- 按调用方在 API 请求中的定义,提供特定 Post 或 User 的可用性信息。
- 可用于对特定一组 Post/User 的当前可用性状态进行临时抽检。
- 适用于需要在特定时间点检查某个 Post 或 User 当前状态的客户。
-
这些 API 为需要检查某段内容可用性的客户提供了实用机制,例如在以下情况下:
- 展示 Post
- 以 1:1 方式与 Post 或 User 互动
- 通过许可的文件下载向第三方分发 X 内容
- 长期存储 Post
合规 Firehose(仅企业版)
- 格式:流式 API。参见:Compliance Firehose。
- 提供 X 上合规活动的实时流。这些活动包括对 Posts 的编辑等。
- 可用于在平台出现新的合规事件时,维护一组已存储 data 的合规状态。
- 适合长期获取并存储大量 X data 的客户。
使用指南
合规性最佳实践
建议与最佳实践
- 构建存储数值型 Post ID 和 User ID 的数据存储 Schemas:用户层面的消息要求对该用户的所有 Posts 采取相应操作。鉴于所有合规消息仅通过数值型 ID 投递,设计能够基于数值型 ID 维护 Post 与 User 关系的存储 schemas 至关重要。数据使用方需要同时按 Post ID 和 User ID 监控合规事件,并能够相应更新本地数据存储。
- 构建涵盖所有合规状态的 Schemas:根据各类应用处理合规活动的方式,可能需要向数据存储添加其他元数据。例如,数据使用方可能会向现有数据库添加元数据,以便在受到 status_withheld 消息影响的国家/地区限制内容展示。
- 处理 Retweet 删除:Retweet 是一种特殊的 Post,其中原始消息作为对象嵌套在 Retweet 内部。在这种情况下,Retweet 中会引用两个 Post ID——Retweet 自身的 ID,以及原始消息的 ID(包含在嵌套对象中)。当原始消息被删除时,会针对原始 ID 发出 Post 删除消息。Post 删除事件通常会触发所有相关 Retweet 的删除事件。但在某些情况下可能不会全部发送,客户端系统应能容忍不完整的 Retweet 删除。删除原始 ID 通常足以删除所有后续 Retweet。最佳实践是在存储 Retweet 时引用原始 Post ID,并在收到 Post 删除事件时删除所有被引用的 Retweet。
合规性数据对象
Compliance Firehose API
- 关于 User 状态请参见此处,关于已删除 Post 的开发者政策请参见此处。
- Compliance Firehose 现已支持 ‘tweet_edit’ 事件。
- 多种 User 的删除、保护和停用事件不一定是永久状态,且可能在不同状态之间无限切换。这些包括:user_delete、user_undelete、user_protect、user_unprotect,以及 user_suspend、user_unsuspend。
- 仅当用户未选择对其账户执行 user_undelete 时,user_delete 发生后 30 天才会出现相应的 status_delete。用户可能会撤销一次 user_delete,从而在 30 天后不会对其所有 Post 触发删除。
- user_suspend 在发生后将持续有效,除非随后发生 user_unsuspend 事件。该状态不受 30 天期限内的任何更改影响。
| Original Message Type | Object | Permanent (Yes/No) | Recommended Action |
|---|---|---|---|
| delete | Status | Yes | 删除关联的 Post。 |
| status_withheld | Status | Yes | 在 status_withheld 消息中列明的特定国家/地区屏蔽关联的 Post。 |
| drop | Status | No | 将该 Post 从公开视图中移除。 |
| undrop | Status | No | 可再次显示该 Status,并视为公开。 |
| tweet_edit | Status | Yes | 遵从并在适用时显示新的编辑内容。 |
| user_delete | User | No | 隐藏或删除关联用户的所有 Post。 |
| user_undelete | User | No | 关联用户的所有 Post 可再次显示并视为公开。 |
| user_protect | User | No | 隐藏或删除关联用户的所有 Post。 |
| user_unprotect | User | No | 关联用户的所有 Post 可再次显示并视为公开。 |
| user_suspend | User | No | 隐藏或删除关联用户的所有 Post。 |
| user_unsuspend | User | No | 关联用户的所有 Post 可再次显示并视为公开。 |
| scrub_geo | User | Yes | 删除 X 为该用户在 scrub_geo 消息中指定的 Post 之前提供的所有地理数据。请注意,该用户后续的 Post 可能包含可使用的地理数据。 |
| user_withheld | User | Yes | 在 user_withheld 消息中列明的特定国家/地区屏蔽关联用户的 Post。 |
| delete | Favorite | Yes | 删除关联的点赞/收藏。 |
有效载荷示例
删除 Post
被限制显示的 Post
丢弃
取消丢弃
清除地理信息
用户删除
恢复用户
用户被隐藏
用户保护
取消取消保护的用户
用户暂停
解除用户停权
集成 Compliance Firehose
集成 Compliance Firehose
- 与 Compliance Firehose 的每个流式 API 分区建立流式连接
- 处理高数据量——通过异步流程将流式摄取与后续处理解耦
- 在因任何原因断开时,自动重新连接到各流分区
- 按照上述指南,处理与你已存储的 Post 和 User 数据相关的合规事件
尊重在 X 上的用户意图
用户
| 操作 | 说明 |
|---|---|
| 保护账户 | X 用户可随时将其账户设为受保护或取消保护。受保护账户需要用户逐一手动批准获准查看其账户 Post 的每位用户。 更多信息,请参见关于公开和受保护的 Post。 |
| 删除账户 | X 用户可随时选择删除其账户及所有关联的状态消息。X 会在删除后保留账户信息 30 天,以便用户决定撤销删除并重新激活其账户。 |
| 清除地理信息 | X 用户可随时从以往的 Post 中移除所有位置信息,这称为“scrub geo(清除地理信息)”。 |
| 暂停账户 | X 保留暂停违反 X 规则的账户,或在怀疑账户遭入侵或被攻破时暂停账户的权利。账户暂停仅可由 X 撤销(解除暂停)。 |
| 限制账户 | X 保留按需在特定国家/地区限制访问某些内容的权利。被限制的账户只能由 X 解除限制。 更多信息,请参见按国家/地区限制的内容。 |
状态
| 操作 | 说明 |
|---|---|
| 删除状态 | X 用户可在任何时间删除状态。删除后无法恢复,且会被永久移除。 |
| 限制状态 | X 保留不时在特定国家/地区对某些内容采取被动限制访问措施的权利。被限制的状态仅可由 X 取消限制。 更多信息,请参见 按国家/地区限制的内容。 |
跟踪用户与状态变更
API 参考文档
GET compliance/firehose
方法
| 方法 | 说明 |
|---|---|
| GET /compliance/:stream | 连接到数据流 |
认证
GET /compliance/:stream
| Request Method | HTTP GET |
| Connection Type | Keep-Alive |
| URL | 可在你的仪表板中该流的 API Help 页面找到,结构类似如下: https://gnip-stream.x.com/stream/compliance/accounts/:account_name/publishers/twitter/:stream_label.json?partition=1 **注意:**必须包含 “partition” 参数。要获取完整数据流,你需要连接全部 8 个分区,每个分区包含总量的 12.5%。 |
| Compression | Gzip。要使用 Gzip 压缩连接到数据流,只需在连接请求中携带 Accept-Encoding 头。该头应如下所示: Accept-Encoding: gzip |
| Character Encoding | UTF-8 |
| Response Format | JSON。你的请求头应指定响应采用 JSON 格式。 |
| Rate Limit | 每 60 秒 10 次请求。 |
| Read Timeout | 在客户端上设置读超时,并确保其值大于 30 秒。 |
| Support for Tweet edits | 所有 Tweet 编辑都会触发 “tweet_edit” 合规事件。更多详情请参见Compliance Data Objects 文档。 |
partition=1,要完整消费该数据流,你需要连接所有 8 个分区。
响应代码
| 状态 | 文本 | 定义 |
|---|---|---|
| 200 | 成功 | 连接已成功建立,新的活动会在到达时发送。 |
| 401 | 未经授权 | 凭据无效导致 HTTP 认证失败。请使用你的凭据登录 console.gnip.com,确保在请求中正确使用它们。 |
| 406 | 不可接受 | 通常发生在你的客户端未正确在请求头中声明可接受来自流的 gzip 编码时,但也可能在其他情况下出现。将包含类似于“This connection requires compression. To enable compression, send an ‘Accept-Encoding: gzip’ header in your request and be ready to uncompress the stream as it is read on the client end.”的 JSON 消息。 |
| 429 | 频率限制 | 你的应用已超出连接请求的限制。 |
| 503 | 服务不可用 | X 服务器问题。请使用指数退避策略重新连接。若 X API Status Page 未发布有关该问题的公告,请联系支持。 |
其他建议与最佳实践
- 设计数据存储模式以保存数值型 Tweet ID 和 User ID:合规消息要求对该用户的所有 Tweet 采取相应处理。鉴于所有合规消息仅通过数值型 ID 传递,务必设计能基于数值型 ID 维护 Tweet 与 User 关联关系的存储模式。数据使用方需要同时按 Tweet ID 和 User ID 监控合规事件,并能够相应更新本地数据存储。
- 构建覆盖所有合规状态的模式:根据各应用中处理合规活动的方式,可能需要在数据存储中添加其他元数据。例如,数据使用方可能会在现有数据库中添加元数据,以便在受 status_withheld 消息影响的国家/地区限制内容展示。
- 处理 Retweet 删除:Retweet 是一种特殊的 Tweet,原始消息以嵌套对象的形式包含在 Retweet 中。在这种情况下,Retweet 中会引用两个 Tweet ID——一个是 Retweet 的 ID,另一个是原始消息的 ID(包含在嵌套对象中)。当原始消息被删除时,会针对原始 ID 发出 Tweet 删除消息;不会针对所有 Retweet 再次发出后续删除消息。删除原始 ID 即可足以删除所有后续 Retweet。