推特用户 ID:用户名和 ID 怎么互转,以及为什么这很要紧
推特用户 ID:用户名和 ID 怎么互转,以及为什么这很要紧
每个 X 账号都有两个标识符,而把它们搞混会导致一类特定且相当难缠的 bug。
用户名 —— @nasa。人类可读、到处可见,而且★随时可以改★。
数字 ID —— 类似 11348282。注册时分配、★在账号的整个生命周期里永不改变★,而且在界面里看不到。
★界面只给你看其中一个,而稳定的那个恰恰是你看不到的。★
为什么这比听起来更要紧
★用户名是会被回收的。 有人改掉用户名之后,旧的那个就变成任何人都能抢注的。★
想想这对一个以用户名为键的系统意味着什么:
- 你在监控名单里存了
@acmecorp - 他们改名成
@acmehq - 你的系统现在在盯
@acmecorp—— 它要么 404,要么属于一个完全不相干的人
⚠️ ★第二种才是危险的那个。 你的监控继续正常工作、继续返回数据,而这些数据是关于一个陌生人的。★ 没有任何报错来提醒你。 而一个以 ID 为键的系统会自动跟上这次改名,因为 ID 没有动。
故障形态本身就是线索: 以用户名为键的系统,坏起来的样子是"这个账号消失了"而不是"这个账号改名了" —— 这会把人引向完全错误的排查方向。
存一次 ID、之后都按 ID 查,是一个两行的改动 —— 两个方向都是一个调用。
从用户名拿到 ID
简单的那个方向。任何资料查询都会返回它:
import requests
BASE = "https://api.socialapi.tech"
KEY = "your_api_key"
HDRS = {"X-API-Key": KEY}
def handle_to_id(username):
r = requests.get(f"{BASE}/v1/user/info",
params={"username": username},
headers=HDRS, timeout=60)
if r.status_code == 404:
return None # 这个用户名当前不存在
r.raise_for_status()
return r.json()["data"]["id"]
print(handle_to_id("nasa"))
★ID 是以字符串返回的,不是数字。★ X 的 ID 超出了某些语言的标准整数范围,JavaScript 尤其会在 2^53 以上静默丢精度 —— 这个 bug 会产生差一两位的 ID,导致查询失败却看不出原因。从头到尾都当字符串处理。
从 ID 拿到用户名
反方向,也是人们最难找到做法的那个:
def id_to_handle(user_id):
r = requests.get(f"{BASE}/v1/user/info_by_id",
params={"user_id": user_id},
headers=HDRS, timeout=60)
if r.status_code == 404:
return None # 已删除或被封
r.raise_for_status()
d = r.json()["data"]
return d["username"], d["display_name"]
print(id_to_handle("11348282"))
★这就是从改名中恢复的办法。 你存了 ID,用户名变了,一个调用就告诉你它变成了什么。★(两个方向各是一个调用 —— 用户名转 ID、ID 转用户名。) 没有 ID 的话,一个改过名的账号是真的很难再找到 —— 你只能去搜显示名然后碰运气。
做一份能扛住改名的监控名单
如果你在监控账号,这个模式值得采用:
import json, pathlib
STORE = pathlib.Path("watchlist.json")
def resolve_once(handles):
"""首次运行时把用户名转成 ID 并存下来。"""
known = json.loads(STORE.read_text()) if STORE.exists() else {}
for h in handles:
if h not in known:
uid = handle_to_id(h)
if uid:
known[h] = uid
STORE.write_text(json.dumps(known, indent=1))
return known
def refresh(known):
"""按 ID 查询。检测并报告改名,而不是丢掉这个账号。"""
for original, uid in known.items():
result = id_to_handle(uid)
if result is None:
print(f" {original}: 没了(已删除或被封)")
continue
current, name = result
if current.lower() != original.lower():
# ★这个账号没有消失 —— 它改名了★
print(f" {original} → @{current} ({name})")
refresh(resolve_once(["nasa", "esa"]))
⚠️ 这换来的区分是: "没了"和"改名了"变成两个不同的结果,而不是一个让人困惑的结果。以用户名为键的监控会把两者都报成 404 —— 见一个账号不见了到底意味着什么。
一次查很多账号
一个一个解析当然可以,但每个账号一次调用。名单大的时候有批量路径,那是 500 次调用和几次调用的差别 —— 而调用次数正是账单的来源。
无论哪种方式,都要解析一次然后存下来。 ★监控名单应该在你建立它的那天解析,而不是每次运行都解析。★ ID 不会变,重复解析是纯浪费。
做不到的事
明确说清楚,因为这些问题一直有人问:
不能用邮箱地址找账号。 搜索不行,任何接口也不行。X 曾对主动开启的人支持通讯录发现,但那不是一个公开查询功能。
不能用手机号找账号。 同样的答案,同样的原因。★任何声称能做到这两件事的,要么在猜,要么在用泄露的数据集。★
拿不到已删除或被封账号的 ID。 查询会返回空。你之前记录过的话数字还在,但它解析不出任何东西。
看不到某人的历史用户名。 X 不公布曾用名。只有你在改名前后都在观察,才会知道发生过改名。
大家会问的问题
推特用户 ID 是什么? 注册时分配的永久数字标识符。和用户名不同,它永不改变。
怎么查我的推特 ID? 任何资料查询都会返回它。界面里不显示,所以需要一次查询或第三方工具。
怎么把推特 ID 转成用户名? 按 ID 查询会返回当前用户名 —— 这就是反方向,也是改名之后救你的那个。
怎么找到某人的推特 ID? 查他的用户名,ID 会随资料一起返回。这是公开信息。
改用户名后 ID 会变吗? 不会。★这正是要存它的全部理由。★
两个账号能有同一个 ID 吗? 不能。ID 唯一,而且即使账号删除后也不会重新分配。
账号删除后 ID 会怎样? 它不再解析出任何东西。那个数字不会被分给别人。
能用邮箱找推特账号吗? 不能。没有公开的按邮箱查询。
能用手机号找推特账号吗? 不能,原因相同。任何提供这个的都不是正当途径。
我的 ID 查询为什么返回空? 账号已删除、被封,或者 ID 是错的 —— 常见原因是整数精度丢失。检查一下 ID 是不是当字符串处理的。
为什么 ID 必须用字符串? 它超出了某些语言的安全整数范围。JavaScript 在 2^53 以上会静默取整,产生差一两位的 ID,查询失败却看不出原因。
推特用户 ID 有多长? 随注册时间不同。早期账号 ID 很短,近期的是 19 位。
能从 ID 看出账号多老吗? 大致可以 —— ID 越小越老。但它是排序而不是时间戳。资料页的注册日期才是准确数字。
怎么一次查很多账号? 迭代,或者在解析大名单时用批量路径。解析一次并存下来。
该存用户名还是 ID? ★永远存 ID。★ 想展示的话把用户名也存上,但要以 ID 为键。
怎么知道一个账号改了用户名? 按 ID 查询,把返回的用户名和你存的比对。这是唯一可靠的检测方式。
能看到账号以前的用户名吗? 不能。X 不公布用户名历史。
用户 ID 和推文 ID 有什么区别? 两个不同的标识符空间 —— 一个标识账号,一个标识帖子。两者都是永久的,也都应该当字符串处理。
推特 ID 是隐私信息吗? 不是,它是附着在公开资料上的公开信息。
怎么拿到我粉丝的 ID? 粉丝列表返回的是含 ID 的完整资料 —— 见怎么翻粉丝列表。
twitter.com 和 x.com 的 ID 通用吗? 通用。改名换的是域名,不是标识符系统。
能按 ID 的规律搜账号吗? 不能。ID 不可搜索,你只能查某一个具体的。
如果我只有一个旧用户名怎么办? 先试试 —— 如果它 404 或者已经属于别人,而你又从没存过 ID,那么搜显示名是剩下的唯一办法。
有推特 ID 查找工具吗? 任何资料页查询都会返回它 —— ID 随资料页一起回来,所以★根本不需要一个专门的"查找器"★。
怎么按推特 ID 搜索? 直接用 ID 查那个账号。 ★即使改过名它也能解析★,这正是要存 ID 的全部理由。
怎么把 user ID 转成用户名? 用 ID 取资料页,当前用户名就在上面。 ★ID 是那个永远有效的输入。★
怎么用 ID 找一个用户? 同一个调用。★用户名 → ID 是方便;ID → 用户名才是能扛过时间的那个方向。★
能用某人的 ID 搜索他吗? 能,而且这是可靠的那个方向。 ★用户名会被改掉、被别人重新占用;ID 永远不会。★
为什么要存 ID 而不是用户名? ★★因为一个用户名可以被释放、然后被陌生人占用★★ —— 存下来的用户名可能悄无声息地开始指向错的人。
账号改名后 ID 会变吗? 不会。这正是全部要点 —— ★改名会改变一切可见的东西,除了 ID★。
在 App 里能看到 ID 吗? 不能直接看到。 ★它会在任何一次资料页取数时返回★,而这就是几乎所有人拿到它的方式。
如果你要基于它做东西
一条规则覆盖大部分情况:★把用户名解析成 ID 一次、存下 ID、之后都按 ID 查。★
它在初始化时每个账号花一次调用,换来的是消除一整类静默失败 —— 就是那种"你的系统持续返回数据,而那个账号并不是你想盯的那个"。
我们的 API 两个方向都支持 —— 用户名转 ID、ID 转用户名,另外还有解析名单的批量路径。只读、固定按次价格、没有属于你的限流要管。
它做不到的: 用邮箱或手机号找账号。那不是公开查询,而且没有任何正当服务提供它。
延伸阅读:只记得个大概怎么把账号找出来 · 一个账号不见了意味着什么 · 翻粉丝列表 · 调用量的成本。