跳转到主要内容

V2 Account Activity API

Account Activity API v2 现已在免费计划中提供!

概述

Account Activity API(AAA)提供了一种通过 webhook 实时接收与 X 用户账号相关事件的方式。通过将特定用户账号订阅到预先配置的 webhook,您的应用可以在单一连接下,从一个或多个您拥有或订阅的账号接收诸如 Posts、Direct Messages、Likes、Follows、Blocks 等各类活动通知。
该 API 常用于构建需要对用户操作即时响应,或基于用户活动保持最新状态的应用。对于您在 webhook 注册中的每个用户订阅,您将收到以下所有相关活动:

活动类型

  • 发布的 Post(由用户)
  • 删除的 Post(由用户)
  • @提及(提及该用户)
  • 回复(发给用户或来自用户)
  • 转帖(由用户或涉及该用户)
  • 引用 Post(由用户或涉及该用户)
  • 对引用 Post 的转帖(由用户或涉及该用户)
  • 点赞(由用户或涉及该用户)
  • 关注(由用户或涉及该用户)
  • 取消关注(由用户或涉及该用户)
  • 屏蔽(由用户或涉及该用户)
  • 取消屏蔽(由用户或涉及该用户)
  • 静音(由用户或涉及该用户)
  • 取消静音(由用户或涉及该用户)
  • 发送的私信(由用户)
  • 接收的私信(由用户)
  • 正在输入指示(给用户)
  • 已读回执(给用户)
  • 取消订阅(由用户)
注意:我们不通过 Account Activity API 提供首页时间线的数据。请使用“按用户 ID 获取用户 Posts 时间线”的端点来拉取这些数据。

功能概览

等级价格唯一订阅数量Webhook 数量
免费$5000/月31
企业版联系销售5000+5+
本文档重点介绍如何使用 v2 版 Account Activity API 端点来管理与您的 webhook 关联的用户订阅。

管理订阅

Account Activity API 会在与你的服务订阅关联的 X 账户发生事件时,通过 webhook 发送 JSON 格式的消息。X 会将这些活动投递到你注册的 webhook。按照以下步骤,你将了解如何为用户账户设置和管理订阅。
Account Activity API v2 目前不支持 User Auth 2.0。我们正在解决该问题,并将在支持 OAuth 2.0 后更新我们的文档。

1. 创建 X 应用

使用已获批准的开发者账户在开发者门户创建 X 应用。若代表公司创建,请使用公司的 X 账号。
  • 在应用页面的“权限”选项卡中启用“Read, Write, and Access direct messages”。
  • 在“Keys and Access Tokens”选项卡中,记下应用的 Consumer Key (API Key)Consumer Token (API Secret)Bearer Token
  • 生成应用的 Access TokenAccess Token Secret。这些在订阅用户账号时需要用到。
  • 如果不熟悉 X 登录与用户上下文,请查看Obtaining Access Tokens
  • 在开发者门户的“Apps”页面记下应用的数字 id。申请 Account Activity API 访问时需要此信息。

2. 获取 Account Activity API 的访问权限

Account Activity API 仅在企业版层级提供。请通过开发者门户提交企业版访问申请。

3. 注册 Webhook

要接收 Account Activity 事件,您必须使用可公开访问的 HTTPS URL 注册一个 webhook。有关开发 webhook 消费者应用、注册 webhook、进行安全防护以及处理 Challenge-Response Checks(CRC)的详细信息,请参阅 V2 Webhooks API 文档。
  • 请确保您的 webhook 已配置为处理带有 JSON 编码事件负载的 POST 请求。
  • 从 webhook 注册响应中获取 webhook_id,该值是管理订阅所必需的。

4. 验证设置

要验证你的应用和 webhook 是否已正确配置:
  • 将一个用户账户订阅到你的 webhook(参见下文 “Adding a Subscription”)。
  • 点赞你的应用已订阅的某个 X 账号发布的 Post。
  • 你应会通过向你的 webhook URL 发送的 POST 请求收到一个 favorite_events 负载。
  • 注意:添加订阅后,事件开始投递可能需要最长 10 秒。

