跳到正文

下载 X 上某个用户的全部推文

要下载 X 账号的全部推文,需要翻遍它的时间线并把每一页存成 CSV;X 自己的时间线接口只返回最新的 3,200 条帖子,所以想拿到完整历史,就要用没有这个上限的接口。

  • 更新于
  • 发布于
  • 阅读约 12 分钟

简短回答: 用 X 的存档可以免费拿到你自己账号的完整历史,不过 X 说可能要几天。对其他人的账号,官方 X API 的用户时间线只返回最新的 3,200 条帖子。想拿到每一条帖子,用 Sorsa API 的 POST /user-tweets:每次请求 20 条帖子,没有上限,每 1,000 条 $0.07 起;你的 100 次免费请求可以覆盖前 2,000 条。

接口
POST /user-tweets
每页条数
每次请求 20 条帖子
价格
每 1,000 条帖子 $0.07 起

#该选哪种方式?

两个事实决定该走哪条路:你要谁的推文,以及要多少条。你自己账号的完整历史,可以从 X 的存档免费获取。别人的帖子,则要通过翻遍其公开时间线的导出来获取,能回溯多远取决于背后的接口。

只要账号的最新帖子,免费的导出推文工具每次保存 20 条,可存为 CSV、Excel 或 JSON,包含浏览量、点赞、书签和 X 的标签,共 25 列。无需注册,也不用装扩展;在下面输入一个账号名就能试。

导出推文:任意账号最新的 20 条帖子

免费,无需注册,无需扩展。CSV、Excel 或 JSON,共 25 列:正文、日期、浏览量、点赞、转发、回复、书签、媒体链接和 X 的标签。

提交后会打开免费的导出推文工具,并填好该账号。

一个账号写过的每一条帖子,是更大的任务,有五个数字决定某条路能不能做到:

  • 能回溯多远。 X 自己的用户时间线接口只返回最新的 3,200 条帖子。
  • 每 1,000 条帖子的价格。 官方 X API 每条帖子收费 $0.005,所以 1,000 条帖子是 $5.00。
  • 需要你准备什么。 官方 X API 需要开发者账号、应用和预付额度。
  • 跑得多快。 很长的历史要几百上千次请求,所以每秒请求数很重要。
  • 会让什么面临风险。 通过你已登录的 X 会话读取的工具,可能让该账号因自动化行为被标记,所以有些工具建议用备用账号来导出。

#用 Sorsa API 下载每一条帖子

要下载任意公开账号的全部历史,用 Sorsa API,一款 Twitter(X)API 与爬虫:POST /user-tweets 翻遍整条时间线,没有 3,200 条上限,每次请求 20 条帖子,每 1,000 条帖子 $0.07 起,而官方 X API 是 $5.00。

另外三个数字它也满足。Sorsa API 只需一个 API 密钥,不用开发者账号,所有套餐(包括免费账号)每秒 20 次请求,并且从不索取你的 X 登录信息或 Cookie,所以下载不会牵涉你的任何 X 账号。

通过 Sorsa API 有四条路径,用同一个密钥和同样的 100 次免费请求;免费工具根本不需要密钥,而 X 的存档只覆盖你登录的那个账号。

