WEIR

批量下载推特推文:导出某人的全部推文到 CSV(2026)

批量下载推特推文有两条路:自己的账号申请 X 数据存档,别人的公开账号用 Python 按年份搜索,一直查到 2006 年,存成 CSV。附实测输出和费用。


发布于 · 更新于 · 阅读约 7 分钟 · Read in English · 日本語で読む

封面图:一个账号的全部推文

批量下载推特推文,自己的账号用 X 数据存档,别人的公开账号就按年份搜索,存进 CSV。

这篇写给要把某个 X(推特)账号的全部推文放进表格的研究者、运营和开发者。你会看到存档的申请步骤、一个 Python 脚本和真实费用。示例里的 API 是我们做的 Weir,读我们的观点时请记住这一点。

这条命令导出一个账号一整年的推文:

curl --request POST \
  --url https://api.weirapp.io/v1/x/search \
  --header "Authorization: Bearer $WEIR_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{"fromUsers":["jack"],"since":"2006-01-01T00:00:00Z","until":"2007-01-01T00:00:00Z","limit":20}'

整个流程:

  1. 先看是谁的推文自己的?X 数据存档比任何 API 都全。
  2. 拿到 Key注册,复制 Key,设置 WEIR_API_KEY。
  3. 搜索一年fromUsers 加上 since 和 until。
  4. 翻到最后一页把 meta.nextCursor 传回,直到它为 null。
  5. 逐年写进 CSV一个文件,每条推文一行。

第 1 步:下载自己的推文,用 X 数据存档

推文是你自己的,就不用 API。X 会免费给你的账号打包一份完整存档。

X 帮助中心列出的步骤:

  1. 打开“设置和隐私”,再点“你的账号”。
  2. 选“下载你的数据存档”,用验证码确认身份。
  3. 提交申请。X 说准备存档可能需要几天。
  4. 下载 ZIP,链接在 X 发来的邮件或推送里。

ZIP 里是 HTML 和 JSON 文件,还有一个“你的存档”页面,在电脑浏览器里打开就能看。它包括你的推文、媒体和私信。

想把推文变成表格,把 ZIP 拖进我们免费的推特存档查看器。它在浏览器里直接导出 CSV,不上传任何文件。

这个办法只对你登录的账号有效。要导出别人的推文,接着往下看。

第 2 步:拿到 Key,先搜一年的推文

免费注册,不用绑卡,在 API keys 里创建一个 Key,然后设置好:

pip install requests
export WEIR_API_KEY="weir_live_..."

Weir 的搜索用 fromUsers 指定账号,用 since 和 until 指定日期。since 包含当时,until 不包含。

import csv, os, sys, time, requests

API = "https://api.weirapp.io/v1/x/search"
HEADERS = {"Authorization": f"Bearer {os.environ['WEIR_API_KEY']}"}

body = {"fromUsers": ["jack"], "since": "2006-01-01T00:00:00Z",
        "until": "2007-01-01T00:00:00Z", "limit": 20}
r = requests.post(API, headers=HEADERS, json=body, timeout=60)
for post in r.json()["data"]:
    print(post["createdAt"][:10], post["id"], post["text"][:60])
print("credits:", r.headers["x-credits-charged"])

搜索能查到 X 最早的那几天。2026 年 10 月 21 日,我们对 X 联合创始人 @jack 跑了这段代码,把 until 设为 2006 年 3 月 22 日。用 limit: 3,第二页里就是第 20 号推文:

{
  "id": "20",
  "text": "just setting up my twttr",
  "url": "https://x.com/jack/status/20",
  "createdAt": "2006-03-21T20:50:14.000Z",
  "author": { "username": "jack", "followersCount": 12533336 },
  "likeCount": 311641,
  "retweetCount": 124594
}

这是 X 上第一条公开推文,返回的格式和今天的推文一模一样。

id 要按字符串保存,现在的推文 ID 太大,浮点数存不下。

第 3 步:用 cursor 把一年翻到底

X 每次大约给 20 条。每个响应都带 meta.nextCursor,原样传回去就是下一页。

只有 null 表示结束:

def year_of_posts(user, year, max_pages=200):
    body = {"fromUsers": [user], "limit": 20, "since": f"{year}-01-01T00:00:00Z",
            "until": f"{year + 1}-01-01T00:00:00Z"}
    for _ in range(max_pages):
        r = requests.post(API, headers=HEADERS, json=body, timeout=60)
        if r.status_code == 429:  # 太快了:等一会儿,重试同一页
            time.sleep(int(r.headers.get("Retry-After", "5")))
            continue
        r.raise_for_status()  # 402 表示积分用完:停止
        page = r.json()
        yield from page["data"]
        body["cursor"] = page["meta"]["nextCursor"]
        if not body["cursor"]:
            return

我们翻 @jack 的那次,结尾和每次一样。第 20 号推文之后,下一次调用返回空:

{ "data": [], "meta": { "nextCursor": null } }

最后这次调用扣了 1 积分。三次调用加起来 7 积分,拿到 4 条推文。

第 4 步:导出某人的全部推文到一个 CSV