重要说明

  • 认证:在为用户启用订阅时,请使用该用户账号的 consumer key、consumer secret、access token 和 access token secret。
  • 私信:所有收发的私信(通过 POST /2/dm_conversations/with/:participant_id/messages 发送)都会通过 webhook 传递,以便让您的应用掌握所有私信活动。
  • 事件重复
    • 如果两位已订阅用户在同一私信会话中,您的 webhook 会收到重复事件(每个用户各一次)。请使用 for_user_id 字段加以区分。
    • 如果多个应用共享同一 webhook URL 和用户,事件会被多次发送(每个应用各一次)。
    • 您的应用应基于事件 ID 进行去重,以应对偶发的重复事件。
  • 示例代码:请参阅 Account Activity API 设置,查看用于展示 webhook 事件的 Web 应用。

管理已订阅用户(v2 API)

在你注册了包含有效 webhook_id 的 webhook 之后,可以管理用户订阅以接收其账户活动。使用以下端点添加、查看或移除订阅。 Endpoint: POST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: 通过指定的 webhook 为正在进行认证的用户订阅事件,以便接收相关事件。
Authentication: OAuthUser(需要三方 OAuth 流程,代表被订阅的用户)。
  • Consumer Key: 例如:xvz1evFS…
  • Access Token: 例如:370773112-GmHxMAgYyLbN…
Path Parameters:
ParameterDescription
webhook_id要与该订阅关联的 webhook 的 ID。
Request:
bash
curl --request POST --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all' \
--header 'authorization: OAuth oauth_consumer_key="<CONSUMER_KEY>", oauth_nonce="GENERATED", oauth_signature="GENERATED", oauth_signature_method="HMAC-SHA1", oauth_timestamp="GENERATED", oauth_token="<ACCESS_TOKEN>", oauth_version="1.0"'
响应
  • 成功(200 OK)
  • json
{
  "data": {
    "subscribed": true
  }
}
  • 失败(400 Bad Request)
原因描述
WebhookIdInvalid未找到所提供的 webhook_id,或其未与该应用关联。
DuplicateSubscriptionFailed该用户针对指定的 webhook_id 的订阅已存在。
SubscriptionLimitExceeded该应用在所有 webhook 上的订阅数量已达上限。

Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: 检查正在进行认证的用户是否已订阅指定的 webhook。
Authentication: OAuthUser(需要三方 OAuth 授权流程)。
Path Parameters:
ParameterDescription
webhook_id要检查的 webhook 的 ID。
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all' \
--header 'authorization: OAuth oauth_consumer_key="<CONSUMER_KEY>", oauth_nonce="GENERATED", oauth_signature="GENERATED", oauth_signature_method="HMAC-SHA1", oauth_timestamp="GENERATED", oauth_token="<ACCESS_TOKEN>", oauth_version="1.0"'
响应
  • 成功(200 OK)
  • json
{
  "data": {
    "subscribed": true // 或 false
  }
}
  • 失败(400 Bad Request):
原因描述
WebhookIdInvalid提供的 webhook_id 未找到,或未与该应用程序关联。

端点: DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
描述: 为特定用户 ID 停用该订阅,停止向该 webhook 发送事件。
认证: OAuth2 应用仅限 Bearer Token。
  • Bearer Token: 例如:AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn…
路径参数:
参数描述
webhook_id包含该订阅的 webhook 的 ID。
user_id需取消订阅的用户的数值型 ID。
请求:
bash
curl --request DELETE --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/:USER_ID/all' \
--header 'authorization: Bearer <BEARER_TOKEN>'
响应
  • 成功 (200 OK)
  • json
{
  "data": {
    "subscribed": false
  }
}
  • 失败(400 Bad Request):
原因描述
SubscriptionNotFound在指定的 user_id 与给定的 webhook_id 之间未找到任何订阅。
WebhookIdInvalid提供的 webhook_id 不存在,或未与该应用关联。
端点: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
说明: 获取当前订阅指定 webhook 的所有用户 ID 列表。
认证: 仅应用 OAuth2 Bearer 令牌。
路径参数:
参数说明
webhook_id要列出订阅的目标 webhook 的 ID。
请求:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all/list' \
--header 'authorization: Bearer <BEARER_TOKEN>'
响应
  • 成功(200 OK)
  • JSON
{
  "data": {
    "application_id": "<你的应用 id>",
    "webhook&#95;id": "<webhook id>",
    "webhook_url": "<webhook 的回调 url>",
    "subscriptions": [
      { "user_id": "<用户 id 1>" },
      { "user_id": "<用户 id 2>" }
    ]
  }
}
  • 失败(400 错误的请求):
