下载 X 上某个用户的全部推文
要下载 X 账号的全部推文,需要翻遍它的时间线并把每一页存成 CSV;X 自己的时间线接口只返回最新的 3,200 条帖子,所以想拿到完整历史,就要用没有这个上限的接口。
简短回答: 用 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 列。无需注册,也不用装扩展;在下面输入一个账号名就能试。
提交后会打开免费的导出推文工具,并填好该账号。
一个账号写过的每一条帖子,是更大的任务,有五个数字决定某条路能不能做到:
- 能回溯多远。 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。它适合一次性的下载,写脚本就有点小题大做。
-
创建免费账号。 注册后,在控制台复制你的 API 密钥。前 100 次请求免费,无需绑卡。
-
打开 Playground。 进入 API Playground,把密钥粘贴到顶部。
-
选择 User Tweets。 输入账号名,不带 @。
-
设置页数。 每页是一次请求、20 条帖子,所以 100 页能取回 2,000 条帖子。运行之前,Playground 会先显示费用。
-
运行并导出。 把结果切换成 CSV、Excel 或 JSON,保存文件。
对于有多年历史的账号,按日期拆分任务:在同一个 Playground 里运行 Search Tweets,使用 from: 和日期范围,每次一年,具体做法见下面关于 3,200 条上限的章节。
#用 API 下载全部推文,分步说明
在代码里,整个下载就是围绕 Sorsa API 的 POST /user-tweets 的一个循环:一个密钥放在 ApiKey 请求头里,每次请求 20 条帖子,再用 cursor 一路翻页回到账号的第一条帖子。cursor 是 API 随每页返回的书签;把它放进下一次请求,就会返回它后面的那一页。
-
获取密钥。 注册后,在控制台复制密钥。不用开通开发者账号,不用 OAuth,也不用审批。
-
估一下任务规模。
GET /info(在新标签页打开) 返回带有tweets_count的用户资料;把它除以 20,就是请求次数。终端 curl -G "https://api.sorsa.io/v3/info" \ -H "ApiKey: YOUR_API_KEY" \ --data-urlencode "username=northfield_climatelab" -
请求第一页。 把账号名以 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" } -
沿着 cursor 往下翻。 把每次得到的
next_cursor放进下一次请求的请求体。响应里没有 cursor 就是最后一页:时间线已经完整。每翻一页就保存一次 cursor,中断的下载就能接着上次的位置继续,而不是从头开始。 -
边收边写。 下面的脚本把每一页追加到 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 说成所有工具都过不去的墙的指南,说的只是那个接口。
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,200 | 160 | $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 个人主页上名字下方显示的数字。或选一个:
你的 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_partnership | X 对帖子的标签 | 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,所以保存文本的那个循环也可以顺便保存媒体。
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 帮助中心(在新标签页打开)给出的步骤如下:
-
打开你的 X 数据。 依次进入“设置和隐私”、“账号”,再进入“你的 X 数据”。
-
验证是你本人。 输入 X 发到你邮箱或手机的验证码。
-
申请数据。 在“下载你的数据”下,点击 X 旁边的“申请数据”。
-
下载 .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 算出来的。