方式适用场景你能得到什么费用
API Playground 中的 Sorsa API一个账号的所有帖子,无需写代码每页 20 条帖子,可存为 CSV、Excel 或 JSON前 2,000 条帖子免费,之后每 1,000 条 $0.07 起
Sorsa API,POST /user-tweets所有帖子,用代码或按计划执行整条时间线,每次请求 20 条帖子前 2,000 条帖子免费,之后每 1,000 条 $0.07 起
Sorsa API,POST /search-tweets账号的某一段时间两个日期之间的帖子,可回溯到 2006 年每 1,000 条 $0.07 起
Sorsa API,POST /tweet-info-bulk你已有链接的帖子每次请求最多 100 条帖子每 1,000 条 $0.014 起
导出推文工具最新 20 条帖子,一次性含 20 条帖子的一个文件免费
X 的数据存档你自己账号的全部内容HTML 和 JSON 的 .zip,含私信免费;X 说可能要几天
  • API Playground 中的 Sorsa API

    适用场景
    一个账号的所有帖子,无需写代码
    你能得到什么
    每页 20 条帖子,可存为 CSV、Excel 或 JSON
    费用
    前 2,000 条帖子免费,之后每 1,000 条 $0.07 起
  • Sorsa API,POST /user-tweets

    适用场景
    所有帖子,用代码或按计划执行
    你能得到什么
    整条时间线,每次请求 20 条帖子
    费用
    前 2,000 条帖子免费,之后每 1,000 条 $0.07 起
  • Sorsa API,POST /search-tweets

    适用场景
    账号的某一段时间
    你能得到什么
    两个日期之间的帖子,可回溯到 2006 年
    费用
    每 1,000 条 $0.07 起
  • Sorsa API,POST /tweet-info-bulk

    适用场景
    你已有链接的帖子
    你能得到什么
    每次请求最多 100 条帖子
    费用
    每 1,000 条 $0.014 起
  • 导出推文工具

    适用场景
    最新 20 条帖子,一次性
    你能得到什么
    含 20 条帖子的一个文件
    费用
    免费
  • X 的数据存档

    适用场景
    你自己账号的全部内容
    你能得到什么
    HTML 和 JSON 的 .zip,含私信
    费用
    免费;X 说可能要几天

#不写代码下载每一条推文

API Playground 通过表单发送 Sorsa API 请求:选择 User Tweets,输入账号名,运行,再把帖子导出为 CSV、Excel 或 JSON。它适合一次性的下载,写脚本就有点小题大做。

  1. 创建免费账号。 注册后,在控制台复制你的 API 密钥。前 100 次请求免费,无需绑卡。

  2. 打开 Playground。 进入 API Playground,把密钥粘贴到顶部。

  3. 选择 User Tweets。 输入账号名,不带 @。

  4. 设置页数。 每页是一次请求、20 条帖子,所以 100 页能取回 2,000 条帖子。运行之前,Playground 会先显示费用。

  5. 运行并导出。 把结果切换成 CSV、Excel 或 JSON,保存文件。

对于有多年历史的账号,按日期拆分任务:在同一个 Playground 里运行 Search Tweets,使用 from: 和日期范围,每次一年,具体做法见下面关于 3,200 条上限的章节。

#用 API 下载全部推文,分步说明

