跳转到主要内容

V2 Account Activity API

Account Activity API v2 现已在 Pro 套餐中提供!

概览

Account Activity API(AAA)通过 webhook(回调接口)提供一种方式,以接收与 X 用户账户相关的实时事件。通过将特定用户账户订阅到预先配置的 webhook,您的应用即可通过单一连接接收来自您拥有或已订阅的一个或多个账户的各类活动通知,例如 Posts、私信、like、关注、拉黑等。
此 API 常用于构建需要对用户操作即时响应,或根据用户活动保持最新状态的应用。对于您在 webhook 注册中的每个用户订阅,您将收到下列所有相关活动:

活动类型

  • Posts(由用户发布)
  • Post delete(由用户执行)
  • @提及(提及用户)
  • 回复(发给用户或来自用户)
  • 转发(由用户或针对用户)
  • 引用 Post(由用户或针对用户)
  • 对引用 Post 的转发(由用户或针对用户)
  • like(由用户或针对用户)
  • 关注(由用户或针对用户)
  • 取消关注(由用户或针对用户)
  • 屏蔽(由用户或针对用户)
  • 取消屏蔽(由用户或针对用户)
  • 静音(由用户或针对用户)
  • 取消静音(由用户或针对用户)
  • 发送的私信(由用户发送)
  • 收到的私信(由用户接收)
  • 正在输入指示器(发给用户)
  • 已读回执(发给用户)
  • 撤销订阅(由用户执行)
注意:我们不通过 Account Activity API 提供主页时间线数据。请使用按 User ID 的 User Posts 时间线 endpoint 来拉取此 data。

功能概览

级别价格唯一订阅数webhook 数量
Pro每月 $500031
Enterprise联系销售5000+5+
本文档重点介绍如何使用 v2 Account Activity API 的 endpoint 管理与您的 webhook(回调接口)关联的用户订阅。

管理订阅

Account Activity API 会在与已订阅您服务的 X 账户相关的事件发生时,通过 webhook(回调接口)发送 JSON 消息。X 会将这些活动投递到您注册的 webhook。通过以下步骤,您将了解如何为用户账户设置和管理订阅。

1. 创建 X App

使用已获批准的开发者账户在开发者门户创建 X App。若代表公司创建,请使用公司的 X 账户。
  • 在 App 页面“权限”选项卡中启用“读取、写入和访问私信”。
  • 在“Keys and Access Tokens”选项卡中,记录你的 App 的 Consumer Key (API Key)Consumer Secret (API Secret)Bearer Token
  • 生成你的 App 的 Access TokenAccess Token Secret。订阅用户账户时需要它们。
  • 如果不熟悉 X 登录和用户上下文,请查看Obtaining Access Tokens
  • 在开发者门户的“Apps”页面记下你的 App 的数值型 id。申请 Account Activity API 访问时需要此项。

2. 获取 Account Activity API 访问权限

Account Activity API 仅在 Enterprise 级别提供。请通过开发者门户提交 Enterprise 访问申请。

3. 注册 Webhook

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

4. 验证设置

要验证你的 App 和 webhook(回调接口)是否配置正确:
  • 将一个用户账户订阅到你的 webhook(参见下文“Adding a Subscription”)。
  • 对你的 App 已订阅的某个 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(回调接口)投递,使你的 App 能及时获知所有私信活动。
  • 事件重复
    • 如果两个已订阅用户在同一私信会话中,你的 webhook 会分别收到来自每个用户的事件。请使用 for_user_id 字段加以区分。
    • 如果多个 App 共享相同的 webhook URL 和用户,事件会被多次发送(每个 App 一次)。
    • 你的 App 应基于事件 ID 进行去重,以处理偶发的重复事件。
  • 示例代码:参见 Account Activity API Setup,其中提供了一个用于展示 webhook 事件的 Web 应用。

管理已订阅用户(v2 API)

在注册了 webhook 并获得有效的 webhook_id 之后,你可以管理用户订阅以接收其账户活动。使用以下 endpoint 添加、查看或移除订阅。 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 未找到,或未与该 App 关联。
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 不存在,或未与该 App 关联。

Endpoint: DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Description: 停用特定用户ID的订阅,停止向该 webhook(回调接口)投递事件。
Authentication: OAuth 2.0 App only Bearer Token。
  • Bearer Token: 例如,AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn…
Path Parameters:
ParameterDescription
webhook_id包含该订阅的 webhook(回调接口)的 id。
user_id要取消订阅的用户的数值型 id。
Request:
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 未找到,或未与该 App 关联。
Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Description: 获取当前订阅指定 webhook(回调接口)的所有用户 id 列表。
Authentication: OAuth 2.0 App only Bearer Token。
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/list' \
--header 'authorization: Bearer <BEARER_TOKEN>'
响应
  • 成功(200 OK)
  • JSON
{
  "data": {
    "application_id": "<你的 App id>",
    "webhook_id": "<webhook(回调接口) id>",
    "webhook_url": "<webhook(回调接口)的回调 URL>",
    "subscriptions": [
      { "user_id": "<用户_id_1>" },
      { "user_id": "<用户_id_2>" }
    ]
  }
}
  • 失败(400 Bad Request):
原因说明
WebhookIdInvalid提供的 webhook_id 未找到,或未与该 App 关联。

Endpoint: GET /2/account_activity/subscriptions/count
Description: 返回用于身份验证的应用的有效订阅总数,以及该应用的配置上限。
Authentication: OAuth 2.0 App only Bearer Token。
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(回调接口)。这对于在停机期间遗漏的事件恢复非常有用。 Endpoint: POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all Description: 启动重放任务 Authentication: OAuth2 App Only Bearer Token Path Parameters:
ParameterDescription
webhook_id要开始重放的 webhook 的 id
Query Parameters:
ParameterDescription
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 分钟内。
Responses: Success:
200

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

作业完成消息

当重放作业成功完成时,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关于 Posts、转发、回复、@ 提及、引用 Tweet 或对引用 Tweet 的转发的 Post 状态。
favorite_events包含用户与目标的 like 事件。
follow_events包含用户与目标的关注事件。
unfollow_events包含用户与目标的取消关注事件。
block_events包含用户与目标的屏蔽事件。
unblock_events包含用户与目标的取消屏蔽事件。
mute_events包含用户与目标的静音事件。
unmute_events包含用户与目标的取消静音事件。
user_event当用户移除 App 授权时的撤销事件(订阅将自动删除)。
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(Posts、转发、回复、引用推文)

{
  "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 对象>
    },
    "user": {
      <用户对象>
    }
  }]
}

follow_events

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "follow",
    "created_timestamp": "1517588749178",
    "target": {
      <用户对象>
    },
    "source": {
      <用户对象>
    }
  }]
}

unfollow_events

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "unfollow",
    "created_timestamp": "1517588749178",
    "target": {
      <用户对象>
    },
    "source": {
      <用户对象>
    }
  }]
}

block_events

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

unblock_events

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

mute_events

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

unmute_events

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

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": "Boulder, CO",
      "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": "Burlington, MA",
      "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": "Alter Ego - 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:完整文本中出现的所有实体(例如,hashtags、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": "History Photographed",
              "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 从旧版 Enterprise 迁移到 v2

请参阅我们的迁移指南

常见问题

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

Account Activity API 参考索引

目的v2 endpoint
将应用订阅到某个账户的事件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
使用仅限 App 的 OAuth 停用订阅DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
创建重放作业POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all
有关 webhook 管理 endpoint(注册、查看、验证、删除),请参阅 v2 Webhooks API 文档
I