问答
不用官方 API,怎么查推特账号的粉丝数?
简短回答
把用户名传给 X 账号信息接口,就能拿到粉丝数、关注数、发帖总数、简介、认证状态和头像,每个账号 $0.001,不需要 X 开发者账号。给 300 个账号按粉丝排序要 $0.30,一个季度里每周刷新一次共 $3.90。
手上有一张表,300 个可能合作的 X 博主账号,周一开会前要按粉丝数排好。X 账号信息传入用户名,带不带 @ 都行,把主页上的数字整理成字段返回。Stack Overflow 上的老回答会教你不用 token 的办法,比如直接读主页或者小组件链接。X 收紧未登录访问之后,这些办法大多已经失效,别指望它们。
能拿到的字段
| 字段 | 含义 |
|---|---|
followers |
粉丝数 |
following |
关注数 |
posts |
发帖总数,含回复和转发 |
likes |
点赞过的帖子数,有的话返回 |
verified |
蓝标或旧版认证 |
bio、name、avatar_url、url |
主页基本信息 |
加上 view=full,还会返回 ext.created_at(注册时间)、ext.location、ext.media_count 和 ext.verified_type。
从用户名 CSV 到排好序的名单
import csv, os, requests
API = "https://api.okdata.online/v1"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
rows = []
for handle in [r[0] for r in csv.reader(open("handles.csv")) if r]:
body = requests.get(f"{API}/x/users/get", headers=H,
params={"username": handle, "view": "full"}, timeout=60).json()
if body["code"] != "ok":
rows.append([handle, body["code"]]) # not_found:改名、被封或不存在
continue
u = body["data"]["item"]
rows.append([u["username"], u["followers"], u["following"], u["posts"], u["verified"], u["ext"]["created_at"]])
found = sorted((r for r in rows if len(r) > 2), key=lambda r: r[1] or 0, reverse=True)
with open("ranked.csv", "w", newline="", encoding="utf-8") as f:
csv.writer(f).writerows(found + [r for r in rows if len(r) == 2])
费用
| 任务 | 调用次数 | 费用 |
|---|---|---|
| 一个账号 | 1 | $0.001 |
| 300 个账号 | 300 | $0.30 |
| 300 个账号,每周一次,13 周 | 3,900 | $3.90 |
不存在的用户名返回 not_found,不扣费。
需要知道的几点
- 粉丝数是某一时刻的快照。想看增长,每次跑完连同日期一起存下来,X 不提供粉丝数的历史记录。
- 用户名会变。博主改名后旧用户名会返回
not_found,所以第一次查到时就把账号id存下来,当作不变的主键。 - 接口目录里只有总数,没有粉丝列表,查不到具体谁关注了谁。
- 被封禁的账号同样返回
not_found,筛选合作博主时这本身也是个有用的信号。
其他办法
X 官方 API 的用户公开指标里也有这些数,按量付费下每读一个用户 0.010 美元。已经有开发者账号,或者需要粉丝列表,就用官方的。只看几个账号的话,手动打开主页看一眼就行,不花钱。跨平台筛选博主的完整做法见博主发现方案。
更新于