在代码里,整个下载就是围绕 Sorsa API 的 POST /user-tweets 的一个循环:一个密钥放在 ApiKey 请求头里,每次请求 20 条帖子,再用 cursor 一路翻页回到账号的第一条帖子。cursor 是 API 随每页返回的书签;把它放进下一次请求,就会返回它后面的那一页。

  1. 获取密钥。 注册后,在控制台复制密钥。不用开通开发者账号,不用 OAuth,也不用审批。

  2. 估一下任务规模。 GET /info(在新标签页打开) 返回带有 tweets_count 的用户资料;把它除以 20,就是请求次数。

    终端
    curl -G "https://api.sorsa.io/v3/info" \
      -H "ApiKey: YOUR_API_KEY" \
      --data-urlencode "username=northfield_climatelab"
    
  3. 请求第一页。 把账号名以 JSON 发送到 POST /user-tweets(在新标签页打开)。也可以用用户 ID 或主页链接代替账号名。

    终端
    curl -X POST "https://api.sorsa.io/v3/user-tweets" \
      -H "ApiKey: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"username": "northfield_climatelab"}'
    
    响应200 OK
    {
      "tweets": [
        {
          "id": "2116531887928250368",
          "full_text": "October was our warmest month on record. #climatedata",
          "created_at": "2026-10-31T14:05:00Z",
          "lang": "en",
          "likes_count": 812,
          "retweet_count": 240,
          "reply_count": 61,
          "quote_count": 38,
          "view_count": 96400,
          "bookmark_count": 410,
          "is_reply": false,
          "is_quote_status": false,
          "entities": [
            {
              "type": "photo",
              "link": "https://pbs.twimg.com/media/Gx1nQ7aW8AAzk3T.jpg"
            }
          ],
          "user": {
            "username": "northfield_climatelab",
            "display_name": "Northfield Climate Lab",
            "followers_count": 48900,
            "tweets_count": 12400
          }
        }
      ],
      "next_cursor": "DAABCgABG8vZ0Qm__-oKAAIbuv3MBVvA0AgAAwAAAAIAAA"
    }
    
  4. 沿着 cursor 往下翻。 把每次得到的 next_cursor 放进下一次请求的请求体。响应里没有 cursor 就是最后一页:时间线已经完整。

    POST /user-tweets handle + cursor 写入 20 行 到 tweets.csv 保存游标 到 .cursor 文件 没有游标了 文件已完整 用保存的游标重复 中途停了?再运行脚本:它读取保存的游标并继续。
    每翻一页就保存一次 cursor,中断的下载就能接着上次的位置继续,而不是从头开始。
  5. 边收边写。 下面的脚本把每一页追加到 CSV,把媒体链接放在单独一列,并在每页之后保存 cursor,所以中断的运行可以接着上次的位置继续。

    import csv
    import os
    import time
    
    import requests
    
    API = "https://api.sorsa.io/v3/user-tweets"
    HEADERS = {"ApiKey": "YOUR_API_KEY"}
    FIELDS = ["id", "created_at", "full_text", "lang", "likes_count",
              "retweet_count", "reply_count", "quote_count", "view_count",
              "bookmark_count", "is_reply", "in_reply_to_username", "media"]
    
    
    def download(username, out="tweets.csv"):
        state = out + ".cursor"
        cursor = open(state).read().strip() if os.path.exists(state) else None
        first_run = not os.path.exists(out)
        with open(out, "a", newline="", encoding="utf-8") as f:
            rows = csv.DictWriter(f, FIELDS, extrasaction="ignore")
            if first_run:
                rows.writeheader()
            while True:
                body = {"username": username}
                if cursor:
                    body["next_cursor"] = cursor
                r = requests.post(API, headers=HEADERS, json=body, timeout=60)
                if r.status_code == 429:  # over 20 requests in a second
                    time.sleep(1)
                    continue
                r.raise_for_status()  # 403: key missing, wrong or used up
                page = r.json()
                for t in page.get("tweets") or []:
                    media = [e["link"] for e in t.get("entities") or []
                             if e.get("type") in ("photo", "video")]
                    rows.writerow({**t, "media": " ".join(media)})
                f.flush()
                cursor = page.get("next_cursor")
                if not cursor:
                    break
                with open(state, "w") as s:
                    s.write(cursor)
        if os.path.exists(state):
            os.remove(state)
    
    
    download("northfield_climatelab")
    

回复和转发

默认情况下,POST /user-tweets 返回账号自己发的帖子。在请求体中加上 "with_replies": true 可以包含它的回复,或者把 "type" 设为 "replies" 或 "retweets",只下载这两类。转发的帖子会在 retweeted_status 下完整附带原帖。

返回 403 表示密钥缺失、有误或请求次数已用完;429 表示一秒内请求超过 20 次,所以脚本会等一秒再重试。失败的请求从不收费,其余每个接口的重试和翻页做法,见 Python 版 Twitter API 指南。

#如何获取某个用户超过 3,200 条的推文

用没有上限的接口:3,200 条的限制属于官方 X API 的用户时间线,它只返回账号最近的 3,200 条帖子,而 Sorsa API 的 POST /user-tweets 会一直往前翻到第一条帖子。

这个数字出自 X 自己的时间线文档(在新标签页打开):“Up to 3,200 most recent Posts”(最多最近 3,200 条帖子)。同一份文档还列出了按量付费客户可用的、可回溯到 2006 年 3 月的全量存档搜索(在新标签页打开),每条帖子 $0.005,需要开发者账号和应用。所以这个上限是某一个接口的属性,不是 X 数据本身的属性,那些把 3,200 说成所有工具都过不去的墙的指南,说的只是那个接口。

示例账号:1.24 万条推文,2011 至 2026 年 官方 X API 用户时间线 8,200 条更早推文,永不返回 最新 3,200 条 Sorsa API POST /user-tweets 全部 1.24 万条,一直到第一条 3,200 条上限 2011 2014 2017 2020 2023 2026 更早的在左,最新的在右
在一个有 1.24 万条帖子的账号上,官方 X API 的时间线在最新的 3,200 条之后就停了;Sorsa API 的时间线一直走到第一条。

