Skip to main content
发现特定账号的新推文,及时追踪关键词提及,并将实时 X 数据输入应用。本指南介绍如何基于 Sorsa API,使用主动拉取的轮询模式构建近实时监测管道。 检测延迟取决于轮询间隔、API 响应时间,以及帖子何时进入所选信息流或搜索索引。设计时应围绕检查点、分页和去重,不要假设每条新帖子都会出现在下一次响应中。
免费构建原型: 初始赠送的 100 次请求可访问所有 Sorsa 端点,一次性赠送,无需信用卡,永不过期。足以搭建下方任意监测器、确认能够发现实时推文,并在选购套餐前验证 Slack 或 Discord 分流。轮询消耗较多请求,请根据下方用量表和轮询间隔选择付费套餐。
注意: 更多架构模式和端到端示例请参阅博客上的使用 REST API 实时监测 Twitter

轮询监测的工作方式

从社交平台获取数据有推送式(流式传输、webhook)和拉取式(轮询)两种方式。Sorsa API 使用轮询,分为四步:
  1. 定期轮询端点,间隔为 1–30 秒。
  2. 比较结果与之前见过的推文 ID,识别新内容。
  3. 处理新推文: 发送提醒、保存,或分发至 Slack、Discord 等。
  4. 重复。
推文 ID 编码了创建时间,可通过 Python 整数或 JavaScript BigInt 比较。最大已见 ID 可作为检查点,但帖子可能延迟出现或乱序返回。生产环境应重复检查一段重叠时间窗口并按 ID 去重。崩溃后恢复需要显式保存和加载检查点。

选择合适的端点


第一级:监测单个账号

这是最简单的情况。循环轮询 /user-tweets 的第一页,输出 ID 大于上次已见 ID 的推文。首次成功轮询时只建立基线,不输出现有推文。这是开发示例:如果两次轮询之间或进程停止期间新增内容超过一页,可能漏掉帖子。

Python

JavaScript

这种方式不适合大量账号。监测 50 个账号需要 50 个独立循环和 50 倍请求。此时应使用 X 列表。

第二级:通过一次请求监测多个账号

X 列表最多可包含 5,000 个账号。/list-tweets 一次 API 调用即可返回全部成员合并后的最新推文。这是生产环境多账号监测的默认方案,详情见列表与社群

第 1 步:创建公开 X 列表

  1. 前往 X Lists 创建列表。
  2. 添加要监测的账号,最多 5,000 个。
  3. 将列表设为 Public。API 无法访问私有列表。
  4. 从 URL 复制列表 ID。例如 https://x.com/i/lists/1234567890 的 ID 为 1234567890

第 2 步:轮询列表

效率提升。 以 10 秒间隔分别轮询 50 个账号,每天消耗 50 × 8,640 = 432,000 次请求。将同样 50 个账号放入一个列表,以 10 秒间隔轮询,每天仅需 8,640 次,减少 50 倍。更多方式见优化 API 使用
/list-tweets 每页最多返回 20 条。如果成员在一次轮询间隔内发布更多推文,可将间隔缩短至 2–3 秒,或使用 next_cursor 分页,直到遇到已见过的 ID。

第三级:监测关键词或话题标签

不必追踪具体账号,也可以使用 order: "latest" 轮询 /search-tweets,按时间获取匹配查询的结果。
查询字符串可使用任意搜索运算符。例如监测品牌的高互动英文提及,并排除转推:

将新推文发送到 Slack、Discord 或任意 HTTP 端点

轮询循环负责生成数据,回调函数决定如何处理每条新推文。回调只是一个函数,因此同一个监测器可连接任何支持 HTTP 的目标。

通过 Incoming Webhook 发送到 Slack

Discord

Telegram

自定义 HTTP 端点


API 用量估算

下表假设每轮只有一页、固定调度且无需重试。请乘以监测器数量,并加上额外页面和重试次数。示例循环在收到响应后休眠,因此实际周期还包含网络和处理时间。 根据应用可接受的延迟和信息流活跃程度选择间隔。缩短间隔会增加请求数,但不能保证帖子立即出现在搜索结果中。 免费 100 次请求足够构建并端到端验证原型。持续监测时,按表中月度用量选套餐:单个循环以 30–60 秒间隔运行适合 Pro(每月 100,000 次),10 秒间隔适合 Enterprise(每月 500,000 次)。这些数字按单个监测器计算,多个并行运行会相应增加总量,请按合计用量选择。完整套餐见价格
超过标准套餐的速率或用量需求,请联系销售定制配额,或在 Discord 咨询。

生产环境加固

上方示例适用于开发。生产环境需要处理以下五点。

1. 在重启之间持久化 last_seen_id

脚本崩溃后如果不知道上次检查点,可能重复处理旧推文、发送重复提醒,或静默跳过缺口。将最后已见 ID 保存在文件、数据库或 Redis 中。
将监测器初始化的 last_seen_id = None 替换为 last_seen_id = load_state()。在一轮所有页面处理完成或进入持久化队列后,保存新检查点。页面获取或投递失败时不要推进检查点。重启后应先分页补齐缺口,再接受更新的检查点。

2. 对错误使用指数退避

网络问题、速率限制(HTTP 429)和临时 API 错误不可避免。应逐步增加等待时间并设置上限,而不是立即不断重试。完整说明见错误码

3. 将轮询与处理分离

不要在轮询循环内同步执行 NLP、数据库写入、外部 API 调用等耗时操作。下游变慢会导致轮询落后。将新推文放入队列,由独立工作进程处理。
更大工作负载可将内存 deque 替换为 Redis、RabbitMQ、SQS 或现有技术栈使用的消息系统。

4. 监测监测器本身

记录每轮的时间戳、新推文数、响应时间和错误。如果过去 N 分钟没有成功完成轮询,应发出提醒。静默故障会造成难以察觉的数据缺口。API 运行情况可查看 Sorsa 状态页

5. 处理边界情况

页面溢出和延迟到达: 持续使用 next_cursor,直到覆盖上次检查点以来的时间段。保留少量重叠并按存储的 ID 去重,避免仅因延迟结果的 ID 较旧而丢弃。前面的首页示例没有实现这种回填。 回调投递: 检查 webhook 响应状态,使用有限重试或持久化队列。Sorsa 请求成功不代表 Slack、Discord 或数据库已接收事件。
  • 已删除推文: 如果推文在获取后、回调前被删除,URL 会返回 404,应视为正常情况。
  • 受保护账号: 追踪用户设为私有后,/user-tweets 返回空列表。记录并继续。
  • 置顶推文: /user-tweets 的第一条往往是置顶内容,而非最新内容。不要直接用 tweets[0] 作为最新 ID;应使用 max(int(t["id"]) for t in tweets)(如上方示例),或按 created_at 排序。
  • 转推: 转推的 tweet["retweeted_status"] 有值,可据此决定是否纳入。
  • 回复限制: is_replies_limited 表示作者限制了回复,对某些监测场景有价值。

后续步骤

  • 搜索运算符:通过高级筛选减少关键词监测噪声
  • 追踪提及:支持互动筛选的专用 @提及端点
  • 速率限制:处理 429 错误和请求节奏
  • 分页:结合实时监测回填历史数据
  • API 参考/list-tweets/user-tweets/search-tweets 及全部端点的完整规范