跳到正文

如何导出 Twitter 的全部粉丝

X 没有导出按钮,所以要保存公开账号的全部粉丝,就得通过 API 每次读取 200 个,把每一页追加到 CSV 文件里:100 万个粉丝需要 5,000 次请求。

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

简短回答: 每次请求返回一页粉丝,外加指向下一页的 cursor,不再返回 cursor 时,导出就完成了。官方 X API 每 1,000 个粉丝收费 $10.00。Sorsa API 的 GET /followers 每 1,000 个 $0.007 起,用你的 100 次免费请求就能导出前 2 万个粉丝。

接口
GET /followers
每页条数
每次请求 200 个
价格
每 1,000 个 $0.007 起

#导出 Twitter 粉丝的原理

X 没有为任何账号提供粉丝导出功能,你自己的账号也不例外,所以粉丝列表想从 X 里出来,有四种方式:你的数据存档、浏览器扩展、像把 Twitter 粉丝导出为 CSV这样的免费网页工具,或者 API。它们的区别在于能拿到谁的列表,以及能拿到多少。

  • 你的 X 数据存档免费,但只包含你自己的账号,每个粉丝只列出账号 ID 和一个链接,没有名称,而且要等好几天才能拿到。
  • 浏览器扩展会在你已登录的 X 会话里边滚动边读取列表;免费版只能导出几百行,而且每次导出都以你的账号身份进行。
  • 免费网页工具可以把任意公开账号最新的 200 个粉丝、关注或认证粉丝保存为 CSV、Excel 或 JSON。
  • API 可以翻完任意公开账号的整张列表:每次请求返回一页和一个 cursor,不再返回 cursor 时列表就结束了。官方 X API 通过 GET /2/users/{id}/followers(在新标签页打开)实现,每页最多 1,000 个,前提是你开通了开发者账号并配置好 OAuth,每 1,000 个粉丝收费 $10.00。

受保护的账号是任何路线都拿不到的唯一列表:X 只向它批准过的人展示这些粉丝。其他所有列表都是公开的,每个粉丝都以公开用户资料的形式返回,可以在表格里排序和筛选。

#用 Sorsa API 四步导出完整粉丝列表

要导出任意公开账号的完整列表,用 Sorsa API:GET /followers 每次请求最多返回 200 个粉丝,每个都是完整的公开用户资料,外加指向下一页的 cursor,所有套餐统一每秒 20 次请求,也不需要开发者账号。cursor 是 API 随每一页返回的书签;下一次请求把它传回来,接下来的 200 个粉丝就到了。

  1. 获取密钥。 注册后,从控制台复制你的 API 密钥。前 100 次请求免费,无需绑卡。

  2. 请求第一页。 把账号的用户名发给 GET /followers(在新标签页打开),并把密钥放进 ApiKey 请求头。传 user_id,或在 user_link 里传个人主页链接,也可以。

    Terminal
    curl -G "https://api.sorsa.io/v3/followers" \
      -H "ApiKey: YOUR_API_KEY" \
      --data-urlencode "username=northwind_roasters"
    
    Response200 OK
    {
      "users": [
        {
          "id": "1592041833471827968",
          "username": "harbor_street_coffee",
          "display_name": "Harbor Street Coffee",
          "description": "Small-batch roaster. Open 7 to 3.",
          "location": "Portland, OR",
          "created_at": "2022-11-14T06:28:46Z",
          "followers_count": 1840,
          "followings_count": 312,
          "tweets_count": 2741,
          "verified": false,
          "can_dm": true,
          "protected": false,
          "bio_urls": ["https://hsc.example"]
        }
      ],
      "next_cursor": "1849212213712385091"
    }
    
  3. 跟着 cursor 走。 从响应里读出 next_cursor,作为 next_cursor 参数传回去。当它返回为空或不存在时,列表就取完了。

    第 1 页 200 个粉丝 next_cursor 第 2 页 200 个粉丝 next_cursor 第 3–24 页 第 25 页 200 个粉丝 无 next_cursor followers.csv 5,000 行,随页面到达写入 第 1–200 行 201–400 401–4,800 4,801–5,000
    一个有 5,000 个粉丝的账号需要 25 次请求。每一页到达时就写入文件,没有 cursor 的那一页标志着导出结束。
  4. 把每一页写入文件。 页面到达时就追加行,这样即使导出 100 万个粉丝,也不会把整张列表放在内存里。

    import csv
    import requests
    
    URL = "https://api.sorsa.io/v3/followers"
    HEADERS = {"ApiKey": "YOUR_API_KEY"}
    FIELDS = ["id", "username", "display_name", "description",
              "location", "followers_count", "created_at"]
    RISKY = ("=", "+", "-", "@", "\t", "\r")
    
    
    def cell(value):
        if isinstance(value, list):
            value = " ".join(value)
        if isinstance(value, str) and value.startswith(RISKY):
            value = "'" + value  # opens as text, never a formula
        return value
    
    
    def export(username, path="followers.csv"):
        params = {"username": username}
        with open(path, "w", newline="", encoding="utf-8-sig") as f:
            out = csv.writer(f)
            out.writerow(FIELDS)
            while True:
                r = requests.get(URL, headers=HEADERS, params=params)
                r.raise_for_status()
                page = r.json()
                for user in page.get("users", []):
                    out.writerow([cell(user.get(k)) for k in FIELDS])
                cursor = page.get("next_cursor")
                if not cursor:
                    break
                params["next_cursor"] = cursor
    
    
    export("northwind_roasters")
    

