如何用程序读取一条推文的回复

如何用程序读取一条推文的回复
Unif Cookbooks team
Unif Cookbooks team

更新于

一个免费端点,以 JSON 或 Markdown 返回任意 X 帖子下的公开回复,可按互动或时间排序,支持游标分页。

一句话总结:GET https://unifapi.com/tools/x/replies?id=<post id or URL> 以 JSON 返回一条帖子及其下的公开回复。它免费使用,无需登录、无需账号、无需 API 密钥,按访客限流。sort=top(默认)按互动排序,sort=recent 按时间排序。每页 20 条回复,带 nextCursor。每条回复都带作者、正文、指标、媒体和 inReplyToPostId,所以可以重建整条线程。这是免费的单帖端点都不提供的那一块 X 数据,也是过去大多数"读一下这条线程"的智能体任务最终都落到无头浏览器上的原因。

帖子下的回复才是反应所在。帖子本身告诉你一个品牌说了什么;回复告诉你人们怎么看、哪里出了问题、他们想要什么,以及哪条抱怨拿到了 4,000 个赞。对情感分析、客户研究和事故监控来说,回复就是数据。

它们也是不用账号时最难读到的那部分 X。FxTwitter 和 vxTwitter 只读单条帖子。syndication 端点只读单条帖子。X 自己的页面是在加载后用 JavaScript 补上回复的,所以 curl 只拿到一个空壳。官方 API 则把回复放在付费层的会话搜索里。

请求

curl -s "https://unifapi.com/tools/x/replies?id=https://x.com/NASA/status/2107237881668313108"

id 接受数字形式的帖子 ID,或完整的 x.com / twitter.com URL。响应:

{
  "post": {
    "id": "2107237881668313108",
    "text": "Time to bring them home 🌎 …",
    "author": { "handle": "NASA", "name": "NASA", "verified": true },
    "metrics": {
      "likes": 7210,
      "reposts": 846,
      "replies": 262,
      "quotes": 60,
      "bookmarks": 197,
      "views": 2823329
    },
    "conversationId": "2107237881668313108"
  },
  "replies": {
    "items": [
      {
        "id": "2107252849688424504",
        "text": "@NASA @Space_Station @SpaceX Those space suits don't look right…",
        "createdAt": "2026-10-05T23:33:22.000Z",
        "author": {
          "handle": "Troyztoys",
          "name": "Tee Crenshaw",
          "verified": true,
          "followers": 1823
        },
        "metrics": {
          "likes": 15,
          "reposts": 1,
          "replies": 0,
          "quotes": 0,
          "bookmarks": 0,
          "views": 894
        },
        "media": [],
        "conversationId": "2107237881668313108",
        "inReplyToPostId": "2107237881668313108"
      }
    ],
    "hasMore": true,
    "nextCursor": "20@"
  }
}

post 是原帖。replies.items 是这场会话里除原帖之外的公开帖子,直接回复和嵌套回复都在内。每条都有 inReplyToPostId,所以回复的回复会指向它的父级,线程可以重建成一棵树。

排序

sort=top(默认)按点赞加转发加回复数排序,大致就是 X 自己的"最相关"标签页的做法。sort=recent 最新在前。想知道"反应如何"用 top;想知道"过去一小时发生了什么"用 recent。

给人看的页面 /tools/x-reply-viewer 把这两个选项做成了切换按钮,而 /tools/x-reply-viewer?q=<id>&sort=recent&format=json 返回的与 API 完全一致。

翻页

回复每页 20 条。把 nextCursor 作为 cursor 传回去即可继续。第一个 cursor 常常长得像 20@,意思是"已取页面的下 20 条";后面的是 X 自己的不透明 cursor。把它们统统当作不透明字符串。

一条有 262 条回复的帖子大约是 14 页。那是你每 10 分钟 20 个免费单位里的 14 个,所以从响应头读 X-RateLimit-Remaining,够用就停;按 top 排序的第一页通常已经包含了真正重要的回复。

一条回复记录包含什么

字段含义
id、url回复的 id 和规范的 x.com URL
text完整正文,开头的 @提及按 X 的存储方式保留
createdAtISO 8601,UTC
authorhandle、name、verified、followers、avatarUrl……
metricslikes、reposts、replies、quotes、bookmarks、views
media照片和视频,带尺寸和 X CDN 上的 MP4 URL
inReplyToPostId这条回复所回答的帖子
conversationId会话的根帖子
possiblySensitiveX 自己的标记

形状与搜索、主页和媒体端点返回的 post 记录相同,所以给帖子打分的函数不用改就能用在回复上。

三样可以做的东西

反应摘要。 取 top 的第一页,把 20 条正文连同原帖喂给模型,让它给出最常见的三种情绪,每种配一条有代表性的引语。二十条回复、一次调用;top 排序已经替你做完了排名。

投诉信息流。 针对一个品牌的公告,每 10 分钟轮询一次 sort=recent,保留两次轮询之间 metrics.likes 越过阈值的回复,把它们转给人工。正在上升的那些,就是会被截图传播的那些。

线程重建。 遍历所有页,建一张从 id 到回复的映射,再把每条回复挂到 inReplyToPostId 上。回复原帖的是第一层;其余嵌套。渲染成 Markdown,你就有了一份可读的会话记录,可以放进报告。

限制

  • 只有公开回复。受保护账号的回复和已删除的回复不包含在内,因此原帖上的 replies 计数可能高于实际可读的数量。
  • 免费限额是每位访客每 10 分钟 20 次查询,所有 /tools/x/* 端点共享,一次搜索计为两次。429 响应带 Retry-After 和解除上限的 URL。
  • 大体量、历史数据和保障属于计量 X / Twitter API,用工作区密钥按量付费,字段名相同。

常见问题

不用 Twitter API 能拿到一条推文的回复吗?

能。上面的端点免费读取公开回复,无需登录、无需账号、无需密钥,按访客限流。默认返回 JSON,加 format=md 返回 Markdown。

为什么 X 显示 262 条回复,我只看到 200 条?

有些回复来自受保护账号,有些已被删除,有些被作者隐藏。原帖上的计数是 X 的,可读的集合是公开的那部分。

包含引用帖吗?

不包含。引用是独立的帖子,不是回复。用 /tools/x/search?q=<post url> 搜索该帖子的 URL 可以找到它们。

能把回复读成文本给模型用吗?

能。format=md 把原帖和每条回复渲染成一个 Markdown 区块,含作者、正文、指标和 URL。