问答
b23.tv 短链是什么,怎么从里面拿到 B 站视频 ID?
简短回答
b23.tv 是 B 站的短链域名:访问短链会收到一个 HTTP 跳转,指向完整的 bilibili.com 页面,视频的 BV 号就在跳转后的地址里。可以自己读跳转地址,不花钱;也可以把短链作为 url 传给 okdata 的 B站视频详情接口,它会帮你解析,并连同视频数据一起返回 BV 号,每次 $0.002。
在 B 站 App 里点分享,复制出来的文字末尾是一个 b23.tv 链接,比如 【开箱】这台键盘有点东西 https://b23.tv/k9Xq2Rm。b23.tv 是 B 站自己的短链域名。短链本身不带任何数据,访问它会得到一个 HTTP 302 跳转,指向完整的 bilibili.com 地址;如果分享的是视频,这个地址里就有 BV 号。
常见的几种短链
| 短链 | 跳转到 | 不解析能看出 ID 吗 |
|---|---|---|
https://b23.tv/BV1... |
https://www.bilibili.com/video/BV1... |
能,路径就是 BV 号 |
https://b23.tv/av170001 |
https://www.bilibili.com/video/av170001 |
能看到 aid,再转成 BV 号 |
https://b23.tv/ 加分享按钮生成的短码 |
完整页面,? 后面常带分享追踪参数 |
不能,要跟一次跳转 |
前两种我们在 2026 年 11 月 12 日用 curl -I 实测过:都返回 302,目标是 www.bilibili.com/video/ 开头的地址。短码也不只给视频用,App 里带分享按钮的东西,比如直播间、专栏文章,基本都会生成短码。先看清跳转目标,再认定它是 BV 号。
两种拿法
**自己解析。**发一个不跟随跳转的请求,读响应头里的 Location,用 BV[0-9A-Za-z]{10} 匹配出来。不花钱,适合少量链接。请求放在不会被 B 站拦的服务器上跑,频率别太高。
交给接口解析。B站视频详情可以直接把短链作为 url 传进去,接口会跟随跳转并返回视频:id 就是 BV 号,加上 view=full 还会带 ext.aid、ext.cid,以及播放、点赞、投币和弹幕数。反正也要拿数据,或者不想自己写跳转逻辑时,用这个省事。
| 要做的事 | 调用次数 | 费用 |
|---|---|---|
| 一条分享链接转 BV 号并拿数据 | 1 | $0.002 |
| 一次投放收集的 500 条链接 | 500 | $1.00 |
| 只要 BV 号,自己解析 | 0 | 免费 |
示例
import os, re, requests
API = "https://api.okdata.online/v1/bilibili/videos/get"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
BV = re.compile(r"BV[0-9A-Za-z]{10}")
def link_from_share_text(text: str) -> str:
m = re.search(r"https?://b23\.tv/[0-9A-Za-z]+", text)
if not m:
raise ValueError("分享文字里没有 b23.tv 链接")
return m.group(0)
def bvid_free(short: str) -> str | None:
r = requests.head(short, allow_redirects=False, timeout=15)
m = BV.search(r.headers.get("Location", ""))
return m.group(0) if m else None
def video_via_api(short: str) -> dict:
body = requests.get(API, headers=H, timeout=60, params={
"url": short, "view": "full",
"fields": "id,title,metrics.views,ext.aid"}).json()
if body["code"] != "ok":
raise RuntimeError(f'{body["code"]}: {body["message"]}')
return body["data"]["item"]
link = link_from_share_text("【开箱】这台键盘有点东西 https://b23.tv/k9Xq2Rm")
print(bvid_free(link) or video_via_api(link)["id"])
限制
- 传链接,不要把整段分享文字传进去:
url只能是一个 http(s) 地址。 - 短链指向直播间、个人空间或专栏时,视频详情读不了,这次调用会失败,不扣费。
- 视频已删除或设为私密时返回
not_found,不扣费。 - 短链可能带着和分享人有关的追踪参数。存库或公开之前,把
?后面的部分去掉。
抖音、小红书的分享短链也是同样的套路,只是域名不同,见怎么把抖音分享链接转成视频 ID。
资料来源
这个问题出现过的地方(读取于 2026-11-12)
更新于