原因说明
WebhookIdInvalid提供的 webhook_id 未找到,或未与该应用关联。

Endpoint: GET /2/account_activity/subscriptions/count
Description: 返回当前活跃订阅的总数,以及用于认证的应用所预配的上限。
Authentication: OAuth2 应用专用 Bearer 令牌。
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/subscriptions/count' \
--header 'authorization: Bearer <BEARER_TOKEN>'
响应
  • 成功(200 OK)
  • JSON
{
  "data": {
    "account_name": "<你的应用名称>",
    "provisioned_count": "<已分配的订阅限额>",
    "subscriptions_count_all": "<当前活跃订阅数量>",
    "subscriptions_count_direct_messages": "0" // 不再支持仅私信订阅
  }
}
AAAv2 提供重放功能,可在指定时间范围内检索过去的事件并将其重新投递到你的 webhook。这对于在停机期间错过的事件恢复非常有用。 端点: POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all 描述: 启动重放作业 认证: OAuth2 应用专用 Bearer 令牌 路径参数:
参数描述
webhook_id要开始重放的 webhook 的 ID
查询参数:
参数描述
from_date事件提供的最早(起始)UTC 时间戳,须为 ‘yyyymmddhhmm’ 格式。时间戳以分钟为粒度且为包含关系(例如 12:00 包含第 00 分)。有效时间必须在过去 24 小时内(UTC),且不得晚于当前时间点前 31 分钟。建议 from_date 与 to_date 的间隔在约 2 小时以内。
to_date事件提供的最晚(结束)UTC 时间戳,须为 ‘yyyymmddhhmm’ 格式。时间戳以分钟为粒度且为不包含关系(例如 12:30 不包含该小时的第 30 分)。有效时间必须在过去 24 小时内(UTC),且不得晚于当前时间点前 10 分钟。
响应: 成功:
200

{
  "for_user_id": "<USER_ID>"
  "replay_event": {
    "job_id": <REPLAY_JOB_ID>",
    "created_at: "yyyy-mm-ddThh:mm:ss.000Z"
  }
}
Failures:
原因描述
QueryParamInvalidfrom_date 早于当前时间 24 小时。
QueryParamInvalidfrom_date 晚于 to_date。
QueryParamInvalidfrom_date 是未来时间。
QueryParamInvalidto_date 是未来时间。
QueryParamInvalidfrom_date 或 to_date 的格式不正确。
CrcValidationFailedCRC 验证期间从 webhook URL 收到的响应不正确。
ReplayConflictError指定的 webhook 已有重放作业在进行中。
WebhookIdInvalid提供的 webhook_id 无效或未与该应用关联。

任务完成消息

当你的回放任务成功完成后,X 会发送以下任务完成事件。收到该事件后,表示该任务已运行结束,之后即可提交新的任务。
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Complete",
    "job_state_description": "作业已成功完成",
    "job_id": "<JOB_ID>"
  }
}
如果您的作业未成功完成,我们会返回以下消息,提示您重试 Replay 作业。收到此事件后,说明该作业已运行结束,您可以提交另一个作业。
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Incomplete",
    "job_state_description": "作业未能传递所有事件,请重试重放作业",
    "job_id": "<JOB_ID>"
  }
}

账户活动数据对象结构

对象详情
for_user_id标识与该事件相关的用户订阅。
is_blocked_by(条件)仅在 Post 提及事件中显示,指当发出提及的用户被订阅用户屏蔽时。
source执行该活动的用户(例如进行关注、屏蔽或静音的用户)。
target活动所针对的用户(例如被关注、被屏蔽或被静音的用户)。

可用的活动

消息类型详情
tweet_create_events关于 Post、转发、回复、@提及、引用 Tweet 或对引用 Tweet 的转发的发布状态。
favorite_events含用户与目标的点赞事件。
follow_events含用户与目标的关注事件。
unfollow_events含用户与目标的取消关注事件。
block_events含用户与目标的屏蔽事件。
unblock_events含用户与目标的取消屏蔽事件。
mute_events含用户与目标的静音事件。
unmute_events含用户与目标的取消静音事件。
user_event当用户移除应用授权时的撤销事件(订阅将自动删除)。
direct_message_events已发送或已接收消息的私信(DM)状态。
direct_message_indicate_typing_events含用户与目标的私信(DM)正在输入事件。
direct_message_mark_read_events含用户与目标的私信(DM)已读事件。
tweet_delete_events为合规提供已删除 Post 的通知。
spaces_events目前不支持。即将推出。