两个脚本都会写出 followers.csv,共七列,保存为 Excel 能正确读取的 UTF-8,并且在以表格公式开头的简介前面加一个撇号;这两点在下面的 Excel 一节里有说明。返回 403 表示密钥缺失,或请求次数已用完。返回 429 表示一秒内发了超过 20 次请求:等一秒再重新发送。

#导出关注列表,或只导出认证粉丝

要获取某个用户关注的账号列表,就改调 GET /follows;只要带认证徽章的粉丝,就调 GET /verified-followers。它们的输入和 cursor 都和 GET /followers 一样,返回的用户资料字段也相同,所以脚本只要改一行:URL。

Sorsa API 的四个接口覆盖了本指南里的所有列表:三个用 cursor 翻页读取列表,一个接收一批用户名或 ID。

导出内容接口每次请求
关注某个账号的账号GET /followers最多 200 个粉丝
某个账号关注的账号GET /follows(在新标签页打开)最多 200 个账号
仅其认证粉丝GET /verified-followers(在新标签页打开)一页,cursor 相同
一批用户名或 ID 对应的用户资料GET /info-batch最多 100 份用户资料

关注列表显示一个账号在看谁:它留意的创作者、对手和新闻来源。把它和粉丝列表一起导出,就能知道谁回关了,而两个账号受众的重合度,在任何表格里按 id 匹配即可得到。导出之后的受众工作,从筛选到多个账号之间的重合度,在 Twitter 粉丝 API这篇指南里有更深入的讲解。

#完整导出要花多少钱

用 Sorsa API 完整导出粉丝,每 1,000 个 $0.007 起;同一份公开列表,官方 X API 每 1,000 个收费 $10.00,贵 1,000 倍。

列表规模

官方 X API

$10,000

100 万 个粉丝的费用

每个粉丝 $0.010

Sorsa API

$7 起

100 万 个粉丝的费用

每 1,000 个 $0.007 起

便宜 1,000 倍

按这些费率,1 万个粉丝在 Sorsa API 上 $0.07 起,在官方 X API 上要 $100;10 万个是 $0.70 起对 $1,000;100 万个是 $7 起对 $10,000;1,000 万个是 $70 起对 $100,000。即便是 X 为通过自己的开发者应用读取自己的粉丝设的较低费率,每个 $0.001,折合也是每 1,000 个 $1.00(见 X API 价格(在新标签页打开))。

Sorsa API 按请求计费,而不是按用户资料计费:一次调用最多返回 200 个粉丝,失败的请求从不计费,用 GET /key-usage-info(在新标签页打开)查询余额也是免费的。100 次免费请求覆盖前 2 万个粉丝,也就是说,在你选定套餐之前,就能把任何粉丝数不超过 2 万的账号从头到尾导出一遍。

#在 Excel 或 Google Sheets 里打开文件而不丢数据

请用导入的方式打开 CSV,不要直接双击:Excel 只保留 15 位有效数字,所以像 1592041833471827968 这样 19 位的 X 账号 ID 会变成 1.59204E+18,最后四位也会变成零(见 Microsoft 支持(在新标签页打开))。

