问答
微博的 uid、mid 和 bid 分别是什么?
简短回答
uid 是账号的数字 ID,mid 是单条微博的数字 ID(现在是 16 位),bid 是同一个 mid 的 base62 写法,也就是 weibo.com/<uid>/<bid> 链接里那 9 位短码。okdata 的微博搜索把 mid 放在 id 里、把 bid 放在 url 里返回,每页 $0.002;微博账号信息接口要传数字 uid,每次 $0.002。
微博常见的标识有三个,其中两个其实是同一个数字换了身衣服。uid 指账号,mid 指一条微博,bid 是这条微博的 mid 用 base62 编码后的样子,就是你在微博地址里看到的那段:weibo.com/6082913457/Qkz3PvVLT 里,前面是作者的 uid,后面是 bid。
三个放在一起看
| uid | mid | bid | |
|---|---|---|---|
| 指什么 | 账号 | 一条微博 | 一条微博 |
| 格式 | 数字,一般 10 位 | 数字,现在的微博是 16 位 | 9 个字符,取自 0-9、a-z、A-Z |
| 例子 | 6082913457 |
5249013377610245 |
Qkz3PvVLT |
| 在哪见到 | weibo.com/u/<uid>、各处的作者信息 |
网页版和 App 的 JSON(mid、idstr) |
微博链接(网页 JSON 里叫 mblogid) |
叫法并不统一。微博网页版和 App 的 JSON 里,mid 是数字字符串,短码叫 mblogid;而官方开放平台的文档里,id 是数字,“MID”反倒指 base62 那种写法:statuses/querymid 把数字 ID 换成 8Ras3qlz 这样的码,statuses/queryid 再换回来。哪个工具让你填“mid”,先确认它要的是纯数字还是字母数字混合。
mid 怎么换成 bid
把数字 mid 从右往左每 7 位切一段。每段用字母表 0-9a-zA-Z 写成 62 进制,除了最左边那段,其余都左补 0 到 4 位。最后拼起来。
以 5249013377610245 为例:切成 52、4901337、7610245 三段;换成 62 进制分别是 Q、kz3P、vVLT;拼起来就是 Qkz3PvVLT。反过来时,把 bid 从右往左每 4 位切一段,逐段解码,再左补 0 到 7 位。我们拿 6 条真实微博核对过,它们的数字 mid 和链接短码出自同一次返回,6 条全部对得上。
okdata 收什么、返回什么
| 接口 | 传什么 | 返回什么 | 费用 |
|---|---|---|---|
| 微博搜索 | query |
id 是 mid,url 是 weibo.com/uid/bid,author.id 是 uid |
每页 $0.002 |
| 微博账号信息 | id 传数字 uid |
账号资料,id 即 uid |
$0.002 |
账号设置了个性域名时,author.username 里是这个域名,也就是 weibo.com/somebrand 这种链接里 weibo.com/ 后面那段。账号信息接口不认个性域名,要传数字的 author.id。
示例
import os, requests
ALPHA = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
def mid_to_bid(mid: str) -> str:
parts, end = [], len(mid)
while end > 0:
start = max(0, end - 7)
n, code = int(mid[start:end]), ""
while n:
n, r = divmod(n, 62)
code = ALPHA[r] + code
parts.insert(0, code.rjust(4, "0") if start else code or "0")
end = start
return "".join(parts)
assert mid_to_bid("5249013377610245") == "Qkz3PvVLT"
body = requests.get("https://api.okdata.online/v1/weibo/posts/search", timeout=60,
headers={"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"},
params={"query": "新品发布", "fields": "id,url,author.id,author.username"}).json()
for p in body["data"]["items"]:
print(p["author"]["id"], p["id"], mid_to_bid(p["id"]), p["url"])
限制
- mid 和 uid 都按字符串存。16 位的 mid 超过了 Excel 保留的 15 位有效数字,JavaScript 里也别拿它做运算。
- 接口目录里没有按 ID 取单条微博的接口。mid 或 bid 能告诉你是哪一条,但在这里要通过搜索才能拿到微博内容。
- 改昵称不会改 uid,所以账号要按 uid 来区分,不要按昵称或个性域名。
知道 uid 想查粉丝数等资料,见知道微博 UID,怎么拿到粉丝数和账号资料。
资料来源
- 微博开放平台:statuses/querymid(数字 ID 转 base62 的 MID)
- 微博开放平台:statuses/queryid(base62 的 MID 转数字 ID)
- 微博开放平台:users/show
这个问题出现过的地方(读取于 2026-11-12)
更新于