载荷示例

以下是每种 Account Activity 事件的载荷示例。

tweet_create_events(Post、转推、回复、引用推文)

{
  "for_user_id": "2244994945",
  "tweet_create_events": [
    {
      <Tweet 对象>
    }
  ]
}

tweet_create_events(@提及)

{
  "for_user_id": "2244994945",
  "user_has_blocked": "false",
  "tweet_create_events": [
    {
      <Tweet 对象>
    }
  ]
}

favorite_events

{
  "for_user_id": "2244994945",
  "favorite_events": [{
    "id": "a7ba59eab0bfcba386f7acedac279542",
    "created_at": "Mon Mar 26 16:33:26 +0000 2018",
    "timestamp_ms": 1522082006140,
    "favorited_status": {
      <Tweet Object>
    },
    "user": {
      <User Object>
    }
  }]
}

follow_events

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "follow",
    "created_timestamp": "1517588749178",
    "target": {
      <User Object>
    },
    "source": {
      <User Object>
    }
  }]
}

取消关注事件(unfollow_events)

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "unfollow",
    "created_timestamp": "1517588749178",
    "target": {
      <User Object>
    },
    "source": {
      <User Object>
    }
  }]
}

block_events

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "block",
    "created_timestamp": "1518127020304",
    "source": {
      <用户对象>
    },
    "target": {
      <用户对象>
    }
  }]
}

解除封鎖_事件

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "unblock",
    "created_timestamp": "1518127020304",
    "source": {
      <User Object>
    },
    "target": {
      <User Object>
    }
  }]
}

mute_events

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "mute",
      "created_timestamp": "1518127020304",
      "source": {
        <User Object>
      },
      "target": {
        <User Object>
      }
    }
  ]
}

取消静音_事件

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "unmute",
      "created_timestamp": "1518127020304",
      "source": {
        <User Object>
      },
      "target": {
        <User Object>
      }
    }
  ]
}

user_event

{
  "user_event": {
    "revoke": {
      "date_time": "2018-05-24T09:48:12+00:00",
      "target": {
        "app_id": "13090192"
      },
      "source": {
        "user_id": "63046977"
      }
    }
  }
}

direct_message_events

{
  "for_user_id": "4337869213",
  "direct_message_events": [{
    "type": "message_create",
    "id": "954491830116155396",
    "created_timestamp": "1516403560557",
    "message_create": {
      "target": {
        "recipient_id": "4337869213"
      },
      "sender_id": "3001969357",
      "source_app_id": "13090192",
      "message_data": {
        "text": "你好,世界!",
        "entities": {
          "hashtags": [],
          "symbols": [],
          "user_mentions": [],
          "urls": []
        }
      }
    }
  }],
  "apps": {
    "13090192": {
      "id": "13090192",
      "name": "FuriousCamperTestApp1",
      "url": "https://x.com/furiouscamper"
    }
  },
  "users": {
    "3001969357": {
      "id": "3001969357",
      "created_timestamp": "1422556069340",
      "name": "Jordan Brinks",
      "screen_name": "furiouscamper",
      "location": "科罗拉多州博尔德",
      "description": "另一个自我 - X PE 观点仅代表个人",
      "url": "https://t.co/SnxaA15ZuY",
      "protected": false,
      "verified": false,
      "followers_count": 22,
      "friends_count": 45,
      "statuses_count": 494,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/851526626785480705/cW4WTi7C_normal.jpg"
    },
    "4337869213": {
      "id": "4337869213",
      "created_timestamp": "1448312972328",
      "name": "Harrison Test",
      "screen_name": "Harris_0ff",
      "location": "马萨诸塞州伯灵顿",
      "protected": false,
      "verified": false,
      "followers_count": 8,
      "friends_count": 8,
      "statuses_count": 240,
      "profile_image_url_https": "https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png"
    }
  }
}

direct_message_indicate_typing_events

