此 endpoint 已更新,现包含 Post 编辑 metadata。请在”编辑 Posts” 基础知识页面了解这些 metadata 的更多信息。 此 endpoint 通常与私信相关的 endpoints 搭配使用。我们已发布新的v2 私信 endpoints。请注意,Enterprise 和 Premium 的 Account Activity API 支持 v2 一对一消息,但暂不支持群组会话。
Enterprise
Account Activity API 使您能够通过 webhook(回调接口)订阅与用户账号相关的实时活动。这意味着,您可以通过单一连接,从一个或多个您拥有或已订阅的账号接收实时的 Posts、私信以及其他账号事件。
对于您在 webhook 注册中的每个用户订阅,您将收到以下所有相关活动:
活动类型 | |
---|---|
* Posts(由用户) * Post 删除(由用户) * @ 提及(涉及用户) * 回复(发给用户或来自用户) * 转发(由用户或涉及用户) * 引用 Tweets(由用户或涉及用户) * 对被引用 Tweets 的转发(由用户或涉及用户) * like(由用户或涉及用户) * 关注(由用户或涉及用户) * 取消关注(由用户) | * 拉黑(由用户) * 取消拉黑(由用户) * 静音(由用户) * 取消静音(由用户) * 私信已发送(由用户) * 私信已接收(由用户) * 正在输入指示(发给用户) * 已读回执(发给用户) * 订阅撤销(由用户) |
视频系列
功能摘要
等级 | 定价 | 唯一订阅数 | webhook 数量 | 可靠性与活动恢复 |
---|---|---|---|---|
Enterprise | 联系销售 | 最高 500+ | 3+ | 重试 和 重放 |
- 有问题?遇到错误?
-
探索我们的示例代码:
- Enterprise Account Activity API 仪表板,一个 Node Web 应用,使用 Account Activity API 的 Enterprise 等级来展示 webhook(回调接口)事件,并包含重放功能。
- SnowBot 聊天机器人,一个基于 Enterprise 等级的 Account Activity 和 Direct Message API 构建的 Ruby Web 应用。
管理 webhook(回调接口)和已订阅用户
- 一个已注册的 X App - 在此注册
- 一个 OAuth 2.0 Bearer Token - 了解更多
- 一个可通过 Challenge-Response Check(CRC)的 webhook(回调接口) - 了解更多
- 一个 Enterprise 账户 - 在此申请
管理 webhook(回调接口):
- Adding a webhook
- Viewing a webhook
- Removing a webhook
先在所给应用程序的 context 中注册一个新的 webhook URL。在保存前,系统会通过 CRC 请求验证该 URL。注册完成后,请务必记录 webhook ID,稍后会用到。按需替换占位符后,将以下 cURL 请求复制到命令行中运行:
-
URL
<URL>
,例如https://yourdomain.com/webhooks/twitter/
-
Consumer key
<CONSUMER_KEY>
,例如xvz1evFS4wEEPTGEFPHBog
-
Access token
<ACCESS_TOKEN>
,例如370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
管理已订阅的用户:
- 添加订阅
- 查看订阅
- 移除订阅
我们先从为用户添加订阅开始,这样您就能接收所有事件类型。在按以下说明完成替换后,将下面的 cURL 请求复制到命令行中:
-
Webhook ID
<:WEBHOOK_ID>
,例如1234567890
-
Consumer key 名称
<CONSUMER_KEY>
,例如xvz1evFS4wEEPTGEFPHBog
-
订阅用户的 access token
<SUBSCRIBING_USER'S_ACCESS_TOKEN>
,例如370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
参考文章
Account Activity API 的视频演示
- 注册 webhook(回调接口)
- 添加用户订阅
- 移除用户订阅
- 接收账号活动
- 回放账号活动
- 有问题?遇到错误?
-
浏览我们的示例代码:
- Enterprise Account Activity API 仪表盘:一个 Node Web 应用,基于 Account Activity API 的 Enterprise 级别展示 webhook(回调接口)事件,并包含 Replay 功能。
- SnowBot 聊天机器人:一个基于 Enterprise Account Activity 和 Direct Message API 构建的 Ruby Web 应用。
webhook 入门
1. 创建一个 X App。
- 使用开发者门户中已获批准的开发者账户创建一个 X App。如果你代表公司创建此 App,建议使用公司的 X 账户创建。要申请开发者账户,点击此处。
- 在你的 App 页面 permissions 选项卡中启用“Read, Write and Access Direct Messages”。
- 在“Keys and Access Tokens”选项卡中,记录你的 App 的 Consumer Key(API Key)和 Consumer Token(API Secret)。
- 在同一选项卡中,生成你的 App 的Access Token 和 Access Token Secret。你需要这些 Access Tokens 来注册你的 webhook(回调接口)URL,X 会将账户事件发送到该地址。
- 如果你不熟悉 X Sign-in 以及用户上下文在 X API 中的工作方式,请查看Obtaining Access Tokens。当你添加需要接收事件的账户时,将使用该账户的 access token 为其订阅。
- 记录你的 App 的数字 id,可在开发者门户的“Apps”页面查看。申请 Account Activity API 访问权限时需要此 App id。
2. 获取 Account Activity API 访问权限
3. 开发 webhook 消费端 App
-
创建一个带有 URL 的 Web 应用,将其作为接收事件的 webhook。这是在你的服务器上部署的 endpoint,用于监听传入的 X webhook 事件。
- URI 的路径(path)完全由你决定。以下示例是有效的:https://mydomain.com_/service/listen_
- 如果你需要同时接收来自多种来源的 webhooks,常见的路径模式是:https://mydomain.com/webhook/twitter
- 请注意,指定的 URL 不能包含端口号(https://mydomain.com:5000/NoWorkie)。
- 如我们的Securing Webhooks指南所述,第一步是编写代码以接收 X Challenge Response Check(CRC)GET 请求,并返回格式正确的 JSON 响应。
- 注册你的 webhook URL。你需要向 /webhooks.json?url= endpoint 发起一次 POST 请求。当你发起该请求时,X 会向你的 Web 应用发出 CRC 请求。webhook 成功注册后,响应将包含一个 webhook id。稍后在向 Account Activity API 发起某些请求时需要该 webhook id。
- X 会将账号级的 webhook 事件发送到你注册的 URL。请确保你的 Web 应用支持用于接收事件的 POST 请求。这些事件采用 JSON 编码。参见此处查看示例 webhook JSON 负载。
- 当你的 Web 应用准备就绪后,下一步是添加需要接收活动的账号。添加(或删除)账号时,你将发起引用账号 id 的 POST 请求。更多信息请参阅我们的添加订阅指南。
4. 验证设置
- 要验证你的 App 和 webhook 是否配置正确,请给你的 App 订阅的某个 X 账号发布的 Post 点赞。你的 webhook URL 应该会针对你的订阅者收到的每一次点赞,通过 POST 请求接收到一个
favorite_events
。 - 请注意,添加订阅后,事件开始投递可能最多需要 10 秒。
- 在注册你的 webhook URL 时,你的 Web 应用必须使用其 consumer token 和 secret,且还需使用应用所有者的用户访问令牌和 secret 进行身份验证。
- 所有传入的私信都将通过 webhook(回调接口)投递。通过 POST direct_messages/events/new (message_create) 发送的所有私信也会通过 webhook(回调接口)投递。这样你的 Web 应用才能感知由其他客户端发送的私信。
- 请注意,每个 webhook 事件都会包含一个 for_user_id 用户 ID,指示该事件是为哪个订阅投递的。
- 如果同一会话中有两位用户使用你的 Web 应用进行私信,你的 webhook 将会收到两条重复事件(每个用户各一条)。你的 Web 应用应对此进行处理。
- 如果有多个 Web 应用共享同一 webhook URL,且同一用户映射到每个应用,则同一事件会被多次发送到你的 webhook(每个 Web 应用一次)。
- 在某些情况下,你的 webhook 可能会收到重复事件。你的 webhook 应用应具备容错能力,并按事件 ID 进行去重。
- 不要期望 Quick Reply 的响应会直接紧随请求。用户可以忽略 Quick Reply 请求,并可能改用传统私信回复。用户也可能对此前在消息线程中未回复的请求再提供 Quick Reply 响应。
-
查看示例代码:
- Enterprise Account Activity API dashboard,一个使用 Account Activity API 企业级别展示 webhook 事件的 Node Web 应用,并包含 Replay 功能。
- SnowBot chatbot,一个基于 Account Activity 和私信 API 构建的 Ruby Web 应用。该代码库包含一个脚本,用于帮助设置 Account Activity API 的 webhook。
保护 webhook(回调接口)
- 通过挑战-响应校验,X 可以确认接收 webhook 事件的 Web 应用的归属。
- 每个 POST 请求中的签名请求头可用于验证传入的 webhook 确实来自 X。
挑战-响应检查
crc_token
参数的 GET 请求。收到该请求后,您的 Web 应用需要基于 crc_token
参数和 App 的 Consumer Secret(见下文)构建一个加密的 response_token
。response_token
必须以 JSON 编码(参见下方示例)并在三秒内返回。成功后,会返回一个 webhook id
。
在注册 webhook URL 时会发送 CRC,因此实现 CRC 响应代码是首要步骤。一旦建立 webhook,X 将在上次收到成功响应后大约每 24 小时触发一次 CRC。您的 App 也可以在需要时通过 webhook id
发起 PUT 请求以触发 CRC。在开发 webhook 应用、部署新代码并重启服务后,触发 CRC 十分有用。
crc_token
在每个传入的 CRC 请求中都会变化,应作为计算中的消息使用,而 Consumer Secret 作为密钥。
如果未在 3 秒内返回响应或响应无效,将停止向已注册的 webhook 发送事件。
CRC 请求会在以下情况下发生:
- 注册 webhook URL 时。
- 大约每隔_一小时_会触发一次以验证你的 webhook URL。
- 你可以通过发送 PUT 请求手动触发 CRC。在开发 webhook 客户端时,应将手动触发 CRC 作为验证 CRC 响应的一部分进行规划。
响应要求:
- 使用
crc_token
和你的 App Consumer Secret 生成的、经 base64 编码的 HMAC SHA-256 hash - 有效的 response_token,且为 JSON 格式。
- 延迟小于 3 秒。
- 200 HTTP 状态码。
各语言的 HMAC 库:
在 Python 中生成响应令牌的示例:
示例 JSON 响应:
其他示例:
- 此处给出了一个使用 Node/JS 编写的 CRC 响应方法示例。
- 此处给出了一个使用 Ruby 编写的 CRC 响应方法示例(参见 generate_crc_response 以及用于接收 CRC 事件的 /GET 路由)。
可选的签名请求头验证
- 使用你的 consumer secret 和传入的负载主体创建一个 hash。
- 将生成的 hash 与 base64 编码的 x-twitter-webhooks-signature 值进行比较。使用类似 compare_digest 的方法以降低对计时攻击的风险。
其他安全指南
X 汇总网段
- 199.59.148.0/22
- 199.16.156.0/22
- 192.133.77.0/26
- 64.63.15.0/24
- 64.63.31.0/24
- 64.63.47.0/24
- 202.160.128.0/24
- 202.160.129.0/24
- 202.160.130.0/24
推荐的服务器配置
- 在 ssllabs.com 测试中获得“A”级
- 启用 TLS 1.2
- 启用 Forward Secrecy(前向保密)
- 关闭 SSLv2
- 关闭 SSLv3(因 POODLE 漏洞)
- 关闭 TLS 1.0
- 关闭 TLS 1.1
- 关闭 TLS 压缩
- 关闭会话票据(Session Tickets),除非你会轮换会话票据密钥。
- 在 SSL 配置中将“ssl_prefer_server_ciphers”或“SSLHonorCipherOrder”选项设置为“on”。
- 确保加密套件列表为现代套件,例如:
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:DES-CBC3-SHA
管理 webhook(回调接口)与订阅
创建与更改 webhook(回调接口)
webhook 配置管理 endpoint:
方法 | Enterprise |
注册 webhook URL/生成 webhook_id | POST webhooks |
返回所有 webhook URL 及其 statuses | GET webhooks |
删除 App 当前的 webhook 配置 | DELETE webhooks/:webhook_id |
手动触发 CRC 请求 | PUT webhooks/:webhook_id |
为什么我不能直接更新 webhook URL?
添加与移除用户订阅
订阅管理 endpoint
方法 | Enterprise |
添加新的用户订阅 | POST webhooks/:webhook_id/subscriptions/all |
获取用户订阅 | GET webhooks/:webhook_id/subscriptions/all |
返回所有有效订阅的列表 | GET webhooks/:webhook_id/subscriptions/all/list |
使用仅限应用的 OAuth 停用用户订阅 | DELETE webhooks/:webhook_id/subscriptions/:user_id/all.json |
请注意: 在您开始使用 API 之前,X 需要为您的开发者 App 启用对 Account Activity API 的访问。为此,请务必将您计划用于认证的 App id 与您的客户经理或技术支持团队共享。
描述 | Endpoint | OAuth 1.0a (用户上下文) | OAuth 2.0 Bearer Token(仅应用) |
为指定的应用上下文注册新的 webhook URL | POST account_activity/webhooks | ✓ | |
返回指定应用的所有 URL 及其状态 | GET account_activity/webhooks | ✓ | |
对指定 webhook 的 URL 触发挑战响应检查(CRC) | PUT account_activity/webhooks/:webhook_id | ✓ | |
将应用订阅到某个用户的账户事件 | POST account_activity/webhooks/:webhook_id/subscriptions/all | ✓ * | |
返回当前有效订阅的数量 | GET account_activity/subscriptions/count | ✓ | |
检查某个 webhook 配置是否已订阅某用户的事件 | GET account_activity/webhooks/:webhook_id/subscriptions/all | ✓ * | |
返回当前有效订阅的列表 | GET account_activity/webhooks/:webhook_id/subscriptions/all/list | ✓ | |
删除 webhook | DELETE account_activity/webhooks/:webhook_id | ✓ | |
[已弃用] 为提供的用户上下文和应用停用订阅 | DELETE account_activity/webhooks/:webhook_id/subscriptions/all | ✓ * | |
使用仅应用 OAuth 停用订阅 | DELETE /account_activity/webhooks/:webhook_id/subscriptions/:user_id/all.json | ✓ | |
重新向 webhook 投递活动 | POST /1.1/account_activity/replay/webhooks/:webhook_id/subscriptions/all.json | ✓ |
- Consumer Keys(API Key 和 Secret)
- Access Tokens(Access Token 和 Secret)
- POST account_activity/webhooks: 为指定的应用程序 context 注册新的 webhook URL
- PUT account_activity/webhooks/:webhook_id: 对指定 webhook 的 URL 触发 CRC(挑战响应检查)
- DELETE account_activity/webhooks/:webhook_id: 删除 webhook
- POST account_activity/webhooks/:webhook_id/subscriptions/all: 为应用程序订阅某个用户的账户事件
- GET account_activity/webhooks/:webhook_id/subscriptions/all: 检查某个 webhook 配置是否已订阅某用户的事件
- DELETE account_activity/webhooks/:webhook_id/subscriptions/all: 使提供的用户 context 与应用程序的订阅失效[已弃用]
请注意: 请确保你的开发者 App 已启用 “Read, Write, and Direct Messages”。你可以在开发者账户的 Projects & Apps section 中所选开发者 App 的 “App permissions” 下更改此设置。更改权限后,你需要重新生成 App 凭据。
请注意: 在开始使用 API 之前,X 需要为你的开发者 App 启用对 Account Activity API 的访问。为此,请将你用于认证的 App ID 提供给客户经理或技术支持团队。
描述 | Endpoint | OAuth 1.0a (用户上下文) | OAuth 2.0 Bearer Token(仅应用) |
为给定的应用上下文注册新的 webhook URL | POST account_activity/webhooks | ✓ | |
返回给定应用的所有 URL 及其状态 | GET account_activity/webhooks | ✓ | |
为指定 webhook 的 URL 触发挑战响应检查(CRC) | PUT account_activity/webhooks/:webhook_id | ✓ | |
将应用订阅到某个用户的账号事件 | POST account_activity/webhooks/:webhook_id/subscriptions/all | ✓ * | |
返回当前有效订阅的数量 | GET account_activity/subscriptions/count | ✓ | |
检查某个 webhook 配置是否已订阅某用户的事件 | GET account_activity/webhooks/:webhook_id/subscriptions/all | ✓ * | |
返回当前有效订阅的列表 | GET account_activity/webhooks/:webhook_id/subscriptions/all/list | ✓ | |
删除 webhook | DELETE account_activity/webhooks/:webhook_id | ✓ | |
[已弃用] 为所提供的用户上下文和应用停用订阅 | DELETE account_activity/webhooks/:webhook_id/subscriptions/all | ✓ * | |
使用仅应用 OAuth 停用订阅 | DELETE /account_activity/webhooks/:webhook_id/subscriptions/:user_id/all.json | ✓ | |
重新投递活动到某个 webhook | POST /1.1/account_activity/replay/webhooks/:webhook_id/subscriptions/all.json | ✓ |
- Consumer Keys(API Key 和 Secret)
- Access Tokens(Access Token 和 Secret)
- POST account_activity/webhooks: 为指定的应用 context 注册新的 webhook URL
- PUT account_activity/webhooks/:webhook_id: 对指定 webhook 的 URL 触发挑战响应检查(CRC)
- DELETE account_activity/webhooks/:webhook_id: 删除 webhook
- POST account_activity/webhooks/:webhook_id/subscriptions/all: 使该应用订阅某位用户的账户事件
- GET account_activity/webhooks/:webhook_id/subscriptions/all: 检查某个 webhook 配置是否已订阅某位用户的事件
- DELETE account_activity/webhooks/:webhook_id/subscriptions/all: 为给定的用户 context 和应用停用订阅【已弃用】
请注意: 确保你的开发者 App 已启用“Read, Write, and Direct Messages”。你可以在开发者账户的 Projects & Apps 部分中,在所选开发者 App 的“App permissions”下更改此设置。更改权限设置后,你需要重新生成 App 凭证。
重试
Enterprise
Account Activity API 的 Enterprise 级别提供的一项优势是针对 webhook 事件的重试机制。如果未收到 200“success”HTTP 响应状态码,X 服务器将启动重试机制,在五分钟内最多重试发送该 webhook 事件三次。该 webhook 事件重试服务有助于在发生网络问题、客户端服务中断或部署期间提升可靠性并实现事件恢复。
什么是重试?
重试时间线
重试时间线
活动已创建,Account Activity API 向 webhook URL 发起 POST,请求在 3 秒内超时。 |
在上一次超时结束后等待 3 秒,然后 Account Activity API 再次向 webhook URL 发起 POST,请求在 3 秒内超时。 |
在上一次超时结束后等待 27 秒,然后 Account Activity API 再次向 webhook URL 发起 POST,请求在 3 秒内超时。 |
在上一次超时结束后等待 242 秒,然后 Account Activity API 再次向 webhook URL 发起 POST,请求在 3 秒内超时。 |
此后,Account Activity API 将停止尝试 POST。客户端必须使用其他 X endpoint 来恢复 data。 |
账户活动数据对象结构
Object | 详情 |
---|---|
for_user_id | 标识与该事件相关的订阅用户。 |
is_blocked_by | (条件)仅当其他用户提及你所订阅的用户时显示。仅在 Post 提及事件且值为 true 时包含。 |
source | 执行动作的用户。例如,发起关注、屏蔽或静音的用户为来源用户。 |
target | 动作所作用的用户。例如,被关注、被屏蔽或被静音的用户为目标用户。 |
Message Type | 详情 |
---|---|
tweet_create_events | 当对订阅用户执行或由其执行以下任一操作时的 Post 状态负载:Posts、转发、回复、@ 提及、QuoteTweets、对 Quote Tweets 的转发。 |
favorite_events | like 事件状态,包含用户与目标。 |
follow_events | 关注事件,包含用户与目标。 |
unfollow_events | 取消关注事件,包含用户与目标。 |
block_events | 屏蔽事件,包含用户与目标。 |
unblock_events | 取消屏蔽事件,包含用户与目标。 |
mute_events | 静音事件,包含用户与目标。 |
unmute_events | 取消静音事件,包含用户与目标。 |
user_event | 当用户移除应用授权且订阅被自动删除时发送的撤销事件。 |
direct_message_events | 当发送或接收私信时,包含用户与目标的私信状态。 |
direct_message_indicate_typing_events | 私信“正在输入”事件,包含用户与目标。 |
direct_message_mark_read_events | 私信“标记已读”事件,包含用户与目标。 |
tweet_delete_events | 删除 Post 的通知,便于维护合规性。 |
tweet_create_events(Posts、转发、回复、引用推文)
tweet_create_events(@提及)
favorite_events
follow_events
unfollow_events
block_events
unblock_events
mute_events
unmute_events
user_event
direct_message_events
direct_message_indicate_typing_events
direct_message_mark_read_events
tweet_delete_events
Account Activity Replay API
Enterprise
Account Activity Replay API 是一款数据恢复工具,可用于检索最久可回溯至五天前的事件。应在你的 webhook 服务器错过事件时使用——无论是由于断连时间超过 retry window,还是在需要数天时间将系统恢复至正常状态的灾难恢复场景中。
Account Activity Replay API 面向在一段时间内未能摄取 activities 的任何场景。它会将活动投递到与原始实时投递相同的 webhook。这是一款恢复工具而非回填工具,这意味着仅当先前曾尝试投递某事件时,该事件才会被重放。Account Activity Replay API 无法投递订阅创建时间之前时段的事件。
使用 Account Activity Replay API
限制
数据可用性和类型
迁移介绍
- User Streams
- Site Streams
- GET direct_messages
- GET direct_messages/sent
- GET direct_messages/show
- POST direct_messages/new
- POST direct_messages/destroy
- Account Activity API enterprise 和 premium
- GET direct_messages/events/list
- GET direct_messages/events/show
- POST direct_messages/events/new
- POST direct_messages/events/destroy
- Account Activity API 迁移指南,适用于从 User Streams 和 Site Streams 迁移到我们新的基于 webhook(回调接口)的服务
- 私信迁移指南,适用于在私信 REST endpoint 之间迁移
- Account Activity Dashboard 是一个示例 Node.js Web App,包含用于开始使用 Account Activity API 的辅助脚本。
- SnowBot 是一个使用 Account Activity API 和 REST 私信 endpoint 的示例聊天机器人。它由 Ruby 编写,采用 Sinatra Web App 框架,并部署在 Heroku 上。
迁移指南:从 User Streams/Site Streams 迁移到 Account Activity API
变更摘要
已弃用的 API
替代方案 API
差异与迁移注意事项
新功能
管理用户订阅
迁移指南
按照以下步骤,轻松从 Site Streams API 迁移到 Account Activity API
- 所需的 webhook 数量
- 你的应用当前/预期管理的订阅/已授权用户
- 当前的 X 客户端应用数量
- 你期望从 X 获得的支持级别(论坛支持或托管式 Enterprise 级 1:1 支持)
- 各套餐价格
- 在你的 X App 页面上的 permissions 选项卡中启用“Read, Write and Access direct messages”。 请注意,更改这些设置不会追溯生效,任何已授权用户将保留其被授权时的授权设置。如果某位用户尚未授予你读取、写入和私信访问权限,你需要让该用户重新授权你的应用。
- 如果你不熟悉 X Sign-in 以及用户上下文如何与 X API 协同工作,请查看Obtaining Access Tokens。
- 在“Keys and Tokens”选项卡底部为 X App 所有者生成 Access Tokens。在同一选项卡中记下你的 Consumer Key、Consumer Secret、Access Token 和 Access Token Secret。你需要这些来使用 API。
- 使用你的 Consumer Key 和 Consumer Secret 生成 Bearer Token,以用于application-only API 方法。
- 创建一个带有 endpoint 的 Web 应用,将其用作 webhook 接收事件(例如:https://your_domain.com/webhook/twitter 或 https://webhooks.your_domain.com)。
- 在创建 webhook 时使用你的 Consumer Key、Consumer Secret、Access Token 和 Access Token Secret。注意,你的 endpoint 必须返回一个包含 response_token 的 JSON 响应;该 response_token 是使用 crc_token 和你的 App Consumer Secret 生成的、经 base64 编码的 HMAC SHA-256 hash。
- 查看 Securing Webhooks 文档,特别留意 Challenge Response Check(CRC)的要求。
- 确保你的 webhook 支持用于接收事件的 POST 请求,以及用于 CRC 的 GET 请求。
- 确保你的 webhook 具备低延迟(对 POST 请求的响应小于 3 秒)。
- Webhook API 将通过两种方式保护你的 webhook:
- 为了验证你同时是 Web 应用和 webhook URL 的所有者,X 将执行 Challenge Response Check(CRC),这与循环冗余校验不同。
- 一个带有名为 crc_token 的参数的 GET 请求将被发送到你的 webhook URL。你的 endpoint 必须返回一个包含 response_token 的 JSON 响应;该 response_token 是使用 crc_token 和你的 App Consumer Secret 生成的、经 base64 编码的 HMAC SHA-256 hash。
- 应预期每个传入的 CRC 请求其 crc_token 都会变化。计算时应将 crc_token 作为消息,其中你的 Consumer Secret 作为密钥。
- 如果响应无效,将停止向已注册的 webhook 发送事件。
- 生成你在 User Streams 上的当前用户订阅列表
- 使用请求: POST account_activity/all/:env_name/subscriptions 设置新的 Account Activity API 订阅
- 使用请求: GET account_activity/all/:env_name/subscriptions/list 确认你的 Account Activity API 订阅
- 使用请求: GET /1.1/site/c/:stream_id/info.json 生成你在 Site Streams 上的当前订阅列表
- 使用请求: POST account_activity/all/:env_name/subscriptions 设置新的 Account Activity API 订阅
- 使用请求: GET account_activity/all/:env_name/subscriptions/list 确认你的 Account Activity API 订阅
- 使用 POST webhooks 将你的 webhook URL 在 App 中注册,并获取一个 webhook_id。
- 使用返回的 webhook_id,通过 POST webhooks/:webhook_id/subscriptions/all 添加用户订阅。
Account Activity 仪表板(Account Activity API 示例应用)
- 在这里下载 Account Activity Dashboard 示例应用(基于 Node.js)
- 按照 README 的说明安装并启动该应用
- 应用启动后,您可以通过 UI 轻松设置 webhook(回调接口)并创建新订阅
可用活动
消息类型 | 详情 |
---|---|
tweet_create_events | 当订阅用户发起或收到以下任一操作时的 Post 状态负载:Post、转发、回复、@提及、QuoteTweets |
favorite_events | 收藏(like)事件状态,包含用户与目标。 |
follow_events | 关注事件,包含用户与目标。 |
block_events | 屏蔽事件,包含用户与目标。 |
mute_events | 静音事件,包含用户与目标。 |
direct_message_events | 私信事件状态,包含用户与目标。 |
direct_message_indicate_typing_events | 私信“正在输入”事件,包含用户与目标。 |
direct_message_mark_read_events | 私信“标记为已读”事件,包含用户与目标。 |
已弃用的流式消息类型
空行 | Account Activity API 将不再传递空行;此前在 User Streams 和 Site Streams 中,空行被用作保活消息。 |
限制通知 | 将不再向指定的 webhook(回调接口)发送限制通知。相应地,用户可调用 API 获取可用句柄的当前使用情况。此功能未来将纳入开发者门户。 |
断开连接消息 | 不再需要断开连接通知,因为 webhook(回调接口)不依赖活动连接。 |
阻塞警告 | 不再需要阻塞警告,因为 webhook(回调接口)不依赖能够处理大量传入消息的活动连接。 |
好友列表 | 将不再主动发送好友列表。现在将提供一个 REST endpoint 以获取该信息。 |
已弃用的事件类型
描述 | 事件名称 | 来源 | 目标 | 目标对象 |
用户删除一条 Post | delete | 当前用户 | 当前用户 | Post |
被关注用户删除一条 Post | delete | 被关注用户 | 被关注用户 | Post |
用户取消收藏一条 Post | unfavorite | 当前用户 | Post 作者 | Post |
用户的 Post 被取消收藏 | unfavorite | 取消收藏的用户 | 当前用户 | Post |
用户取消关注某人 | unfollow | 当前用户 | 被关注用户 | Null |
用户创建一个 List | list_created | 当前用户 | 当前用户 | List |
用户删除一个 List | list_destroyed | 当前用户 | 当前用户 | List |
用户编辑一个 List | list_updated | 当前用户 | 当前用户 | List |
用户将某人添加到 List | list_member_added | 当前用户 | 被添加用户 | List |
用户被添加到某个 List | list_member_added | 添加用户 | 当前用户 | List |
用户将某人从 List 中移除 | list_member_removed | 当前用户 | 被移除用户 | List |
用户被从某个 List 中移除 | list_member_removed | 移除用户 | 当前用户 | List |
用户订阅某个 List | list_user_subscribed | 当前用户 | List 所有者 | List |
用户的 List 被订阅 | list_user_subscribed | 订阅用户 | 当前用户 | List |
用户取消订阅某个 List | list_user_unsubscribed | 当前用户 | List 所有者 | List |
用户的 List 被取消订阅 | list_user_unsubscribed | 取消订阅用户 | 当前用户 | List |
用户更新其个人资料 | user_update | 当前用户 | 当前用户 | Null |
用户更新其受保护状态 | user_update | 当前用户 | 当前用户 | Null |
私信迁移指南
变更摘要
新增功能
- 支持媒体附件(图片、GIF 和视频)。
- 可通过预设选项列表引导用户进行结构化回复。
- 可访问过去最长 30 天的私信。
差异与迁移注意事项
新的私信对象
摘要
- 全新的 Direct Message 对象结构。
- 更精简的用户对象。
- 新增信息(快速回复响应、附件等)。
发送私信
摘要
- 消息在 JSON 的 POST 请求主体中定义
- 必须将 Content-Type 标头设置为 application/json
- 生成 OAuth 签名时不包含 JSON 主体。
检索私信
sender_id
属性对响应进行后处理。
分页现基于游标值,而非某条私信的 id。每个响应都会返回一个游标属性。GET direct_messages/events/list 最多返回过去 30 天内的消息,不论过去 30 天内的消息数量如何。当未返回游标时,表示没有更多可返回的消息。使用 GET direct_messages/events/show 访问单条私信的方法保持不变,但返回的私信对象结构与之前描述的不同。
最后,对私信的实时访问现通过 webhook(回调接口)结合 Account Activity API 实现。关于从 User Streams 或 Site Streams 迁移的指南,请参阅迁移到 Account Activity API 的文档以获取更多信息。
摘要
- 现已通过同一 endpoint 返回已发送与已接收的消息。
- 可返回最长 30 天内的消息。
- 支持基于游标的分页。
- 通过 webhook(回调接口)实时访问私信。
删除私信
摘要
- 删除私信需要提供 id。
- 新的 endpoint 需要使用 DELETE 请求。
- 已删除私信在 X 官方客户端中的呈现方式保持不变。
常见问题解答
常见问题
- 速度:我们以 X 的速度传递数据。
- 简单:我们通过单一的 webhook 连接传递一个账户的所有事件。API 中包含的活动有:Posts、@ 提及、回复、转发、引用推文、对引用推文的转发、like、发送的私信、收到的私信、关注、拉黑、静音。
- 可扩展性:你可以接收所管理账户的全部活动,而不受任何请求速率限制或事件上限的约束。
- 如果你刚刚起步,我们建议你查看使用 webhook 入门指南
-
参考我们的 X Dev 支持脚本:
- Account Activity API dashboard,一个用于展示 webhook 事件的 Node Web 应用。
- SnowBot chatbot,一个基于 Account Activity 和 Direct Message APIs 构建的 Ruby Web 应用。该代码库包含一个脚本,用于帮助设置 Account Activity API webhooks。
- 服务器对 CRC 返回了不正确的令牌。在这种情况下,我们的系统不会重试向你发送活动。
- webhook URL 配置了不正确的证书。在这种情况下,我们的系统不会重试向你发送活动。
- 你的服务器返回非 2XX、非 4XX、非 5XX 的响应码。
- 你声明使用 gzip,但实际未发送。
- 你未声明使用 gzip,但在响应中实际发送了它。
/all/
部分替换为其他账户活动数据对象,以限制 API 交付的活动?POST https://api.x.com/1.1/account_activity/all/:env_name/subscriptions.json
不可以。目前我们仅提供 /all/
产品。
有没有办法在不向用户请求私信权限的情况下使用 Account Activity API?
目前需要私信权限,因为该 API 无法“过滤掉”私信活动。
Account Activity API 是否有免费版本?
有的,我们提供沙盒版本作为免费层。我们的沙盒选项限制为单个 webhook,最多 15 个订阅。你可以在我们的文档中了解有关沙盒选项的更多信息。
能否使用 Account Activity API 获取提及已订阅用户的 Post 的转发?
很遗憾,这不在该 API 提供的活动范围内。为此,我们建议改用 Streaming API。
tweet_create_event 可能代表哪些活动类型?
在以下情况下会发送 tweet_create_event 负载:
如果订阅用户执行以下任一操作:
- 创建 Post
- 转发
- 回复 Post
- @提及 订阅用户
- 引用订阅用户创建的 Tweet
user_has_blocked
,其值为“true”或“false”。该字段仅在 Post 提及中暴露。
Enterprise
如何将我的 App 添加到 allowlist,或检查我的 App 是否已在 allowlist 上?
要管理你已添加到允许列表、可通过 Enterprise API 访问的 X apps,请联系你的客户经理并提供你的 app ID。你可以在开发者门户的 “Apps” 页面找到你的 app ID。
如果我有三个 webhook 的访问权限,我能否为我注册为企业用途的每个 App 各使用三个 webhook?
webhook 限额是在账户级别设置的,而不是 App 级别。如果你有三个 webhook 的访问权限,并且有两个注册为企业用途的 App,你可以在一个 App 上使用两个 webhook,在另一个 App 上使用第三个,但不能在每个 App 上都使用三个。
我能否指定将使用 Account Activity Replay API 重新投递的事件类型?
要重放的事件类型不可指定。将在所指定的日期和时间窗口内投递的所有事件都会被重放。
如果我的应用未能摄取某个 Account Activity Replay API 事件,是否会进行重试?
不会,不会进行任何重试。如果应用未能摄取由 Account Activity Replay API 发送的事件,可以为相同的时间段提交另一个 Replay 作业,以尝试重新投递遗漏的 Replay 事件。
当我收到部分成功的完成事件时,我应该怎么做?
建议记录已接收事件的时间戳,并为遗漏的事件请求另一个 Replay 作业。
我一次最多可以运行多少个 Account Activity Replay API 作业?
每个 webhook 在同一时间只能运行一个 Account Activity Replay API 作业。
在事件被投递到我的 webhook 时,我如何区分 Account Activity Replay API 事件与实时生产事件?
由于 Account Activity Replay API 始终投递过去的事件,因此可以根据事件的时间戳将其与实时生产事件区分开来。
我最早何时可以使用 Account Activity Replay API 来重新投递我的应用丢失或遗漏的活动?
活动在创建约 10 分钟后可用于重新投递。
错误故障排查指南
代码 32
- Enterprise - 请确保你使用的 consumer keys 和 access tokens 隶属于已注册使用 Enterprise 产品的 X app。如果你没有 consumer keys 和 access tokens,或需要将你的 X app 加入 allowlist,请联系你的客户经理。
-
如果以用户 context 进行认证,请确保你已使用正确的
oauth nonce
、oauth_signature
和oauth_timestamp
授权你的请求。 -
请确保你的 access tokens 具备正确的权限级别。
- 在 app dashboard 的“Keys and tokens”选项卡中,请确认你的 access tokens 拥有“Read, write, and direct messages”的 permission level。
- 如果 tokens 的权限级别低于此,请转到“Permissions”选项卡,将访问权限调整为“Read, write, and direct messages”,然后在“Keys and tokens”选项卡中重新生成你的 access tokens 和 secret。
-
请确保你的 URL 构造正确。
- 请注意,
:env_name
区分大小写。
- 请注意,
代码 200 - 禁止
- Premium - 在尝试向 API 发起请求之前,请确保您拥有已获批准的开发者账户。您还必须在请求中使用正确的 :env_name,您可以在 dev environments 页面进行设置。
- Enterprise - 请确保您的客户经理已为您配置了对 Account Activity API 的访问权限。
- 请确保您已正确配置 URI。如果在请求中填写了错误的 URI,可能会触发此错误。
代码 214 - Webhook URL 不符合要求。
- 请确保您使用的是 HTTPS。
- 您的 webhook URL 可能格式不正确。
- 请在开始使用 webhooks页面的开发 webhook 消费者 App部分了解如何设置 webhook URL。
代码 214 - CRC 的 GET 请求延迟过高。你的 webhook(回调接口)应在 3 秒内完成响应。
- 这表示你的服务器较慢。请确保在 3 秒内对 CRC 做出响应。
代码 214 - 在 CRC GET 请求过程中返回非 200 的响应码(如 404、500 等)。
- 你的服务器可能已宕机。请确保服务器正在正常运行。
代码 214 - 已创建的资源过多。
- Enterprise - 您已用尽所有 webhook(回调接口)。请对每个已注册的 App 使用 GET webhooks endpoint,以确定您的 webhook 的分布位置。
代码 261 - 应用无法执行写入操作。
- 您与 API 搭配使用的 App 的 access token 和 access token secret 未设置适当的权限级别。请前往 X apps 仪表板中的“Keys and tokens”选项卡,检查分配给您的 access token 和 access token secret 的权限级别。如果设置为除“Read, write and Direct Messages”之外的任何级别,则需要在“Permission”选项卡下调整设置,并重新生成您的 access token 和 access token secret 以使新设置生效。
- 或者,您可能正尝试使用仅应用身份验证注册 webhook(回调接口),这是不受支持的。请按照为 Enterprise Account Activity API 注册 webhook 的 API 参考中的说明,改为使用用户上下文进行身份验证。
Account Activity API 参考索引
适用范围 | Enterprise |
注册 webhook URL / 生成 webhook_id | POST webhooks |
返回所有 webhook URL 及其状态 | GET webhooks |
手动触发挑战响应检查 | PUT webhooks/:webhook_id |
将 App 订阅到账户事件 | POST webhooks/:webhook_id/subscriptions/all |
返回当前活跃订阅的数量 | GET subscriptions/count |
检查某 webhook 是否已订阅某账户 | GET webhooks/:webhook_id/subscriptions/all |
返回当前活跃订阅列表 | GET webhooks/:webhook_id/subscriptions/all/list |
删除该 webhook | DELETE webhooks/:webhook_id |
使用三方 OAuth 停用订阅(已弃用) | DELETE webhooks/:webhook_id/subscriptions/all |
使用仅限应用的 OAuth 停用订阅 | DELETE webhooks/:webhook_id/subscriptions/:user_id/all.json |
重新向 webhook 投递活动 | POST replay/webhooks/:webhook_id/subscriptions/all |
Enterprise Account Activity API
POST account_activity/webhooks
为指定的应用程序 context 注册新的 webhook URL。在保存之前,系统将通过 CRC 请求对该 URL 进行验证。若验证失败,将向请求方返回完整的错误信息。 允许的 webhook 数量取决于计费套餐。https://api.x.com/1.1/account_activity/webhooks.json
响应格式 | JSON |
是否需要身份验证 | 是(用户 context——所有 consumer 和 access tokens) |
是否有请求速率限制 | 是 |
每 15 分钟窗口的请求数(用户认证) | 15 |
是否支持 Tweet 编辑 | 所有 Tweet 对象都会包含描述该 Tweet 编辑历史的 Tweet 编辑 metadata。更多详情请参见”Tweet edits” 基础知识页面。 |
url(必填) | 回调 endpoint 的编码 URL。 |
HTTP 代码 | 消息 |
---|---|
200 | webhook URL 已为所提供的 App 完成注册 |
403 | 你的请求有错误。请参见下方的错误信息部分。 |
代码 | 消息 |
---|---|
214 | Webhook URL 不符合要求。 |
214 | 已创建的资源过多。 |
214 | Webhook URL 不符合要求。CRC 令牌无效或 JSON 响应格式不正确。 |
214 | CRC GET 请求延迟过高。您的 webhook 应在 3 秒内响应。 |
214 | CRC GET 请求期间返回非 200 响应码(例如 404、500 等)。 |
GET account_activity/webhooks
返回指定 App 的所有 URL 及其状态。 如果某个 URL 未通过每日验证检查,我们会将其标记为无效。要重新启用该 URL,请调用更新 endpoint。https://api.x.com/1.1/account_activity/webhooks.json
响应格式 | JSON |
需要身份验证 | 是(仅限 App——OAuth 2.0 Bearer Token) |
有请求速率限制 | 是 |
请求数 / 15 分钟窗口(App 认证) | 15 |
示例请求
代码 | 信息 |
---|---|
99 | 您无权访问该资源。 |
PUT account_activity/webhooks/:webhook_id
对指定 webhook(回调接口)的 URL 触发挑战响应校验(CRC)。如果校验成功,则返回 204,并将其状态设置为valid
,从而重新启用该 webhook(回调接口)。
https://api.x.com/1.1/account_activity/webhooks/:webhook_id.json
响应格式 | JSON |
需要验证 | 是(用户 context——所有 consumer 和 access tokens) |
请求速率限制 | 是 |
每 15 分钟窗口的请求数(用户验证) | 15 |
webhook_id(必填) | webhook(回调接口)的 id。由资源路径定义。 |
示例请求
Code | Message |
---|---|
34 | Webhook 不存在,或与其他 X App 关联。 |
214 | Webhook URL 不符合要求。 |
214 | Webhook URL 不符合要求。CRC 令牌无效或 JSON 响应格式不正确。 |
214 | CRC 的 GET 请求延迟过高。你的 webhook 应在 3 秒内响应。 |
214 | CRC 的 GET 请求期间返回非 200 的响应码(如 404、500 等)。 |
POST account_activity/webhooks/:webhook_id/subscriptions/all
将指定的 App 订阅为针对所提供用户上下文、所有消息类型的全部事件。激活后,请求方用户的所有事件将通过 POST 请求发送至该 App 的 webhook(回调接口)。 当前可用的订阅数量受您的账户配置限制。如需增加订阅,请联系您的客户经理。https://api.x.com/1.1/account_activity/webhooks/:webhook_id/subscriptions/all.json
响应格式 | JSON |
需要身份验证 | 是(3-legged OAuth——已列入白名单的 consumer key 和订阅用户的 access token) |
请求速率限制 | 是 |
请求数 / 15 分钟窗口(用户授权) | 500 |
webhook_id(必填) | webhook(回调接口)的 ID。由资源路径定义。 |
示例请求
代码 | 消息 |
---|---|
34 | webhook 不存在,或与其他 X App 关联。 |
348 | 客户端 App 无权访问该用户的 webhook(回调接口)订阅。 |
GET account_activity/subscriptions/count
返回当前在你的账户上处于活动状态的订阅数量。请注意,/count endpoint 需要使用仅限应用的 OAuth,因此你应使用 OAuth 2.0 Bearer Token,而非用户 context 发起请求。https://api.x.com/1.1/account_activity/subscriptions/count.json
响应格式 | HTTP 响应码 |
需要身份验证 | 是(仅限 App——OAuth 2.0 Bearer Token) |
请求速率限制 | 是 |
每 15 分钟窗口的请求数(App 认证) | 15 |
Code | Message |
200 | 成功。将返回所请求 webhook(回调接口)的订阅计数。 |
401 | 您的 App 无权查看指定 webhook(回调接口)的订阅。 |
示例请求
代码 | 信息 |
---|---|
32 | 无法对你进行身份验证。 |
GET account_activity/webhooks/:webhook_id/subscriptions/all
用于判断某个 webhook(回调接口)配置是否已订阅指定用户的事件。若所提供的用户 context 在所提供的应用中具有有效订阅,则返回 204 OK。若响应代码不是 204,则表示该用户没有有效订阅。详情参见下方的 HTTP 响应代码与错误信息。https://api.x.com/1.1/account_activity/webhooks/:webhook_id/subscriptions/all.json
响应格式 | JSON |
需要身份验证 | 是(三方 OAuth—列入白名单的 consumer key 和订阅用户的 access token) |
有请求速率限制 | 是 |
每 15 分钟窗口的请求数(用户认证) | 500 |
webhook_id(必填) | webhook(回调接口)ID。定义在资源路径中。 |
GET account_activity/webhooks/:webhook_id/subscriptions/all/list
返回指定 webhook 当前“All Activity”(所有活动)类型订阅的列表。请注意,/list endpoint 仅支持应用级 OAuth,因此请求应使用 OAuth 2.0 Bearer Token,而非用户上下文。https://api.x.com/1.1/account_activity/webhooks/:webhook_id/subscriptions/all/list.json
响应格式 | HTTP 响应码 |
需要身份验证 | 是(仅限应用,仅使用 OAuth 2.0 Bearer Token) |
请求速率限制 | 是 |
请求数 / 15 分钟窗口(应用认证) | 50 |
webhook_id(必填) | webhook(回调接口)的 ID。由资源路径定义。 |
代码 | 消息 |
---|---|
200 | 成功。将返回所请求 webhook(回调接口)的订阅列表。 |
401 | 您的 App 无权查看指定 webhook(回调接口)的订阅。 |
代码 | 信息 |
---|---|
32 | 无法验证您的身份。 |
DELETE account_activity/webhooks/:webhook_id
从所提供的应用的配置中移除该 webhook(回调接口)。可通过调用 GET /1.1/account_activity/webhooks 获取该 webhook 的 id。https://api.x.com/1.1/account_activity/webhooks/:webhook_id.json
响应格式 | JSON |
需要身份验证 | 是(用户 context——所有 consumer 和 Access Tokens) |
受请求速率限制 | 是 |
每 15 分钟窗口的请求数(用户认证) | 15 |
webhook_id(必填) | Webhook ID(webhook(回调接口)标识)。在资源路径中定义。 |
DELETE account_activity/webhooks/:webhook_id/subscriptions/all(已弃用)
为指定的用户context和应用停用订阅。停用后,将不再向该请求用户的webhook(回调接口)URL发送任何事件。https://api.x.com/1.1/account_activity/webhooks/:webhook_id/subscriptions/all.json
响应格式 | JSON |
需要身份验证 | 是(3-legged OAuth——已加入白名单的consumer key和已订阅用户的access token) |
受请求速率限制 | 是 |
每15分钟窗口的请求数(用户认证) | 500 |
webhook_id(必填) | webhook(回调接口)的 ID。定义在资源路径中。 |
示例请求
DELETE /account_activity/webhooks/:webhook_id/subscriptions/:user_id/all.json
为指定的 webhook 和用户 id 取消激活订阅。取消后,将不再向该 webhook URL 发送与请求用户相关的任何事件。请注意,此 endpoint 需要仅限应用的 OAuth(application-only),因此请求应使用 OAuth 2.0 Bearer Token,而非用户 context。https://api.x.com/1.1/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all.json
响应格式 | JSON |
需要身份验证 | 是(仅 App — OAuth 2.0 Bearer Token) |
是否有请求速率限制 | 是 |
每 15 分钟窗口的请求数 | 500 |
代码 | 信息 |
---|---|
404 | 抱歉,页面不存在。— 通常在指定的用户 id 实际未订阅时出现。 |
Replay API
Request Method | HTTP POST |
URL | /1.1/account_activity/replay/webhooks/:webhook_id/subscriptions/all.json?from_date=yyyymmddhhmm&to_date=yyyymmddhhmm |
Response Format | JSON |
Requires Authentication | 是(仅应用程序 — OAuth 2.0 Bearer Token) |
Rate Limit | 每 15 分钟 5 次请求。目前对可请求的重放作业数量没有上限。 |
from_date | 事件提供的最早(起始)UTC 时间戳,必须为“yyyymmddhhmm”格式。时间戳粒度为分钟,且为包含(例如 12:00 包含第 00 分钟)。有效时间必须为过去 5 天内的 UTC 时间,且不得晚于当前时间点前 31 分钟。建议 from_date 与 to_date 相差约 2 小时以内。 |
to_date | 事件提供的最晚(结束)UTC 时间戳,必须为“yyyymmddhhmm”格式。时间戳粒度为分钟,且为不包含(例如 12:30 不包含该小时的第 30 分钟)。有效时间必须为过去 5 天内的 UTC 时间,且不得晚于当前时间点前 10 分钟。 |
响应
Status | Text | Error Code | Description | Message |
---|---|---|---|---|
202 | Accepted | N/A | 请求成功,相关活动将被发送。 | N/A |
400 | Bad Request | 214 | webhook 已被标记为无效。 | Webhook 被标记为无效,需要进行 CRC 检查。 |
400 | Bad Request | 357 | 缺少 query 参数。 | : queryParam 为必填。 |
400 | Bad Request | 358 | 路由或 query 参数格式不正确。 | 无法解析参数。 |
400 | Bad Request | 360 | 路由参数为负数。 | webhook_id: [] 不大于或等于 0。 |
400 | Bad Request | 368 | from_date 或 to_date 不是过去时间。 | : [<field_value>] 不是过去时间。 |
400 | Bad Request | 356 | from_date 必须早于 to_date。 | from_date 必须早于 to_date。 |
400 | Bad Request | 356 | from_date 必须在过去 5 天内。 | from_date 必须在过去 5 天内。 |
401 | Unauthorized | 32 | 由于提供了三方授权,HTTP 认证失败。 | 身份验证方法无效。请使用仅应用程序身份验证。 |
401 | Unauthorized | 61 | 客户端无权请求此方法。 | 客户端无权请求此方法。 |
403 | Forbidden | 200 | 客户端没有启用 Replay 的 Enterprise 账户。 | 需要启用 replay 的 Account Activity API Enterprise 账户。请确认你拥有 Enterprise 账户且已启用 replay。 |
404 | Not Found | 34 | 不存在的 webhook_id;webhook_id 与 application_id 不匹配。 | Webhook 不存在或与其他 X 应用关联。 |
409 | Conflict | 355 | 存在正在处理的请求,需等待其完成后再发起新的请求。 | 此 webhook 的重放作业已在进行中。 |
429 | Too Many Requests | 88 | 触发请求速率限制(在给定时间段内达到请求数量上限) | 请求过多。请降低 API 请求速率。 |
500 | Internal Server Error | 0 | 内部服务器错误。 | 内部服务器错误。 |
503 | Service Unavailable | 67 | X 的一个或多个依赖服务不可用。 | X 服务器错误。请使用指数退避策略重试。 |