在 followers.csv 中 1592041833471827968 19 位数字,按文本 双击打开 按文本导入 Excel,直接打开 1.59204E+18 1592041833471820000 已丢失 Excel,按文本导入 1592041833471827968 19 位数字完整保留
Excel 会把长数字截断到 15 位,所以打开粉丝文件时,请用能让 ID 列保持为文本的导入方式。
  • Excel: 选择“数据”,再选“从文本/CSV”,选中文件,把“数据类型检测”设为“不检测数据类型”,然后加载。所有列都会以文本形式载入,ID 完好无损。
  • Google Sheets: 选择“文件”,再选“导入”,上传文件,并在导入前取消勾选“将文本转换为数字、日期和公式”(见 Google 的导入帮助(在新标签页打开))。

本指南的两个脚本都把文件保存为带字节顺序标记的 UTF-8,这个标记是文件开头的一个不可见标识,用来告诉 Excel 该如何读取,所以表情符号以及日语、阿拉伯语或西里尔字母的名字都能正常显示。后续一切操作都以 id 为键:用户名会变,账号 ID 永远不变。如果想按计划把同样的列表送进表格,请看把 Twitter 数据导出到 Google Sheets。

须知

简介是自由文本,以 =、+、- 或 @ 开头的简介,在 Excel 里打开时会被当成公式,OWASP 把这种风险称为 CSV 注入(在新标签页打开)。脚本会在这类单元格前面加一个撇号,让它们以纯文本打开。只有当文件是交给代码或数据库,而不是交给用表格软件的人时,才可以去掉这层保护。

#为你的文件选择列

每个粉丝都以完整的公开用户资料返回,共 19 个字段;保留你的任务需要的字段,并且一定要保留 id。

其中十三个字段包含了大多数受众分析所需的内容:这个账号是谁、触达范围多大、有多活跃,以及能不能联系到它。

字段含义示例
id永久账号 ID,以字符串形式发送;用它来匹配文件1592041833471827968
username不带 @ 的用户名;可能会变harbor_street_coffee
display_name个人主页上显示的名称Harbor Street Coffee
description简介文本Small-batch roaster.
location用户自己填写的所在地Portland, OR
followers_count它自己的粉丝数1840
followings_count它关注的账号数312
tweets_count它发布过的推文数2741
created_at账号创建日期,ISO 86012022-11-14T06:28:46Z
verified是否有认证徽章false
can_dm是否接受私信true
protected推文是否受保护false
bio_urls简介里的链接,列表形式https://hsc.example
  • id

    含义
    永久账号 ID,以字符串形式发送;用它来匹配文件
    示例
    1592041833471827968
  • username

    含义
    不带 @ 的用户名;可能会变
    示例
    harbor_street_coffee
  • display_name

    含义
    个人主页上显示的名称
    示例
    Harbor Street Coffee
  • description

    含义
    简介文本
    示例
    Small-batch roaster.
  • location

    含义
    用户自己填写的所在地
    示例
    Portland, OR
  • followers_count

    含义
    它自己的粉丝数
    示例
    1840
  • followings_count

    含义
    它关注的账号数
    示例
    312
  • tweets_count

    含义
    它发布过的推文数
    示例
    2741
  • created_at

    含义
    账号创建日期,ISO 8601
    示例
    2022-11-14T06:28:46Z
  • verified

    含义
    是否有认证徽章
    示例
    false
  • can_dm

    含义
    是否接受私信
    示例
    true
  • protected

    含义
    推文是否受保护
    示例
    false
  • bio_urls

    含义
    简介里的链接,列表形式
    示例
    https://hsc.example

另外六个字段是 favourites_count、media_count、profile_image_url、profile_background_image_url、pinned_tweet_ids 和 possibly_sensitive。

须知

X 的应用和 API 都不会记录一个账号是什么时候关注另一个账号的,所以任何粉丝文件里都没有关注日期。要看谁加入、谁离开,就按计划定期导出列表,再按 id 比对这些文件:新出现的 ID 是新粉丝,消失的 ID 就是已经离开的。

下面的生成器会按你的列表、你的列,以及文件将在哪里打开,改写第 4 步的脚本。

用户名或主页链接。演示用的用户名有 16 个以上字符,所以 X 上不属于任何人。

列表
列
文件用以下方式打开

export.py: GET /followers,7 列,followers.csv

import csv
import requests

URL = "https://api.sorsa.io/v3/followers"
HEADERS = {"ApiKey": "YOUR_API_KEY"}
FIELDS = ["id", "username", "display_name", "description",
          "location", "followers_count", "created_at"]
RISKY = ("=", "+", "-", "@", "\t", "\r")


