作者:Sorsa 编辑部
更新于 2026 年 7 月:新增从 100 次免费请求开始使用的说明;成本改为按每 1,000 条推文计算;并根据最新文档重新核实官方 X API 价格及时间线最多返回 3,200 条推文的限制。
核心要点: 下载一个公开 Twitter/X 账号的全部推文有四种方式:你自己的 Twitter 数据存档(仅限你本人账号)、无代码导出工具、开源爬虫,或数据 API。官方 X API 把用户时间线限制在 3,200 条帖子以内,所以要拿到完整历史,可分页的数据 API 才是可行之路。
每周都会有研究人员、分析师或开发者遇到同一个难题:他们需要某个账号的完整推文历史,但平台很难直接提供。免费存档只包含自己发布的帖子,多数无代码工具最多返回 3,200 条推文,开源爬虫又会在 X 修改前端后失效。Sorsa API 是 Twitter/X API 的替代服务,没有这项限制。其 /user-tweets 接口可以逐页拉取完整时间线,直至用户发布的第一条帖子。认证只需在请求头中加入一个 API 密钥,并按请求而非按资源计费。对于一个发布过 5 万条推文的账号,使用 Pro 套餐下载完整记录不到 5 美元,约两分钟即可完成。
我们既开发也运营这个 API,并拿这些方法逐一对照实时接口做测试,所以下面的取舍来自实际运行,而非凭空猜测。
想马上开始,又不想写代码? 浏览器版 API playground 无需密钥即可对任意公开账号运行 /user-tweets 接口,让你在编写代码之前先查看一页真实的时间线结果。若要重复执行或大规模导出,可使用下文的方法。
目录
- 方法 1:下载你自己的 Twitter/X 数据存档
- 方法 2:无代码浏览器导出工具
- 方法 3:开源爬虫
- 方法 4:使用 Twitter/X 数据 API
- 你该用哪种方法?
- 如何通过 API 下载全部推文,分步详解
- 如何从一个用户那里拿到超过 3,200 条推文?
- 下载完整时间线要花多少钱?
- 实战:那些让其他方法失灵的账号
- 常见问题
- 如何开始
方法 1:下载你自己的 Twitter/X 数据存档
X 允许你免费下载自己账号的完整存档。导出内容包括你发过的每一条推文、你的媒体、私信以及账号元数据,没有推文数量上限。它只对你已登录的账号有效;你无法申请他人账号的存档。
申请方式:打开设置与隐私,进入你的账号,再选下载你数据的存档。验证身份、提交申请,然后等待。X 通常会在 24 到 48 小时内准备好,并把一个 .zip 文件的链接发到你邮箱。压缩包里有一个 HTML 查看器,外加一个 data/ 文件夹,里面是保存你完整发帖历史和媒体的 JSON 文件。
除了“仅限本人账号”这一限制外,另一个难点是文件格式。这些 JSON 文件采用 Twitter 特有的嵌套结构,并不是整理好的电子表格;要进行分析,必须编写解析器或先做一次格式转换。
最适合: 个人备份、注销前存档自己的账号,以及合规留档。
方法 2:无代码浏览器导出工具
浏览器版导出工具让你无需写代码就能把某个公开账号的推文下载为 CSV 或 Excel。输入用户名并等待处理后,即可下载包含推文文本、时间戳和互动指标的文件。这类工具大多基于官方 X API,因此同样最多只能获取 3,200 条推文,有时返回的还会更少。
这一类包括 Circleboom、Tweet Binder,以及一批 Chrome 扩展。它们的主要差别在于输出格式和定价,而非底层上限。
| 工具 | 推文上限 | 输出格式 | 是否需要写代码 |
|---|---|---|---|
| Circleboom | 最多 3,200 | CSV、Excel | 否 |
| Tweet Binder | 因套餐而异 | Excel、PDF | 否 |
| 浏览器扩展 | 不定,通常低于 3,200 | CSV、Excel | 否 |
如果只需快速导出单个账号的近期推文,又不想接触代码,这类工具是合理的选择。其中一些可以直接输出 Excel 或 PDF,方便不写代码的同事使用。但对于发帖量很大的账号,上限就会成为问题:如果要求导出一个发布过 5 万条帖子的账号的完整历史,多数工具最多只能返回最近 3,200 条。若经常从多个账号拉取数据,付费套餐的成本也会不断累积;有些工具还要求接入你的会话 cookie,会带来额外的安全风险。
最适合: 一次性导出近期推文、非技术用户、快速的竞品快照。
方法 3:开源爬虫
开源爬虫通过逆向分析 X 的网页接口来抓取推文,从而绕开官方 API 及其收费。它们免费,但也很脆弱:X 一旦更换前端令牌,所有依赖该机制的爬虫都可能同时失效,而且没有 SLA、弃用通知或迁移方案。
可用的工具也越来越少。几年前广泛使用的 snscrape 和 twint 如今实际上已停止维护:snscrape 已多年未更新,twint 也已归档。仍有少数库在维护,但面临同样的结构性风险:今天可以运行的爬虫,可能在平台改动一次后立即失效。想了解目前还有哪些工具可用,请参阅 2026 年 Twitter 爬虫分析。
如果生产工作流需要稳定、可重复的数据访问,或者研究项目有明确期限,那么爬虫就是一项无法由你控制的依赖。
最适合: 临时探索、时间安排灵活的预算受限项目、乐于自己修复故障的开发者。
方法 4:使用 Twitter/X 数据 API
数据 API 是通过程序下载完整时间线最可靠的方式:发送 HTTP 请求、接收结构化 JSON,再逐页拉取,直至该账号的第一条推文。官方 X API 虽然可用,但用户时间线最多只返回 3,200 条帖子,并在 2026 年的按量付费模式下按资源计费;第三方数据 API 则可以按请求计费并返回完整历史。
官方 X API
官方方案不适合这项任务,主要有两个原因。第一,用户时间线接口最多只能返回最近 3,200 条帖子;这项限制在文档中有明确说明,已存在十多年,在 X API v2 中仍然有效。第二,当前的按量付费模式会对读取的每项资源收费(每条帖子约 0.005 美元,每份用户资料约 0.010 美元,价格已于 2026 年 7 月核实)。此外,每月最多读取 200 万条帖子。因此,即使尚未触及时间线上限,大规模采集的成本也会迅速上升。认证还需要 OAuth 2.0 bearer token,而非单个密钥。
第三方数据 API
第三方 API 可以用更简单的认证方式、更可预测的价格和更少的限制获取同样的公开数据。Sorsa 就是这样一种 Twitter/X API 替代方案:这项托管式 REST 服务只需一个 ApiKey 请求头即可返回完整推文数据,按请求而非按资源收费。更重要的是,它的 /user-tweets 接口没有 3,200 条推文上限,可以逐页拉取用户的全部历史,直至第一条帖子。关于两种计费模式的详细对比,请参阅 2026 年 Twitter API 价格详解。
最适合: 开发者、数据工程师、生产环境的数据管道、研究项目,以及任何需要规模化结构化数据的人。
你该用哪种方法?
应根据所需推文来自哪个账号、数量有多少以及拉取频率来选择方法。每种方案都有适用场景;对于读取量大、规模大或需要定时运行的任务,数据 API 最为合适。
- 备份你自己的账号: 原生 X 存档,因为它免费、无上限地导出你的全部发帖历史。
- 快速一次性导出近期推文: 无代码浏览器工具,只要你待在平台“最近 3,200 条”的上限之内就没问题。
- 无截止日期的临时抓取: 开源爬虫,但要接受它可能在 X 下次改动前端时失效。
- 完整历史、多个账号或周期性拉取: 使用 Sorsa 之类的数据 API;其
/user-tweets接口按请求计费,可以突破 3,200 条的限制并持续分页。
如何通过 API 下载全部推文,分步详解
下面用 Sorsa API 走一遍完整流程,从第一次请求到一个成品文件。
前置条件
- 一个来自 API 控制台的 API 密钥;新账号的 100 次免费请求足以端到端地试跑一遍分页循环
- Python 3.7+ 并安装
requests库,或 Node.js 18+ - 目标账号的用户名,例如
stripe
第一次用这个 API?快速上手指南几分钟就能讲清认证和你的第一次请求,而 Twitter API Python 指南则更深入地介绍下面用到的客户端设置。
拉取完整时间线
/user-tweets 接口每页返回约 20 条推文,采用基于游标的分页。循环翻页,直到 next_cursor 不存在或为 null,这意味着你已到达时间线的末尾。
Python:
import requests
import time
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.sorsa.io/v3"
def download_all_tweets(username, max_pages=None):
"""下载一个公开账号的每一条推文。"""
all_tweets = []
cursor = None
page = 0
while True:
body = {"username": username}
if cursor:
body["next_cursor"] = cursor
resp = requests.post(
f"{BASE_URL}/user-tweets",
headers={"ApiKey": API_KEY, "Content-Type": "application/json"},
json=body,
)
resp.raise_for_status()
data = resp.json()
tweets = data.get("tweets", [])
all_tweets.extend(tweets)
page += 1
print(f"Page {page}: {len(tweets)} tweets (total: {len(all_tweets)})")
cursor = data.get("next_cursor")
if not cursor:
print("Done. Reached end of timeline.")
break
if max_pages and page >= max_pages:
print(f"Stopped at {max_pages} pages.")
break
time.sleep(0.05) # 稳稳地待在每秒 20 次请求以内
return all_tweets
tweets = download_all_tweets("stripe")
print(f"\nCollected {len(tweets)} tweets from @stripe")
JavaScript:
const API_KEY = "YOUR_API_KEY";
const BASE_URL = "https://api.sorsa.io/v3";
async function downloadAllTweets(username, maxPages = Infinity) {
const allTweets = [];
let cursor = null;
let page = 0;
while (page < maxPages) {
const body = { username };
if (cursor) body.next_cursor = cursor;
const resp = await fetch(`${BASE_URL}/user-tweets`, {
method: "POST",
headers: {
"ApiKey": API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();
allTweets.push(...(data.tweets || []));
page++;
console.log(`Page ${page}: ${data.tweets?.length || 0} tweets (total: ${allTweets.length})`);
cursor = data.next_cursor;
if (!cursor) break;
await new Promise((r) => setTimeout(r, 50));
}
return allTweets;
}
const tweets = await downloadAllTweets("stripe");
console.log(`Collected ${tweets.length} tweets from @stripe`);
每个推文对象都包含完整文本、发布日期、互动数据(点赞、转推、回复、引用、浏览和书签数)、语言、媒体实体以及完整的作者资料。作者资料已内嵌在响应中,不会增加请求成本;除非需要先获取账号简介中的链接或置顶推文 ID,否则无需另行调用账号信息接口。
导出为 CSV
拿到推文后,把它们写入 CSV,供 Pandas、R、Google Sheets 或数据库导入分析:
import csv
def export_tweets_csv(tweets, filename="tweets.csv"):
fields = [
"id", "created_at", "full_text", "lang",
"likes_count", "retweet_count", "reply_count",
"quote_count", "view_count", "bookmark_count",
"is_reply", "is_quote_status", "username",
]
with open(filename, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=fields)
writer.writeheader()
for t in tweets:
writer.writerow({
"id": t["id"],
"created_at": t["created_at"],
"full_text": t["full_text"].replace("\n", " "),
"lang": t.get("lang", ""),
"likes_count": t.get("likes_count", 0),
"retweet_count": t.get("retweet_count", 0),
"reply_count": t.get("reply_count", 0),
"quote_count": t.get("quote_count", 0),
"view_count": t.get("view_count", 0),
"bookmark_count": t.get("bookmark_count", 0),
"is_reply": t.get("is_reply", False),
"is_quote_status": t.get("is_quote_status", False),
"username": t.get("user", {}).get("username", ""),
})
print(f"Exported {len(tweets)} tweets to {filename}")
export_tweets_csv(tweets, "stripe_tweets.csv")
导出为 Excel
如果使用者不写代码,只需要电子表格,用两行 Pandas 代码就能把同样的记录写入 .xlsx:
import pandas as pd
df = pd.DataFrame(tweets)
df.to_excel("stripe_tweets.xlsx", index=False)
如果目的地是一份共享电子表格而非本地文件,把 Twitter 数据导出到 Google Sheets 的指南介绍了无代码路线。如果你要的是一份可分享的报告而非用于分析的数据集,可以用 ReportLab 之类的库把表格渲染成 PDF;但当数据要进入分析或模型时,CSV 和 JSON 仍是更好的选择。
超越时间线:搜索法
/user-tweets 接口返回按时间顺序排列的原始时间线。如果只想获取特定子集,例如仅包含图片的推文、点赞数高于某个阈值的推文或某个日期范围内的推文,请使用 /search-tweets 并配合 from: 操作符:
# 来自某个账号的高互动推文
resp = requests.post(
f"{BASE_URL}/search-tweets",
headers={"ApiKey": API_KEY, "Content-Type": "application/json"},
json={"query": "from:stripe min_faves:50 -filter:replies", "order": "latest"},
)
你可以将 from: 与互动筛选条件(min_faves:、min_retweets:)、媒体筛选条件(filter:images)、语言代码(lang:en)及日期范围(since:、until:)组合使用。推文搜索查询构建器可以通过可视化界面生成查询;完整的搜索操作符参考则列出了所有选项。
如何从一个用户那里拿到超过 3,200 条推文?
若要获取某个用户超过 3,200 条推文,就不能依赖官方 X API 的时间线接口:该接口最多返回最近 3,200 条帖子,排除回复时更只有 800 条。可行的方案有两种:使用可分页的第三方数据 API 拉取完整时间线,或按日期范围分段搜索采集。也可以逐日抓取网页搜索结果,但这种方法速度慢且经常失效。
相比价格,3,200 条的限制反而让更多人遇到问题。一些旧指南和论坛回答仍声称无法突破该限制,或推荐使用 Selenium 脚本逐日抓取 Twitter 搜索页面。这些脚本针对旧版搜索界面编写,如今大多已无法运行。以下是目前各方法的实际对比:
| 方法 | 最多推文数 | 说明 |
|---|---|---|
| Twitter/X 存档(自己的账号) | 全部 | 免费,等待 24 至 48 小时,仅限自己的账号 |
| 无代码导出工具 | 800 至 3,200 | 基于官方 API;需付费套餐 |
| 开源爬虫 | 不定 | 不可靠;X 改动前端时即失效 |
| 官方 X API(时间线) | 3,200 | 有文档记载的硬性上限;排除回复时为 800 |
Sorsa API /user-tweets | 无上限 | 逐页拉取完整历史 |
Sorsa API /search-tweets 配合 from: | 无上限 | 可加日期范围和互动筛选 |
结论是:只有两种方法能够稳定突破 3,200 条的限制,而且都基于 API。对于内容审计等临时需求,如果只需最近几百条推文,该限制通常没有影响。但在存档政治评论、构建历史互动数据集或处理高产账号时,它就会成为硬性障碍;记者、政治人物和媒体品牌的账号往往远超 5 万条帖子。如果需要按关键词和日期从多个账号采集数据,而不是拉取单个账号的时间线,历史 Twitter 数据指南完整介绍了按日期窗口搜索的流程。
下载完整时间线要花多少钱?
通过按请求计费的数据 API 下载完整时间线,成本很低。按每次请求返回约 20 条推文计算,一个发布过 5 万条推文的账号约需 2,500 次请求;Pro 套餐每次请求为 0.00199 美元,总成本不到 5 美元,按每秒 20 次请求计算,约两分钟即可完成。成本只取决于账号的推文数量,与按资源收费的逻辑无关。
这里需要区分两种费率。通过 /user-tweets 逐页拉取完整时间线时,每次请求约返回 20 条推文;按 Pro 套餐计算,平均每 1,000 条推文约 0.10 美元。如果已经有推文 ID,批量接口 /tweet-info-bulk 每次请求最多返回 100 条推文,平均每 1,000 条推文为 0.02 美元起。下载完整存档适用前一种费率,因为需要遍历时间线,而不是查询已知 ID。
下表列出了不同账号规模下完整导出的请求数、成本和耗时,按 Pro 套餐每次请求 0.00199 美元计算(价格已于 2026 年 7 月核实):
| 账号规模 | 请求数 | 费用(Pro 套餐) | 20 请求/秒下的耗时 |
|---|---|---|---|
| 1,000 条推文 | 50 | ~$0.10 | ~3 秒 |
| 5,000 条推文 | 250 | ~$0.50 | ~13 秒 |
| 10,000 条推文 | 500 | ~$1.00 | ~25 秒 |
| 50,000 条推文 | 2,500 | ~$4.98 | ~2 分钟 |
| 100,000 条推文 | 5,000 | ~$9.95 | ~4 分钟 |
下载一个包含 5 万条推文的账号的完整时间线,成本不到 5 美元,约两分钟即可完成。在这类以读取为主的任务中,Sorsa 的单条帖子成本最高可比官方 X API 低 50 倍;官方 X API 每读取一条帖子收取 0.005 美元,每读取一份作者资料另收 0.010 美元(价格已于 2026 年 7 月核实)。相比之下,按月订阅的无代码工具仍只能从同一账号返回最近 3,200 条推文。如果需要定期从多个账号拉取数据,按请求计费套餐最高提供 50 万次请求,约可在一个月内完整导出 200 个各含 5 万条推文的账号。
实战:那些让其他方法失灵的账号
最常需要完整历史记录的往往是发帖量很大的账号,而其他方法恰好在这种情况下失效。我们合作过的一个媒体监测团队为了开展话语研究,需要获取一位公众人物约 6 万条推文的完整历史。他们原有的无代码工具返回最近 3,200 条后便停止,留下了长达数年的数据缺口。改用 /user-tweets 接口分页后,团队在一个下午内拉取了完整时间线,使用 Pro 套餐的成本不到 6 美元,并将结果直接写入 CSV 供模型使用。真正阻碍任务的一直是 3,200 条的限制,而不是成本;限制消除后,整个任务就变成了常规流程。构建用于机器学习的 Twitter 数据集教程采用的也是这种“先采集、再导出”的模式。
常见问题
能下载一个私密(受保护)账号的推文吗?
不能。受保护账号的推文仅对获准关注的人可见。除非你是获准关注该账号且已登录的用户,否则任何 API、爬虫或导出工具都无法读取这些推文。官方 X API、Sorsa API 以及本文介绍的其他方法都受此限制;第三方只能下载公开账号的推文。
能追溯到多久以前?
无论推文发布于何时,官方 X API 的时间线接口都只返回最近 3,200 条。你自己的 Twitter 存档则包含自己发布过的全部内容。Sorsa API 等支持分页的数据 API 可以通过 /user-tweets 一直拉取到用户的第一条帖子,没有硬性上限;使用 from:username 并搭配 since: 和 until: 操作符搜索,则可以精确指定时间范围。
下载的推文包含图片和视频吗?
包含。每个推文对象都有一个 entities 数组,内含推文所附照片、视频和 GIF 的直链,外加预览缩略图。你可以用这些 URL 以编程方式下载媒体文件。若想以无代码方式保存单条推文里的媒体,免费的 Sorsa 媒体下载器支持照片、视频和音频,而通过 API 下载 Twitter 媒体的指南则介绍了编程版本。
下载别人的推文合法吗?
出于个人分析、研究或商业情报目的下载公开推文通常是允许的,因为任何人都能在网上看到这些内容。风险主要取决于数据的使用方式。再次分发、大规模重新发布或利用数据进行骚扰,都可能违反平台条款或欧盟《通用数据保护条例》(GDPR)等法规。如需开展大规模或商业采集,请咨询熟悉当地法律的专业顾问。
分析用哪种格式最好:CSV、JSON 还是 Excel?
CSV 是最通用的选择,可在 Excel、Google Sheets、Pandas 和 R 中打开。JSON 能保留完整的嵌套结构,例如媒体实体、引用推文和作者对象,适合程序处理或导入数据库。Excel 方便不写代码的同事使用,但需要额外的转换步骤。一般可先选择 CSV;需要嵌套的回复或媒体数据时再使用 JSON。
有没有不受 3,200 条推文上限约束的 Twitter API?
有。Sorsa API 是一个 Twitter/X 数据 API,它的 /user-tweets 接口没有 3,200 条推文上限:你可以把完整时间线一路分页回到账号的第一条帖子。它用单个 ApiKey 请求头认证,而非 OAuth;按请求而非按资源计费;且每个套餐都是每秒 20 次请求,所以一个大账号的完整存档只需几美元。
如何下载包含特定关键词或话题标签的推文?
用搜索,而不是时间线接口。把关键词或话题标签与 from:username 筛选组合成一个查询,传给 /search-tweets。例如 from:stripe #payments since:2025-01-01 只返回 @stripe 自 2025 年 1 月以来发布的、含 #payments 话题标签的推文。完整的操作符列表见搜索操作符参考。
如何开始
决定购买套餐前即可进行测试。首先,可以在 playground 中测试任意公开账号,无需注册或密钥。其次,新账号可获得 100 次免费请求:额度一次性发放,无需绑卡、永不过期,适用于全部 40 个接口,最多可获取 1 万条推文或 2 万份用户资料。你可以用这些额度实际执行一次存档任务,而不只是做简单试用,再决定是否购买套餐。
批量接口按每 1,000 条推文报价,0.02 美元起。按请求计费的套餐分别为 49 美元(1 万次请求)、199 美元(10 万次请求)和 899 美元(50 万次请求)。无需审批或 OAuth 流程,只需一个 API 密钥;所有套餐的速率均为每秒 20 次请求。
审校:Keksich(Sorsa 创始人,X API 研究者)
本指南基于我们自 2022 年起运营 Twitter/X API 替代服务的实践经验(目前已处理超过 50 亿次请求),以及使用实时接口对这四种方法进行的逐项测试。2026 年 7 月,我们根据最新 X API v2 文档和 Tweepy 客户端参考资料重新核实了时间线最多返回 3,200 条推文的限制,并根据 X 公布的开发者价格核实了官方 X API 的按量付费标准。接口行为、分页方式和单次请求成本均以 Sorsa API 文档为依据。有关团队的更多信息,请参阅关于页面。如发现内容已过时,请发送邮件至 contacts@sorsa.io。最后核实日期:2026 年 7 月 3 日。