如何导出 Twitter 的全部粉丝
X 没有导出按钮,所以要保存公开账号的全部粉丝,就得通过 API 每次读取 200 个,把每一页追加到 CSV 文件里:100 万个粉丝需要 5,000 次请求。
简短回答: 每次请求返回一页粉丝,外加指向下一页的 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 个粉丝就到了。
-
获取密钥。 注册后,从控制台复制你的 API 密钥。前 100 次请求免费,无需绑卡。
-
请求第一页。 把账号的用户名发给
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" } -
跟着 cursor 走。 从响应里读出
next_cursor,作为next_cursor参数传回去。当它返回为空或不存在时,列表就取完了。一个有 5,000 个粉丝的账号需要 25 次请求。每一页到达时就写入文件,没有 cursor 的那一页标志着导出结束。 -
把每一页写入文件。 页面到达时就追加行,这样即使导出 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 份用户资料 |
关注某个账号的账号
- 接口
GET /followers- 每次请求
- 最多 200 个粉丝
某个账号关注的账号
- 每次请求
- 最多 200 个账号
仅其认证粉丝
- 每次请求
- 一页,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 支持(在新标签页打开))。
- 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 8601 | 2022-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 上不属于任何人。
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,每个账号一行。
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 个,每一行就变成了完整的用户资料。
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 reference: Followers(在新标签页打开)
- Sorsa API reference: User Profile (Batch)(在新标签页打开)
- X API pricing(在新标签页打开)
- X API: Get followers(在新标签页打开)
- Microsoft Support: Keeping leading zeros and large numbers(在新标签页打开)
- OWASP: CSV Injection(在新标签页打开)
- Google Docs Editors Help: Import data sets and spreadsheets(在新标签页打开)
- X Help Center: How to download your X archive(在新标签页打开)