Sorsa API 出售整段历史,价格与最新一页相同:一个有 1.24 万条帖子的账号是 620 次请求,$0.87 起。官方 X API 的全量存档搜索对同样的帖子要收 $62.00,并且每月读取 300 万条帖子后就停了。

按日期下载某一段时间

只下载历史的一部分时,按日期搜索账号:POST /search-tweets(在新标签页打开) 配合 from:、since: 和 until:,返回该账号在两个日期之间的帖子,可回溯到 2006 年,每次请求 20 条,同样使用 cursor。

请求体
{
  "query": "from:northfield_climatelab since:2019-01-01 until:2020-01-01",
  "order": "latest"
}

每年一个时间窗口,能让每次运行都较短,也便于重试。加上 filter:media 只保留带照片或视频的帖子,或者加上 -filter:replies 去掉回复;其余运算符见 Twitter 搜索运算符指南。至于搜索所有账号中某个主题可回溯到 2006 年的帖子,是另一类任务,见推特历史数据。

#完整下载要花多少钱

完整下载每 20 条帖子算一次请求:一个有 1.24 万条帖子的账号要 620 次请求,在 Sorsa API 上 $0.87 起,而官方 X API 对同样的帖子按每条 $0.005 收费 $62.00。

不管规模多大,Sorsa API 都是每 1,000 条帖子 $0.07 起,官方是 $5.00,而且 100 次免费请求可以覆盖任何不超过 2,000 条帖子的账号。

账号的帖子数请求次数Sorsa API,起官方 X API
3,200160$0.22$16.00
1.24 万620$0.87$62.00
5 万2,500$3.50$250.00
20 万1 万$14.00$1,000.00
  • 3,200

    请求次数
    160
    Sorsa API,起
    $0.22
    官方 X API
    $16.00
  • 1.24 万

    请求次数
    620
    Sorsa API,起
    $0.87
    官方 X API
    $62.00
  • 5 万

    请求次数
    2,500
    Sorsa API,起
    $3.50
    官方 X API
    $250.00
  • 20 万

    请求次数
    1 万
    Sorsa API,起
    $14.00
    官方 X API
    $1,000.00

输入任意用户资料页上的帖子数,就能估出你自己这次下载的价格。

X 个人主页上名字下方显示的数字。或选一个:

$62.00
官方 X API
每 1,000 条帖子 $5.00,通过全量归档搜索:其用户时间线只到最新的 3,200 条为止
低至 $0.87
on Sorsa API
620 次请求,每次 20 条帖子,6% 占 Starter 套餐的 10K / 月

你的 100 次免费请求可覆盖前 2,000 条帖子,占该账号的16%。

免费占比和两个价格会随你输入更新;每次请求的帖子数固定为 20。

你按请求付费,而不是按帖子:一页 20 条和最后一页 3 条,价格相同,失败的请求不收费。Starter 每月 1 万次请求,可覆盖 20 万条帖子,各档套餐每 1,000 次请求的价格见价格页面。

每个账号的分页只能一页接一页地进行,因为每次请求都需要上一次请求返回的 cursor。多个账号可以并行下载,每个密钥所有套餐(包括免费账号)最高每秒 20 次请求。

#文件的每一行包含什么

每条帖子以一个 JSON 对象返回,带有文本、日期、计数、媒体和作者,所以一行 CSV 不需要第二次请求。下面的字段就是上面脚本写入的那些,取自在线 API 参考文档。

字段含义示例
id帖子的 ID,字符串类型;保持为文本,免得电子表格把它四舍五入"2116531887928250368"
created_at发布时间,UTC 的 ISO 8601 格式"2026-10-31T14:05:00Z"
full_text完整文本,长帖子也包含在内"October was our warmest..."
likes_count、retweet_count、reply_count、quote_count互动计数812
view_count、bookmark_count浏览量和书签数96400
is_reply、in_reply_to_username帖子是否是回复某人,以及回复的是谁false
quoted_status、retweeted_status被引用或被转发的帖子,完整内容一个对象
entities照片、视频和链接,每项带 type 和 link"photo"
made_with_ai、paid_partnershipX 对帖子的标签false
user作者的完整资料一个对象
  • id

    含义
    帖子的 ID,字符串类型;保持为文本,免得电子表格把它四舍五入
    示例
    "2116531887928250368"
  • created_at

    含义
    发布时间,UTC 的 ISO 8601 格式
    示例
    "2026-10-31T14:05:00Z"
  • full_text

    含义
    完整文本,长帖子也包含在内
    示例
    "October was our warmest..."
  • likes_count、retweet_count、reply_count、quote_count

    含义
    互动计数
    示例
    812
  • view_count、bookmark_count

    含义
    浏览量和书签数
    示例
    96400
  • is_reply、in_reply_to_username

    含义
    帖子是否是回复某人,以及回复的是谁
    示例
    false
  • quoted_status、retweeted_status

    含义
    被引用或被转发的帖子,完整内容
    示例
    一个对象
  • entities

    含义
    照片、视频和链接,每项带 type 和 link
    示例
    "photo"
  • made_with_ai、paid_partnership

    含义
    X 对帖子的标签
    示例
    false
  • user

    含义
    作者的完整资料
    示例
    一个对象