从今年往回循环每一年,每条推文写成一行。用 python all_tweets.py XDevelopers 运行:

FIELDS = ["id", "createdAt", "text", "likeCount", "retweetCount",
          "replyCount", "viewCount", "url"]
user = sys.argv[1]

with open(f"{user}.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=FIELDS, extrasaction="ignore")
    writer.writeheader()
    for year in range(2026, 2005, -1):  # 一直到 2006 年,X 的第一年
        for post in year_of_posts(user, year):
            writer.writerow(post)
        file.flush()  # 中途停了,已完成的年份也都保存着

把三段 Python 按顺序放进一个文件,就是完整的脚本。

账号注册之前的年份会返回空,每年扣 1 积分。extrasaction="ignore" 只保留你列出的列,其余丢掉。

搜索结果包括原创推文和回复。不要回复,就在请求体里加 "onlyOriginal": True。

截至 2026 年 10 月,搜索结果默认也包括转推。转推的 likeCount 是 0,真实计数在 retweetedPost 里。只要原创推文,就在 query 里加 -filter:nativeretweets。更多筛选写法见推特高级搜索语法大全。

推特 API 能导出一个用户的全部推文吗?

能,但不是通过时间线接口。X 的文档写明,用户推文时间线最多返回最近 3,200 条。很多老脚本卡在 3,200 条,原因就在这里。

X 的全量搜索没有这个上限。X 的搜索文档说,它能回溯到 2006 年 3 月,每次请求最多 500 条。

它向 X 的按量计费账号开放。截至 2026 年 10 月,每读一条推文 $0.005,所以 3,200 条要 $16。

用 Tweepy 调用官方 API 的代码,见用 Python 获取推特数据。

下载 3,200 条推文要多少钱?

在 Weir 上,一次搜索扣 1 积分,每条推文再扣 1 积分。满满一页 20 条是 21 积分。

下载一个账号的 3,200 条推文
X 官方 API$16
Weir,$5 套餐约 $0.68
TwitterAPI.io约 $0.48

3,200 条推文要翻 160 页,每年再加一次收尾调用,合计大约 3,400 积分。

这在 Weir 每月 5,000 免费积分之内,所以第一个这样的账号不花钱。更大的任务,用推特 API 费用计算器先估一下。

时间也要算进去:

21积分,一整页 20 条推文
15页,免费档每分钟能搜的页数
12 分钟免费档导出 3,200 条推文

免费档每分钟 30 个请求,一次搜索算 2 个。碰到上限时,脚本里处理 429 的那段会自动等待。

不写代码:让 AI 智能体帮你导出

在 Claude、Cherry Studio 或 Trae 里接上 Weir 之后,粘贴这段:

用 Weir 的 search_x 工具,查 @XDevelopers 在 2026-10-01 到 2026-10-20 之间发的原创推文,limit 设为 20,一直翻页到 nextCursor 为 null。整理成表格:日期、点赞数、链接、推文内容的中文概要。

智能体会自己翻页,把结果整理成表格。少量推文这样最快,几千条以上还是用上面的脚本。接法见推特 MCP 服务器。

导出失败怎么办?

  • 返回 402,脚本停了:积分用完了,重试没用。等下个月的免费额度,或者买一个套餐。
  • 翻到第二页返回 400:请求体变了。不带 cursor,把那一年从头再跑一遍。
  • 脚本跑到一半停了:把文件里最后一个 id 放进推文 ID 转日期,从那一年重新开始。
  • Excel 把 ID 显示成 2.0E+18:那只是显示方式。导入时把 id 列设为文本。

受保护的账号无法导出,它们的推文永远不会出现在搜索里。

X 的服务条款禁止未经 X 书面许可的抓取。Weir 只读公开数据,不能发推。你的项目是否符合适用的条款,需要你自己判断,本文不构成法律建议。

什么时候不适合用 Weir

  • 是你自己的账号:数据存档免费、完整,连私信都有。
  • 只看批量价格:TwitterAPI.io 标价每千条 $0.15,低于我们的付费价,还能发推和推送实时数据流。
  • 你需要和 X 签合同:用官方 API 的全量搜索。

常见问题

能免费导出一个人的全部推文吗?

自己的账号可以,在 X 设置里申请数据存档。公开账号的话,Weir 每月 5,000 免费积分大约够导出 4,700 条推文。X 官方 API 读推文没有免费档。

不是我的推特账号,也能批量下载推文吗?

账号公开就可以。用 fromUsers 一年一年地搜,每一年都翻到底。受保护账号的推文只有被批准的关注者能看,任何 API 都拿不到。

为什么我的推特爬虫只能抓到 3,200 条?

因为它读的是用户时间线,X 的文档把它限制在最近 3,200 条。按日期搜索能走得更远:我们一直查到了 @jack 在 2006 年 3 月的第一条推文。

用 Python 怎么把推文导出成 CSV?

用 csv.DictWriter,加上 extrasaction="ignore" 和 encoding="utf-8"。每条推文写一行,每年结束时 flush 一次。第 4 步的脚本就是这么做的。

参考来源

以下均为英文页面。