作者:Sorsa 编辑部

更新于 2026 年 7 月 4 日:新增 100 次免费请求的起步选项,把价格改用每 1,000 条推文和每 1,000 份用户资料表述,并重新确认完整存档始于 2006 年 3 月,以及 3,200 条推文的时间线上限。

核心要点: 历史 Twitter/X 数据,也就是每一条可回溯至 2006 年 3 月的公开推文,有五种获取方式:X 的免费高级搜索、官方 X API 的全量存档搜索、开源爬虫、学术数据集,或第三方数据 API。要做规模化的编程访问,数据 API 是可行之路,因为并不存在一份可供下载的公开完整存档。

官方路径在过去三年里急剧收窄。X 于 2023 年对新申请者关闭了免费学术研究通道,2026 年初对新开发者取消了固定套餐,改成按每次资源读取计费,这让大规模历史拉取变得昂贵。Sorsa API 这个 Twitter/X API 替代方案则是另一种形态。它的 /search-tweets 接口用标准的 since:until: 操作符,跑可回溯至 2006 年的全量存档关键词搜索,一次调用就返回带作者资料的完整推文对象,按请求计费,不按每条推文读取算。价格从批量接口的每 1,000 条推文 $0.02、每 1,000 份用户资料 $0.01 起,所有套餐统一 20 次/秒,无需开发者账号审批。注册即送 100 次免费请求,可以先测一测存档:无需绑卡,永不过期。

这个 API 是我们自己开发和运营的,也定期基于官方接口重建历史数据管道,所以这里的取舍来自实际动手,不是照文档归纳。

历史 Twitter 数据一览

五种方法几乎覆盖了所有真实场景。它们在存档深度、成本、搭建成本,以及实际能拉取多少数据上各不相同。

方法存档深度成本(2026)配置最适合
X 高级搜索(网页)回溯至 2006免费手动查找某条特定旧推文
官方 X API 全量存档回溯至 2006按量付费,每次帖子读取约 $0.005,每月上限 200 万高(开发者账号、按量付费额度)有资金、低用量的团队
开源爬虫不定,通常较浅免费(工程时间)中,经常失效临时、预算受限的工作
学术数据集特定事件快照免费中(推文 ID 补全)已知事件的现成数据集
Sorsa API(搜索接口)回溯至 2006固定套餐,每千条推文 $0.02 起($49 / $199 / $899 每月)低(一个 API 密钥)生产环境数据管道、持续研究

目录


