免费构建原型: 初始赠送的 100 次请求可访问所有 Sorsa 端点,一次性赠送,无需信用卡,永不过期。足以搭建下方任意监测器、确认能够发现实时推文,并在选购套餐前验证 Slack 或 Discord 分流。轮询消耗较多请求,请根据下方用量表和轮询间隔选择付费套餐。
注意: 更多架构模式和端到端示例请参阅博客上的使用 REST API 实时监测 Twitter。
轮询监测的工作方式
从社交平台获取数据有推送式(流式传输、webhook)和拉取式(轮询)两种方式。Sorsa API 使用轮询,分为四步:- 定期轮询端点,间隔为 1–30 秒。
- 比较结果与之前见过的推文 ID,识别新内容。
- 处理新推文: 发送提醒、保存,或分发至 Slack、Discord 等。
- 重复。
选择合适的端点
第一级:监测单个账号
这是最简单的情况。循环轮询/user-tweets 的第一页,输出 ID 大于上次已见 ID 的推文。首次成功轮询时只建立基线,不输出现有推文。这是开发示例:如果两次轮询之间或进程停止期间新增内容超过一页,可能漏掉帖子。
Python
JavaScript
第二级:通过一次请求监测多个账号
X 列表最多可包含 5,000 个账号。/list-tweets 一次 API 调用即可返回全部成员合并后的最新推文。这是生产环境多账号监测的默认方案,详情见列表与社群。
第 1 步:创建公开 X 列表
- 前往 X Lists 创建列表。
- 添加要监测的账号,最多 5,000 个。
- 将列表设为 Public。API 无法访问私有列表。
- 从 URL 复制列表 ID。例如
https://x.com/i/lists/1234567890的 ID 为1234567890。
第 2 步:轮询列表
/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 调用等耗时操作。下游变慢会导致轮询落后。将新推文放入队列,由独立工作进程处理。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表示作者限制了回复,对某些监测场景有价值。