CSV 可以直接在 Excel 和 Google Sheets 里打开;Node.js 标签页生成的 JSON Lines 文件则适合 notebook 和 AI 数据集。想让表格按计划保持更新,见如何把 Twitter 数据导出到 Google Sheets。

须知

下载只涵盖公开帖子。受保护账号的帖子、已删除的帖子,以及谁点赞了某条帖子、某个账号点赞或收藏了什么的列表,在 X 上都是私密的,所以没有任何 API 能返回它们。你下载之后才被删除的帖子,仍会保留在你的文件里。

#如何下载 X 账号的全部媒体

用 POST /user-tweets 读取账号的帖子,并保存每个 type 为 photo 或 video 的 entity:每一个都带有指向文件的直接 link,所以保存文本的那个循环也可以顺便保存媒体。

Python
import os

import requests


def save_media(tweets, folder="media"):
    os.makedirs(folder, exist_ok=True)
    for t in tweets:
        for e in t.get("entities") or []:
            if e.get("type") not in ("photo", "video"):
                continue
            name = t["id"] + "-" + e["link"].split("/")[-1].split("?")[0]
            data = requests.get(e["link"], timeout=60).content
            with open(os.path.join(folder, name), "wb") as f:
                f.write(data)

在下载循环里,对每一页的 tweets 调用它即可。开始之前,GET /info 会报告账号的 media_count,让你知道大概会有多少个文件。

每个 entity 还带一个 preview,是缩略图,如果你只想看看发了什么,可以保存它而不用保存完整视频。像代码片段那样用帖子 ID 给每个文件命名,以后就能把媒体文件夹和 CSV 对应起来,因为每一行的 media 列列出的是同样的链接。想下载某一条帖子的媒体,把它的链接粘贴到免费的媒体下载器;更大规模的媒体任务,见用 API 下载推特媒体指南。

把最多 100 个帖子链接或 ID 发送到 POST /tweet-info-bulk(在新标签页打开),所有帖子一次请求就返回,每 1,000 条帖子 $0.014 起:比官方 X API 的 $5.00 便宜 250 倍。

终端
curl -X POST "https://api.sorsa.io/v3/tweet-info-bulk" \
  -H "ApiKey: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tweet_links": [
        "https://x.com/northfield_climatelab/status/2116531887928250368",
        "2115035779691450372"]}'

适用于手动收集的帖子、报告背后的信息来源,或值得保存的一串对话。链接可以是完整的 x.com 或 twitter.com 地址,也可以只是 ID,两者可以放在同一个列表里;一千条保存的帖子只需 10 次请求。每条帖子返回的字段与时间线页面相同,包含作者。

帖子对你重要的话,发现当天就保存。指向已删除或已转为受保护的帖子的链接就是不会返回,批次中的其余内容照常返回,而在 X 上被删除的帖子,之后任何人都取不回来了。

#如何下载你自己的全部推文

对你自己的账号,申请 X 的存档:它免费,包含你从第一条起的所有帖子,以及私信、媒体、粉丝和列表,以 HTML 和 JSON 文件打包成 .zip。X 帮助中心(在新标签页打开)给出的步骤如下:

  1. 打开你的 X 数据。 依次进入“设置和隐私”、“账号”,再进入“你的 X 数据”。

  2. 验证是你本人。 输入 X 发到你邮箱或手机的验证码。

  3. 申请数据。 在“下载你的数据”下,点击 X 旁边的“申请数据”。

  4. 下载 .zip。 文件准备好后,X 会通过邮件发给你链接,或者发送推送通知;它的帮助页面说,这可能需要几天。