为什么 2026 年历史 Twitter 数据更难拿到? {#why-is-historical-twitter-data-harder-to-get-in-2026}

2026 年历史 Twitter 数据更难拿到,是因为没有一份可供下载的公开完整存档,而研究者曾经依赖的那几条廉价编程路径也都关了。公开推文的完整旧目录确实存在,可回溯到 2006 年 3 月,但你只能通过搜索或付费访问拿到,而高性价比的选项在 2023 到 2026 年间不断萎缩。

三次平台变动重塑了访问方式。2023 年 2 月,免费 API 版本变成只写的摆设,付费套餐取而代之。2023 年年中,为大多数已发表 Twitter 研究提供支撑的学术研究通道停止接受新申请。2026 年初,X 把新开发者迁到按量付费额度,读取每次资源约 $0.005,且按量付费账号每月上限 200 万次读取。$5,000/月的旧 Pro 套餐仍捆绑全量存档搜索,但已对新注册关闭。逐档位的完整情况,见我们的 2026 年 Twitter API 价格详解

也没有机构层面的捷径。美国国会图书馆曾同意保存每一条公开推文,接收了 Twitter 从 2006 年起的完整旧目录,但在 2017 年底停止了全面存档,如今只做选择性收集,而那份 2006 到 2017 年的收藏仍对公众封存。没有任何外部机构持有一份可查询的存档副本。这就是为什么第三方数据 API 和开源爬虫接住了大部分被挤出来的需求。


五种方法详解 {#the-five-methods-in-detail}

X 高级搜索

X 高级搜索是免费的手动路线,在网页界面里直接回溯到 2006 年,支持 since:until: 操作符,适合查一条已知推文,或对一个小窗口做采样。它不导出、不返回结构化数据,任何规模上都行不通,因为结果是分页的,得靠手滚动。旧日期区间还会返回嘈杂的结果,因为相关性排序会给旧内容降权。

官方 X API 全量存档搜索

官方 search/all 接口提供和第三方 API 相同的存档深度,但在 2026 年带着三处摩擦。新开发者必须用按量付费额度,没有固定的月费。v2 响应默认只返回极少字段,所以你必须显式索取需要的互动指标、作者资料和媒体。按量付费上每月 200 万次读取的上限是一道硬性上限,真实的研究预算很快就会撞上。认证走 OAuth 2.0 加 bearer 令牌,第一次存档查询还没跑,就先多了一层配置开销。

开源爬虫

开源爬虫通过逆向 X 的网页接口来拿旧推文,因此既免费又脆弱。名气很大的 snscrape 和 twint 其实已经废了:snscrape 多年无人维护,twint 已归档。还剩几个在维护的库,但它们共享同一种失效模式,能用的爬虫会在 X 轮换前端令牌那一刻失效,而且没有迁移路径。这些工具的现状,见我们对 2026 年哪些 Twitter 爬虫还能用的分析。

学术数据集

现成的存档给的是推文 ID,不是完整推文。你拿这些 ID 去 API 补全,取回当前内容,这意味着数据集构建之后每过一年,就有更多推文被删除、封禁或设为私密而掉出。乔治·华盛顿大学的 TweetSets、DocNow 目录这类仓库覆盖重大事件,沃顿商学院的研究数据库则提供一份约占全部推文 1% 的、可用 SQL 查询的样本。补全仍然需要 API 访问,又绕回定价问题;对失去学术研究通道的团队,我们的学术研究访问在免费或折扣套餐上提供同样的按日期分窗查询。

第三方数据 API

第三方数据 API 是编程访问最可靠的路线:一个密钥、结构化 JSON,以及对完整存档的分页。Sorsa 就是这样一个 Twitter/X API 替代方案。它的 /search-tweets 接口覆盖 2006 年 3 月起的存档,默认返回每一个字段(包括内嵌在每条推文里的作者资料),按请求计费,不按每条推文读取算。正是这种按请求计费的模式,让一次在官方 API 上动辄数千美元的大型回填,在这里落到几百美元的低位。


“完整存档”到底意味着什么(以及你拿不到什么) {#what-full-archive-actually-means-and-what-you-cannot-get}

“完整存档”是这个领域被滥用得最厉害的一个说法。每家服务商都声称拥有它,但没有一家(包括官方 API 本身)能返回下面四类数据。这些是平台级限制,不是某个工具的缺口,对官方 X API、Sorsa API 和其他每一家服务商都一视同仁。

已删除的推文。 推文一旦被删除,就离开了 X 的搜索索引,没有任何 API 能找回。Wayback Machine 偶尔会存有某个高流量资料页的截图,但那是一张图片,不是推文本身。

受保护账号的推文。 帖子受保护的账号被排除在公开搜索和时间线接口之外。要读到这些推文,唯一的办法是成为已获批准、已认证的粉丝。

历史资料快照。 资料数据反映的是当前状态。一条 2014 年的推文今天返回时,显示的是作者 2026 年的用户名和简介,不是他们 2014 年的样子。如果这个用户名此后改过三次,你看到的是当前那个。

历史互动快照。 这一条会绊倒情感和影响力研究。一条 2018 年的推文今天取回时,显示的是当前的点赞数,不是 2018 年那时候的数字。X 生态里任何地方都没有“时光机”接口。如果你需要时点互动数据,就在推文发布时采集下来,自己存好指标。相关模式见实时监测文档


如何用 API 搜索历史推文 {#how-to-search-historical-tweets-with-the-api}

有两个接口覆盖历史工作,取决于你是跨用户按关键词搜索,还是拉取单个账号的完整时间线。

接口作用分页每页大小
POST /v3/search-tweetssince:until:from:min_faves: 等 X 搜索操作符,对全量存档做关键词搜索next_cursor约 20 条推文
POST /v3/user-tweets某个用户的完整发帖历史,从最新到最旧next_cursor约 20 条推文

认证是单个 ApiKey 请求头。每个响应都是扁平化的 JSON,含完整推文对象,包括内嵌的作者资料、媒体实体和互动指标。一个最小请求:

bash
curl -X POST https://api.sorsa.io/v3/search-tweets \
  -H "ApiKey: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "\"climate change\" since:2015-06-01 until:2015-12-31 lang:en min_faves:10",
    "order": "latest"
  }'

这会返回 2015 年 6 月至 12 月之间、匹配短语 "climate change"、至少 10 个赞的英文推文,按时间顺序排列。完整的操作符集(from:to:filter:min_retweets:、精确短语、布尔逻辑)见我们的 Twitter 高级搜索语法参考,收窄任何存档查询所需的语法都在里面。

带分页搜索一个日期区间(Python)

最常见的历史工作流是事件分析:在一个界定的窗口内,拉取匹配某话题的每一条英文推文。在 next_cursor 上循环,直到游标返回空。

python
import requests
import time

API_KEY = "YOUR_API_KEY"
URL = "https://api.sorsa.io/v3/search-tweets"

def search_historical(query, max_pages=50):
    """带自动分页搜索完整的推文存档。"""
    all_tweets = []
    next_cursor = None

    for page in range(max_pages):
        body = {"query": query, "order": "latest"}
        if next_cursor:
            body["next_cursor"] = next_cursor

        resp = requests.post(
            URL,
            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)
        print(f"Page {page + 1}: {len(tweets)} tweets (total: {len(all_tweets)})")

        next_cursor = data.get("next_cursor")
        if not next_cursor:
            break
        time.sleep(0.1)

    return all_tweets


tweets = search_historical("SpaceX since:2015-06-01 until:2015-07-01 lang:en")

每个推文对象都包括不带 140 字符截断的完整文本、语言代码、用于重建话题串的会话 ID、全部六项互动计数、媒体实体 URL,以及完整的作者资料。你从不需要第二次调用去取用户。更多 Python 模式,包括重试和规模上的坑,见我们的 Python 版 Twitter API 指南

浮现高互动的历史内容(JavaScript)

做内容研究时,按热度而不是时间排序。把 order: "popular"min_retweets:-filter:nativeretweets 组合起来,浮现某个时段真正掀起波澜的原创推文,而不是一堆转发。

javascript
const API_KEY = "YOUR_API_KEY";
const URL = "https://api.sorsa.io/v3/search-tweets";

async function searchHistorical(query, maxPages = 10) {
  const allTweets = [];
  let nextCursor = null;

  for (let page = 0; page < maxPages; page++) {
    const body = { query, order: "popular" };
    if (nextCursor) body.next_cursor = nextCursor;

    const resp = await fetch(URL, {
      method: "POST",
      headers: { "ApiKey": API_KEY, "Content-Type": "application/json" },
      body: JSON.stringify(body),
    });
    if (!resp.ok) throw new Error(`API error: ${resp.status}`);

    const data = await resp.json();
    const tweets = data.tweets || [];
    allTweets.push(...tweets);

    nextCursor = data.next_cursor;
    if (!nextCursor) break;
    await new Promise((r) => setTimeout(r, 100));
  }

  return allTweets;
}

// 2019 年爆火的 Tesla 推文,仅限原创
searchHistorical(
  'Tesla since:2019-01-01 until:2019-12-31 min_retweets:1000 -filter:nativeretweets lang:en'
).then((t) => console.log(`Collected ${t.length} tweets`));

-filter:nativeretweets 这个标志在这里很关键。没有它,热度搜索会把同一条爆款推文以转发形式返回几十次,把原创埋在下面。

导出到 CSV 和 Pandas

生产环境的数据管道会采集推文、写入 CSV,再加载进来做分析。同样的响应结构可以直接落进一个 DataFrame:

python
import pandas as pd

def to_dataframe(tweets):
    rows = []
    for t in tweets:
        u = t.get("user", {})
        rows.append({
            "created_at": pd.to_datetime(t["created_at"]),
            "username": u.get("username"),
            "followers": u.get("followers_count", 0),
            "text": t["full_text"],
            "likes": t.get("likes_count", 0),
            "retweets": t.get("retweet_count", 0),
            "views": t.get("view_count", 0),
            "lang": t.get("lang"),
        })
    return pd.DataFrame(rows)

df = to_dataframe(tweets)
df.to_csv("historical_tweets.csv", index=False)

到这里你就有了一个干净的数据框,可用于互动率时间序列、情感打分或回归。完整的情感工作流见我们的配套指南 Twitter 舆情分析,组建带标签语料见构建用于机器学习的 Twitter 数据集


大规模历史采集的策略 {#strategies-for-large-scale-historical-collection}

对任何几千条以上的回填,有几个模式一直靠得住。

把大日期区间切成按月的窗口。 对整整一年做单次查询,你就没法控制批大小,一次请求中途失败也没有干净的续跑点。按月拆分能让你并行、重试并干净地审计;对选举或市场崩盘这类波动窗口,还可以进一步切成按周或按天的块。

过滤转发噪音。 历史热度搜索会返回一堆转发。想要原创内容时加上 -filter:nativeretweets,或者用 -filter:retweets 连老式的 "RT @user" 转发也一并丢掉。

把互动过滤和日期区间配合起来。since:until:min_faves:min_retweets: 组合,只浮现在你的窗口内获得关注度的推文,这样既减噪也降请求量。怎么削减不必要的调用、干净处理游标机制,见优化 API 用量

回填一次,然后向前监测。 互动计数是当前总数,不是时点快照,所以做持续研究时,最强的模式是把历史窗口回填一次,再向前挂一个实时监测器。这样既有历史基线,也有对所有新内容准确的时点指标。


抓取一个账号的完整时间线 {#scraping-a-full-account-timeline}

如果你的目标是某个账号完整的发帖历史,而不是跨用户的关键词搜索,那就改用 /user-tweets。这个接口从最新到最旧走完时间线,直到游标为空,也没有官方 API 时间线接口那种 3,200 条推文上限的对应限制。

python
import requests

resp = requests.post(
    "https://api.sorsa.io/v3/user-tweets",
    headers={"ApiKey": "YOUR_API_KEY", "Content-Type": "application/json"},
    json={"username": "naval"},
)

那是一套不同于存档搜索的工作流,有自己的成本账,也和图形界面工具、爬虫各有对比。我们专门的下载某用户全部推文指南端到端讲了这套流程。本文剩下的部分聚焦跨用户的历史搜索。


实战:基于官方 API 重建历史 {#in-practice-rebuilding-history-off-the-official-api}

2026 年这波挤压感受最深的,是那些要在预算内回填多年数据的团队。我们合作过的一家量化基金,想要一个来自加密推文的情绪动量信号,回测五年的价格走势。第一步是回填一份精选的约 400 个账号的每一条推文,外加 2019 到 2024 年间匹配 30 个关键词的英文推文。在官方套餐上,读取上限是那个真正的瓶颈,预计账单会一路冲到五位数高位。基于按请求计费的存档 API 重建后,同样的回填在三天的分页里以几百美元完成,该策略此后一直在实盘运行。

另一种形态,同样的教训:一个做纵向话语研究的学术团队,把整套方法论建在学术研究通道之上。这条通道对新申请者关闭后,他们改用替代方案,在一个固定套餐上跑同样的 from: 和关键词查询。查询结果再和原有访问期间采集的较小数据集重新校验。这次重建只花了一个 Starter 月度套餐的钱。两个案例里,卡住人的都是访问的成本,不是数据本身,而按请求计费的模式把这个障碍去掉了。


常见问题 {#frequently-asked-questions}

Twitter/X 存档搜索能回溯到多久?

回溯到 2006 年 3 月 21 日,也就是第一条公开推文的日期。官方 X API 的全量存档搜索和 Sorsa API 的 /search-tweets 接口,都覆盖从那天起的完整公开存档。此后被作者删除或设为私密的推文会被排除在任何结果之外,因为它们已经不在平台的搜索索引里了。

能通过任何 API 拿到已删除的推文吗?

不能。推文一旦被删除,就从 X 的搜索索引里移除了,没有任何公开 API 能取回。你唯一的选择是删除前做的外部捕获,比如 Wayback Machine 截图,或者一个实时采集过该推文的监测服务。如果保存可删除内容对你很重要,就在推文发布时采集下来,存在你自己这边。

Twitter 学术研究 API 还免费吗?

对新申请者不免费。X 于 2023 年停止接受学术研究通道的新申请。在那之前有访问权的研究者暂时保留,但不再发放新的学术名额。2026 年多数学术项目要么用一个剩余名额,要么从现成数据集入手,要么迁到按请求计费的第三方存档 API 上跑同样的按日期分窗查询。

2026 年搜索完整存档要花多少钱?

在官方 X API 的按量付费模式下,读取每次约 $0.005,每月上限 200 万次读取;那个以 $5,000/月捆绑全量存档搜索的旧 Pro 套餐已对新注册关闭。Sorsa API 改用固定月费套餐:$49 含 1 万次请求、$199 含 10 万次、$899 含 50 万次,每次搜索请求最多返回 20 条推文。

能取回某条推文在过去某个特定日期的互动指标吗?

不能。任何 API 返回的推文互动计数,包括点赞、转发、回复、浏览、引用和书签,反映的都是当前总数,不是过去某个特定日期的总数。平台不存储互动的历史快照。如果你需要时点指标,就得实时采集推文,并在那一刻自己记下数字。

如何搜索两个特定日期之间的推文?

在查询里用 since:YYYY-MM-DDuntil:YYYY-MM-DD 操作符。since 包含起始日期,until 不包含结束日期,所以 since:2020-01-01 until:2020-02-01 返回 2020 年 1 月整月。把它们和 lang:min_faves:-filter:retweets 组合,可以在整个存档上得到更干净的结果。

有没有不按推文计费、高性价比的历史 Twitter 数据 API?

有。Sorsa API 按请求计费,不按每条推文读取算,所以一次返回 20 条推文的搜索,无论这些推文来自 2024 年还是 2009 年,花费都一样。在 Pro 套餐($199/月,含 10 万次请求)下,那大约是两百万条推文,所以一次大型历史回填只要几美元,而不是按资源计费的数千美元。


如何开始 {#getting-started}

想在写代码之前测试存档搜索,在线试用工具 Playground 可以从浏览器对 /search-tweets/user-tweets 发起请求,无需密钥;可视化查询生成器让你手动拼装操作符。准备好集成时,从控制台取一个密钥,跟着快速上手走:无需审批、无需 OAuth、单个 API 密钥,所有套餐统一 20 次/秒。注册即送 100 次免费请求,无需绑卡,永不过期,覆盖全部 40 个接口,足够在投入前验证一个按日期分窗的查询。$49 含 1 万次请求的 Starter 套餐能覆盖大多数一次性回填,包括事件分析或对一年窗口的单话题研究。

审校:Keksich(Sorsa 创始人,X API 研究者)

本指南取材于我们自 2022 年起运营 Twitter/X API 替代方案、并基于官方接口重建历史数据管道的工作。我们对照美国国会图书馆关于其 Twitter 存档的说明核实了完整存档始于 2006 年 3 月,以及全面收集的界限;对照 X 公布的开发者定价重新核对了官方 X API 的按量付费价格;接口行为、操作符和按请求成本则取自 Sorsa API 文档和我们已发布的 2026 年价格详解。本文对比了五种访问方法。团队的更多信息见我们的关于页面。最后核实于 2026 年 7 月 4 日。