def cell(value):
    if isinstance(value, list):
        value = " ".join(value)
    if isinstance(value, str) and value.startswith(RISKY):
        value = "'" + value  # opens as text, never a formula
    return value


def export(username, path="followers.csv"):
    params = {"username": username}
    with open(path, "w", newline="", encoding="utf-8-sig") as f:
        out = csv.writer(f)
        out.writerow(FIELDS)
        while True:
            r = requests.get(URL, headers=HEADERS, params=params)
            r.raise_for_status()
            page = r.json()
            for user in page.get("users", []):
                out.writerow([cell(user.get(k)) for k in FIELDS])
            cursor = page.get("next_cursor")
            if not cursor:
                break
            params["next_cursor"] = cursor


export("northwind_roasters")

选择列表和列;脚本和文件名会随之变化。

#获取一批账号的粉丝数

要一次提取许多账号的粉丝数,就每次请求向 GET /info-batch(在新标签页打开)发送最多 100 个用户名或用户 ID:每份用户资料都带着 followers_count、followings_count 和 tweets_count 返回,每 1,000 份 $0.014 起。

在 handles.txt 里每行放一个用户名,然后运行脚本;它会写出 counts.csv,每个账号一行。

Python
import csv
import requests

URL = "https://api.sorsa.io/v3/info-batch"
HEADERS = {"ApiKey": "YOUR_API_KEY"}
COLUMNS = ["username", "followers_count", "followings_count",
           "tweets_count"]

with open("handles.txt", encoding="utf-8") as f:
    handles = [h.strip().lstrip("@") for h in f if h.strip()]

with open("counts.csv", "w", newline="", encoding="utf-8-sig") as f:
    out = csv.writer(f)
    out.writerow(COLUMNS)
    for i in range(0, len(handles), 100):
        batch = {"usernames": handles[i:i + 100]}
        r = requests.get(URL, headers=HEADERS, params=batch)
        r.raise_for_status()
        for user in r.json().get("users", []):
            out.writerow([user.get(k) for k in COLUMNS])

1 万个账号需要 100 次请求,免费的 100 次正好全部覆盖;同样的列表,官方 X API 每个用户收费 $0.010,共 $100。

把你的 X 存档变成完整的粉丝列表

X 的数据存档(在新标签页打开)包含你自己的粉丝,但其中的 data/follower.js 文件对每个粉丝只列出一个 accountId 和一个链接:没有名称、没有简介、没有计数。把这些 ID 作为 user_ids 发给 GET /info-batch,每次 100 个,每一行就变成了完整的用户资料。

data/follower.js,你的 X 存档 "follower": { "accountId": "1592041833471827968" } 只有 ID 和链接,没有名字 GET /info-batch 每次请求 100 个 ID Harbor Street Coffee @harbor_street_coffee 1,840粉丝 312关注 简介、位置,2022 年 11 月加入 每个粉丝 19 个字段
存档只用数字告诉你谁关注了你;每 100 个 ID 发一次批量请求,就能把名称和计数补回来。
Python
import json

with open("data/follower.js", encoding="utf-8") as f:
    raw = f.read()
rows = json.loads(raw[raw.index("["):])
ids = [row["follower"]["accountId"] for row in rows]
# send ids[i:i + 100] as "user_ids" to GET /info-batch

存档只涵盖你登录的那个账号,而且可能要几天才能送达,所以适合一次性备份自己的列表。而 API 这条路线,今天就能拿到任何公开账号的数据。

#各种导出粉丝的方式对比

只有 API 能翻到任何公开账号列表的末尾;这几种方式在配置、每行包含的内容以及每 1,000 个粉丝的价格上各不相同。

方式谁的列表你能得到什么每 1,000 个粉丝的成本
Sorsa API任意公开账号,每一页每个粉丝 19 个用户资料字段,你的 X 账号不会有风险$0.007 起
官方 X API任意公开账号用户资料,前提是开通开发者账号并拿到 OAuth 令牌$10.00
浏览器扩展任意公开账号,仅限会话有效期间通过你已登录的 X 账号读取的行;免费版只能导出几百行超出免费版后需订阅
X 数据存档仅你自己的账号账号 ID 和链接,没有名称,几天后才就绪免费
  • Sorsa API

    谁的列表
    任意公开账号,每一页
    你能得到什么
    每个粉丝 19 个用户资料字段,你的 X 账号不会有风险
    每 1,000 个粉丝的成本
    $0.007 起
  • 官方 X API

    谁的列表
    任意公开账号
    你能得到什么
    用户资料,前提是开通开发者账号并拿到 OAuth 令牌
    每 1,000 个粉丝的成本
    $10.00
  • 浏览器扩展

    谁的列表
    任意公开账号,仅限会话有效期间
    你能得到什么
    通过你已登录的 X 账号读取的行;免费版只能导出几百行
    每 1,000 个粉丝的成本
    超出免费版后需订阅
  • X 数据存档

    谁的列表
    仅你自己的账号
    你能得到什么
    账号 ID 和链接,没有名称,几天后才就绪
    每 1,000 个粉丝的成本
    免费