{
  "for_user_id": "4337869213",
  "direct_message_indicate_typing_events": [{
    "created_timestamp": "1518127183443",
    "sender_id": "3284025577",
    "target": {
      "recipient_id": "3001969357"
    }
  }],
  "users": {
    "3001969357": {
      "id": "3001969357",
      "created_timestamp": "1422556069340",
      "name": "Jordan Brinks",
      "screen_name": "furiouscamper",
      "location": "Boulder, CO",
      "description": "另一个自我 - X PE 仅代表个人观点",
      "url": "https://t.co/SnxaA15ZuY",
      "protected": false,
      "verified": false,
      "followers_count": 23,
      "friends_count": 47,
      "statuses_count": 509,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/851526626785480705/cW4WTi7C_normal.jpg"
    },
    "3284025577": {
      "id": "3284025577",
      "created_timestamp": "1437281176085",
      "name": "Bogus Bogart",
      "screen_name": "bogusbogart",
      "protected": true,
      "verified": false,
      "followers_count": 1,
      "friends_count": 4,
      "statuses_count": 35,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/763383202857779200/ndvZ96mE_normal.jpg"
    }
  }
}

direct_message_mark_read_events

{
  "for_user_id": "4337869213",
  "direct_message_mark_read_events": [{
    "created_timestamp": "1518452444662",
    "sender_id": "199566737",
    "target": {
      "recipient_id": "3001969357"
    },
    "last_read_event_id": "963085315333238788"
  }],
  "users": {
    "199566737": {
      "id": "199566737",
      "created_timestamp": "1286429788000",
      "name": "Le Braat",
      "screen_name": "LeBraat",
      "location": "Denver, CO",
      "description": "白天在 @X 做数据,傍晚做设计",
      "protected": false,
      "verified": false,
      "followers_count": 299,
      "friends_count": 336,
      "statuses_count": 752,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/936652894371119105/YHEozVAg_normal.jpg"
    },
    "3001969357": {
      "id": "3001969357",
      "created_timestamp": "1422556069340",
      "name": "Jordan Brinks",
      "screen_name": "furiouscamper",
      "location": "Boulder, CO",
      "description": "另一个我 - X PE 仅代表个人观点",
      "url": "https://t.co/SnxaA15ZuY",
      "protected": false,
      "verified": false,
      "followers_count": 23,
      "friends_count": 48,
      "statuses_count": 510,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/851526626785480705/cW4WTi7C_normal.jpg"
    }
  }
}

tweet_delete_events

{
  "for_user_id": "930524282358325248",
  "tweet_delete_events": [
    {
      "status": {
        "id": "1045405559317569537",
        "user_id": "930524282358325248"
      },
      "timestamp_ms": "1432228155593"
    }
  ]
}

对长文 Post 的支持

V2 Account Activity API 现已支持长文 Post,即超过 280 个字符的 Post。当长文 Post 包含在 tweet_create_events 负载中时,text 字段包含前 140 个字符(或更少),并且 truncated 字段设置为 true。完整的 Post 内容位于 extended_tweet 对象中,其中包括:
  • full_text:Post 的完整文本,包括超过 280 字符限制的所有字符。
  • entities:出现在完整文本中的任何实体(例如话题标签、URL、用户提及、符号),包括第 280 个字符之后的实体。
  • display_text_range:应显示的字符范围,覆盖完整文本。
