请注意 我们已在 X API v2 中发布一款新的合规工具,名为批量合规。该工具允许您上传包含大量 Post 或用户 id 的数据集,以获取其合规状态,从而确定需要采取哪些措施使您的数据集满足合规要求。
此外,批量合规和合规 firehose 均已更新以支持 Post 编辑。对于合规 firehose,新增了一个“tweet_edit”事件。有关更多详情,请参阅合规数据对象文档。要了解 Edit Post metadata 的工作原理,请参见Edit Posts 基础页面。
概述
Enterprise
X 的核心价值之一是捍卫并尊重用户的声音。这包括在用户删除、修改或编辑其在 X 上选择分享的内容时,尊重其期望与意图。我们相信,这对于作为全球最大公共、实时信息平台之一的长期健康发展至关重要。X 将控制权交到用户手中,使个人能够掌控自己的 X 使用体验。我们认为,获取 X 数据的商业用户有责任尊重终端用户的期望与意图。
有关 X 平台上可能发生的合规事件类型的更多信息,请参阅我们的文章:Honoring User Intent on X。
任何通过 API 获取并使用 X 数据的开发者或公司都有义务尽一切合理努力来遵循用户内容的变更。该义务涵盖用户事件,例如删除、修改以及共享选项的变更(例如内容变为受保护或被限制)。这也包括用户编辑其 Post 的情况。请参阅Developer Policy中的具体条款和/或你的 X Data Agreement,以了解此义务如何影响你对 X 数据的使用。
X 提供以下解决方案,用于传递这些用户合规事件的信息,以及特定 Post 或 User 是否公开可用的状态。以下是这些解决方案及其通用集成模式的简要概述:
GET statuses/lookup 和 GET users/lookup
- 格式:REST API。参见:GET statuses/lookup 和 GET users/lookup。
- 这些 endpoint 始终返回任何 Post 编辑的最新版本。引入编辑功能后创建的所有 Post 的 Post 对象都会包含 Post 编辑的 metadata,即使该 Post 实际未被编辑也是如此。
- 对于所有 Post,在创建超过 30 分钟后的请求将反映该 Post 的最终状态。
- 按调用方在 API 请求中指定的对象,返回特定 Post 或用户的可用性信息。
- 可用于对特定一组 Post/用户的当前可用性状态进行临时抽查。
- 适用于需要在某一特定时间点检查某个 Post 或用户当前状态的客户。
-
这些 API 为需要检查某段内容可用性的客户提供了实用机制,例如:
- 展示 Post
- 以 1:1 的方式与某个 Post 或用户进行互动
- 通过允许的文件下载将 X 内容分发给第三方
- 长期存储 Post
合规 Firehose(仅限 Enterprise)
- 格式:流式 API。参见:Compliance Firehose。
- 在 X 上提供 合规活动 的实时 stream。这些活动包括 Post 被编辑时的事件。
- 可用于在平台发生新的合规事件时,维护一组已存储 data 的合规状态。
- 非常适合在较长时间内摄取并存储大量 X data 的客户。
指南
合规实践最佳指南
建议与最佳实践
- 构建可存储数值型 Post ID 和 User ID 的数据存储模式:针对某个用户的合规处理需要作用于该用户的所有 Posts。由于所有合规消息仅以数值型 ID 传递,设计存储模式时应基于数值型 ID 维护 Post 与 User 之间的关联。数据使用方需要同时按 Post ID 和 User ID 监控合规事件,并能够相应更新本地数据存储。
- 构建覆盖所有合规状态的模式:根据各类应用中处理合规活动的方式,可能需要向数据存储中添加其他 metadata。比如,数据使用方可能会在现有数据库中添加 metadata,以便在受到 status_withheld 消息影响的国家/地区限制内容展示。
- 处理转发删除:转发是一种特殊的 Post,原始消息作为一个对象嵌套在转发中。在这种情况下,转发会引用两个 Post ID——转发本身的 ID,以及原始消息的 ID(位于嵌套对象中)。当原始消息被删除时,会针对原始 ID 发送一条 Post delete 消息。Post 删除事件通常会触发对所有转发的 delete 事件。但在某些情况下可能并不会全部发送,客户端系统应容忍不完整的转发删除。删除原始 ID 一般足以删除所有后续的转发。最佳实践是在存储转发时引用原始的 Post ID,并在收到 Post delete 事件时删除所有被引用的转发。
合规数据对象
Compliance Firehose API
- 在此处了解更多关于用户状态(User statuses)的信息;关于已删除 Posts 的开发者政策请见此处。
- Compliance Firehose 已更新,现提供 ‘tweet_edit’ 事件。
- 多个与用户相关的 delete、protect 和 suspend 事件不一定是永久性的,且可能在不同状态之间无限切换。这些包括:user_delete、user_undelete、user_protect、user_unprotect,以及 user_suspend、user_unsuspend。
- 仅当用户未选择对其账户执行 user_undelete 时,user_delete 事件发生后 30 天才会跟随 status_delete 事件。用户可能会撤销一次 user_delete,因此其所有 Posts 在 30 天后的删除可能不会发生。
- 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 | 屏蔽或删除关联用户的所有 Posts。 |
user_undelete | User | No | 关联用户的所有 Posts 可再次显示并视为公开。 |
user_protect | User | No | 屏蔽或删除关联用户的所有 Posts。 |
user_unprotect | User | No | 关联用户的所有 Posts 可再次显示并视为公开。 |
user_suspend | User | No | 屏蔽或删除关联用户的所有 Posts。 |
user_unsuspend | User | No | 关联用户的所有 Posts 可再次显示并视为公开。 |
scrub_geo | User | Yes | 删除 X 为该用户提供、且位于 scrub_geo 消息中指定 Post 之前的所有地理数据。请注意,该用户后续的 Posts 可能包含可使用的地理数据。 |
user_withheld | User | Yes | 在 user_withheld 消息列出的特定国家/地区屏蔽关联用户的 Posts。 |
delete | Favorite | Yes | 删除关联的 like/favorite。 |
有效负载示例
删除 Post
已限制显示的 Post
丢弃
撤销删除
清除地理信息
删除用户
用户撤销删除
用户已隐藏
用户保护
取消用户保护状态
用户停用
解除用户账号暂停
集成 Compliance Firehose
集成 Compliance Firehose
- 为 Compliance Firehose 的每个 streaming API 分区建立流式连接
- 处理高数据量——使用异步流程将 stream 摄取与后续处理解耦
- 因任何原因断开时自动重新连接到各个 stream 分区
- 按照上述指南处理与您已存储的 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 | 连接到数据 stream |
身份验证
GET /compliance/:stream
请求方法 | HTTP GET |
连接类型 | Keep-Alive |
URL | 可在控制台中该 stream 的 API Help 页面找到,结构类似: https://gnip-stream.x.com/stream/compliance/accounts/:account_name/publishers/twitter/:stream_label.json?partition=1 注意: 必须包含“partition”参数。要消费完整 stream,你需要连接全部 8 个分区,每个分区占总量的 12.5%。 |
压缩 | Gzip。若要以 Gzip 压缩连接到 stream,只需在连接请求中发送 Accept-Encoding 头。该请求头应如下所示: Accept-Encoding: gzip |
字符编码 | UTF-8 |
响应格式 | JSON。请求头应指定响应为 JSON 格式。 |
请求速率限制 | 每 60 秒 10 次请求。 |
读取超时 | 在客户端设置读取超时,并确保其值大于 30 秒。 |
对 Tweet 编辑的支持 | 所有 Tweet 编辑都会触发“tweet_edit”Compliance 事件。详见Compliance Data Objects文档。 |
partition=1
——要完整消费整个 stream,你需要连接所有 8 个分区。
响应代码
状态 | 文本 | 定义 |
---|---|---|
200 | 成功 | 连接已成功建立,新的活动会在到达时持续发送。 |
401 | 未授权 | 由于凭据无效,HTTP 身份验证失败。请使用你的凭据登录 console.gnip.com,确认你在请求中正确使用了它们。 |
406 | 不可接受 | 通常发生在客户端未正确包含接受来自 stream 的 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 | 请求速率限制 | 你的 App 已超出连接请求的限制。 |
503 | 服务不可用 | Twitter 服务器出现问题。请使用指数回退策略重新连接。若在 X API Status Page 上未发布关于此问题的通知,请联系支持。 |
其他建议与最佳实践
- 构建可存储数值型 Tweet ID 和 User ID 的数据存储架构:用户级别的消息要求对该用户的所有 Tweets 采取相应操作。由于所有合规消息仅以数值型 ID 投递,必须设计能基于数值型 ID 维护 Tweet 与用户关系的存储架构。数据使用方需要同时按 Tweet ID 和 User ID 监控合规事件,并能够相应更新本地数据存储。
- 构建涵盖所有合规状态的架构:根据各应用处理合规活动的方式,可能需要向数据存储添加其他 metadata。例如,数据使用方可能会在现有数据库中添加 metadata,以便在受到 status_withheld 消息影响的国家/地区限制内容展示。
- 处理转发的删除:转发是一种特殊的 Tweet,其中原始消息作为一个对象嵌套在转发内。在这种情况下,一个转发会引用两个 Tweet ID——转发本身的 ID,以及原始消息的 ID(位于嵌套对象中)。当原始消息被删除时,会针对原始 ID 发出 Tweet delete 消息;不会为所有转发分别再发出后续的 delete 消息。删除原始 ID 即可删除所有后续的转发。