浏览器扩展在你自己的 X 会话里滚动列表,所以每次导出都以你的账号身份进行,一款热门扩展的商店页面甚至建议专门为导出另建一个 X 账号。Sorsa API 从不索要你的 X 登录信息或 Cookie,所以导出不会让你的任何 X 账号陷入风险,浏览器里也不需要安装任何东西。

#先免费导出 2 万个粉丝

要导出任意公开账号的完整粉丝列表,用 Sorsa API:每次请求 200 个粉丝,每 1,000 个 $0.007 起,前 2 万个粉丝免费,无需绑卡。拿一个密钥,粘贴第 4 步的脚本,再按上面的导入步骤打开文件。同样的 cursor 循环也能导出账号的推文,下载某个用户的全部推文里就是这么做的。

#常见问题

提取 Twitter 关注列表,最好的工具是什么?

Sorsa API:GET /follows 返回任意公开账号的完整关注列表,每次请求 200 个账号,每 1,000 个 $0.007 起,只需一个 API 密钥。评判任何工具都看四点:能不能翻到列表末尾、每 1,000 个的价格、是不是以你的 X 账号身份运行,以及速度。Sorsa API 四点都满足:每一页都能取到,比官方 X API 便宜 1,000 倍,对你的账号没有风险,每秒 20 次请求。

我能导出别人的 Twitter 粉丝吗?

可以,只要这个账号是公开的:把它的用户名、用户 ID 或个人主页链接传给 Sorsa API 的 GET /followers,再用 cursor 翻页即可。Sorsa API 从不索要你的 X 登录信息或 Cookie。受保护的账号只向它批准过的人展示粉丝,所以没有任何工具能导出它们;对这类账号的请求会失败,而且不收费。

怎样在 X 上看到某人的完整关注列表?

把它导出来。X 展示别人的关注列表时,只是一个要滚动的信息流,既不能搜索、不能筛选,也不能下载,所以要读到全部内容,靠谱的办法就是导出文件。Sorsa API 的 GET /follows 会返回公开个人主页关注的每个账号,每次请求 200 个;免费的Twitter 最近新增粉丝追踪器不用写代码,就能显示最新的 20 个关注。

有没有免费导出 Twitter 粉丝的办法?

有,三种。免费的“把 Twitter 粉丝导出为 CSV”工具,可以保存任意公开账号最新的 200 个粉丝。每个 Sorsa API 账号起步就有 100 次免费请求,足够导出前 2 万个粉丝,无需绑卡,也不会过期。X 自己的存档也是免费的,但它只涵盖你的账号,而且把粉丝列成没有名称的 ID。

导出 Twitter 粉丝需要爬虫或浏览器扩展吗?

不需要。Sorsa API 是 REST API:带着你的密钥发一次请求,就返回干净的 JSON,浏览器里什么都不用运行,也不需要 X 账号,所以导出用一段简短的脚本就能完成。浏览器扩展是通过你已登录的 X 会话读取列表的,免费版最多只能导出几百行;Sorsa API 可以翻到列表末尾,而且从不碰你的 X 账号。

#我们如何核实

2026 年 11 月 2 日,我们把本指南里的每个接口、参数、页面大小和响应字段,与 Sorsa API 的实时接口文档(45 个接口)以及 /followers、/follows、/verified-followers 和 /info-batch 的文档页面做了比对;示例响应使用的是演示账号。官方 X API 的价格及其粉丝接口来自 docs.x.com,也是当天读取的。Excel 的 15 位限制来自 Microsoft 支持,公式风险来自 OWASP,导入步骤来自 Google 的 Sheets 帮助。

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

更新内容
  • 从头重写:四步导出完整列表,涵盖关注列表和认证粉丝、Excel 安全的文件、一批账号的粉丝数、把存档里的 ID 转成用户资料,并对照 docs.x.com 核实了价格。
  • 首次发布。