存档回答的是“我发过的一切”。如果你今天就需要把自己的公开帖子导成电子表格,浏览量和书签数各占一列,就对你自己的账号名运行上面的 API 步骤:同样每次请求 20 条帖子,不用等邮件。

#今天就下载你的第一个账号

任何公开账号的每一条帖子,都只需要一个账号名和一个循环。Sorsa API 每次请求返回 20 条帖子,没有 3,200 条上限,每 1,000 条 $0.07 起,官方 X API 是 $5.00,前 2,000 条帖子免费。先从你现在需要的账号开始,再并行加入下一个,每秒 20 次请求;从 X 拉取推文、粉丝和用户资料的指南用同样的方式涵盖了其他各类下载。

#常见问题

能下载别人账号的全部推文吗?

可以,任何公开账号都行。Sorsa API 的 POST /user-tweets 接收账号名,返回时间线上的每一条帖子,每次请求 20 条,不需要账号本人的许可,因为这些帖子在 X 上是公开的。受保护的账号只向它批准的粉丝显示帖子,所以无法下载,而对这类账号返回空结果的请求不收费。

有没有免费下载某个用户全部推文的办法?

有,三种。免费的导出推文工具无需注册,就能保存账号最新的 20 条帖子。每个 Sorsa API 账号起步就有 100 次免费请求,足够下载任何公开账号的前 2,000 条帖子,无需绑卡,也没有期限。对你自己的账号,X 的存档免费且完整,只是 X 说可能要几天才能收到。

下载某个用户的全部推文该用哪个 API?

用 Sorsa API。它的 POST /user-tweets 每次请求返回 20 条帖子,没有 3,200 条上限,每 1,000 条帖子 $0.07 起,而官方 X API 每 1,000 条收费 $5.00,并且用户时间线在最近的 3,200 条帖子就停了。Sorsa API 只需一个 API 密钥,不用开发者账号和 OAuth,所有套餐都是每秒 20 次请求。

能下载私密账号的推文吗?

不能。受保护账号的帖子只有它批准的粉丝才能看到,所以没有任何 API 能返回它们,官方 X API 也不例外。Sorsa API 只读取公开数据,从不索取任何人的 X 登录信息,对受保护账号的请求如果返回为空,也不收费。

能下载别人的点赞或书签吗?

不能。X 把账号点赞过的帖子和它的书签都设为私密,所以没有 API 能返回它们。你能下载的,是每条帖子上的点赞数和书签数,即 likes_count 和 bookmark_count,以及通过 GET /info 获取账号点赞过的帖子总数 favourites_count。

账号会知道我下载了它的推文吗?

不会。通过 Sorsa API 读取公开帖子,不会给账号发送任何内容,也不会用到你的任何 X 账号:请求是从你的密钥发到 Sorsa API 的。账号的通知里不会出现任何东西,你自己的 X 账号也不会牵涉其中。

#我们如何核实

2026 年 11 月 2 日,我们依据在线 Sorsa API 参考文档写出了本指南中的每个请求,并逐一对照它核对了每个接口、请求体字段、每页条数和响应字段。响应是按该参考文档所述结构裁剪的示例,针对一个虚构账号;本文没有用在线密钥运行它们。X 的 3,200 条上限、价格和存档步骤,来自同一天阅读的 docs.x.com 和 X 帮助中心,所有成本都是用 Sorsa API 每 1,000 次请求 $1.40 和 X 每条帖子 $0.005 算出来的。

Sorsa API 团队撰写。 我们开发和运营 Sorsa API,这是只读的 Twitter/X API 与爬虫,2022 年起运行于生产环境(前身为 TweetScout API),累计处理请求超 60 亿次。 关于 Sorsa API

更新内容
  • 全文重写,先给答案。3,200 条上限追溯到 X 自己的文档,新增通过 API Playground 的免费无代码方式、可断点续传的 Python 和 Node.js 脚本、适用于任意账号规模的成本估算器、媒体文件和按链接保存帖子的章节,所有价格均已对照 docs.x.com 核实。
  • 首次发布。