这可确保应用能够处理长文 Post 的全部内容,包括文本后部出现的提及或其他实体。下面是一个用于长文 Post 的 tweet_create_events 负载示例:
{
  "for_user_id": "1603419180975409153",
  "tweet_create_events": [
    {
      "created_at": "Mon May 19 14:01:46 +0000 2025",
      "id": 1924465506158879000,
      "id_str": "1924465506158878979",
      "text": "安提基特拉机械:通往古代智慧的窗口 1901年在一艘罗马沉船残骸中发现… https://t.co/bzbEKj8cd8",
      "display_text_range": [
        0,
        140
      ],
      ...
      "user": {
        ...
      },
      ...
      "extended_tweet": {
        "full_text": "安提基特拉机械:通往古代智慧的窗口 1901年,在希腊安提基特拉岛附近一艘罗马沉船的残骸中发现了安提基特拉机械,它常被誉为世界上第一台模拟计算机。这个精密的青铜装置可追溯至公元前100年左右,其精巧的设计和神秘的用途令历史学家、考古学家和科学家为之着迷。该机械由复杂的齿轮系统组成,精心制作用于执行在当时极为先进的计算。它的发现颠覆了人们对古代世界技术能力的固有认知。安提基特拉机械的主要功能似乎与天文学有关。它能够预测太阳、月亮乃至行星的位置,追踪月食和日食,甚至计算奥林匹克运动会的日期。该装置的刻度盘和指针,配合古希腊文铭文,表明它既是科学研究工具,也用于文化活动。其精度堪比19世纪的钟表制造工艺,彰显了其创造者(很可能来自希腊化世界)的非凡智慧。尽管经过数十年的研究,许多问题仍未解答。是谁制造的?为谁而造?它是独一无二的杰作,还是历史上失传的更广泛机械装置传统的一部分?X射线成像和现代计算技术揭示了其内部运作的诸多细节,但其全部功能范围仍存在争议。有人认为它用于占星预测,也有人将其视为天文学家的教学工具。安提基特拉机械见证了人类的好奇心与创新精神,连接着古代与现代世界。它提醒我们,即使在古代,人们也在用堪比当今技术复杂度的工具探索宇宙奥秘。它经久不衰的神秘感持续激发着人们的敬畏与探究,使其成为有史以来出土的最非凡文物之一。\n@xai\n@HistoryInPics",
        "display_text_range": [
          0,
          2051
        ],
        "entities": {
          "hashtags": [],
          "urls": [],
          "user_mentions": [
            {
              "screen_name": "xai",
              "name": "xAI",
              "id": 1661523610111193000,
              "id_str": "1661523610111193088",
              "indices": [
                2032,
                2036
              ]
            },
            {
              "screen_name": "HistoryInPics",
              "name": "历史影像",
              "id": 1582853809,
              "id_str": "1582853809",
              "indices": [
                2037,
                2051
              ]
            }
          ],
          "symbols": []
        }
      },
      ...
      "entities": {
        "hashtags": [],
        "urls": [
          {
            "url": "https://t.co/bzbEKj8cd8",
            "expanded_url": "https://twitter.com/i/web/status/1924465506158878979",
            "display_url": "twitter.com/i/web/status/1…",
            "indices": [
              117,
              140
            ]
          }
        ],
        "user_mentions": [],
        "symbols": []
      },
      ...
    }
  ]
}

将 Account Activity API 从旧版企业版迁移到 v2

请参阅我们的迁移指南

常见问题解答

使用 Account Activity API 有哪些优势? Account Activity API 使用 webhook 以实时方式传递数据,无需保持长连接(不同于流式 API)或频繁轮询(不同于 REST API)。其优势包括:
  • 速度:以 X 的速度传递数据。
  • 简单:通过单一 webhook 连接提供所有账户事件,包括 Post、@提及、回复、转发、引用、点赞、私信、关注、拉黑和静音。
  • 可扩展性:在企业版层级下,无速率限制或事件上限,支持受管账户的所有活动。
我需要为 Account Activity API 设置开发、预发布和生产环境,这可以吗? 可以!你可以注册多个 webhook URL,并通过 V2 Webhooks API 分别管理订阅。 是否有关于如何开始使用 Account Activity API 的分步指南? 有!请参阅 Webhooks 入门指南Account Activity API 示例应用 使用 Account Activity API 需要哪种认证方式? 每个端点的认证要求各不相同。详情请查看认证部分 如果我订阅了彼此互动的用户,会收到重复的活动吗? 会。如果你的应用为用户 A 和用户 B 都创建了订阅,当用户 A 在一条 Post 中提及用户 B 时,你的 webhook 会收到两个事件(每个用户一个)。使用 for_user_id 字段来识别对应的订阅。 当我为我的 webhook 创建订阅时,能否将端点中的 /all/ 部分替换为其他账户活动数据对象,以限制投递的活动? 不能。/all/ 是唯一选项,会投递所有受支持的事件类型。 如果我有三个 webhook 的访问权限,能否为我注册用于企业用途的每个应用分别使用三个 webhook? webhook 限制是在账户级别设置的,而不是按应用。比如,如果你有三个 webhook 和两个应用,你可以为一个应用使用两个 webhook、另一个应用使用一个,但不能为每个应用都使用三个。

Account Activity API 参考索引

目的V2 端点
将应用订阅到某个账户的事件POST /2/account_activity/webhooks/:webhook_id/subscriptions/all
返回当前活动订阅的数量GET /2/account_activity/subscriptions/count
检查某个 webhook 是否已订阅某账户GET /2/account_activity/webhooks/:webhook_id/subscriptions/all
返回当前活动订阅列表GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
使用仅应用 OAuth 停用订阅DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
创建回放任务POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all
有关 webhook 管理端点(注册、查看、验证、删除),请参阅 V2 Webhooks API 文档