# b23.tv 短链是什么，怎么从里面拿到 B 站视频 ID？

> b23.tv 是 B 站自己的短链域名。短链怎么跳转、怎样免费读出 BV 号，以及怎样直接把短链交给视频详情接口。

网页版：https://okdata.online/zh/answers/bilibili-b23-short-link/

**简短回答：**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 号](/zh/answers/bilibili-bv-vs-av-number/) |
| `https://b23.tv/` 加分享按钮生成的短码 | 完整页面，`?` 后面常带分享追踪参数 | 不能，要跟一次跳转 |

前两种我们在 2026 年 11 月 12 日用 `curl -I` 实测过：都返回 302，目标是 `www.bilibili.com/video/` 开头的地址。短码也不只给视频用，App 里带分享按钮的东西，比如直播间、专栏文章，基本都会生成短码。先看清跳转目标，再认定它是 BV 号。

## 两种拿法

**自己解析。**发一个不跟随跳转的请求，读响应头里的 `Location`，用 `BV[0-9A-Za-z]{10}` 匹配出来。不花钱，适合少量链接。请求放在不会被 B 站拦的服务器上跑，频率别太高。

**交给接口解析。**[B站视频详情](/zh/apis/bilibili/videos/get/)可以直接把短链作为 `url` 传进去，接口会跟随跳转并返回视频：`id` 就是 BV 号，加上 `view=full` 还会带 `ext.aid`、`ext.cid`，以及播放、点赞、投币和弹幕数。反正也要拿数据，或者不想自己写跳转逻辑时，用这个省事。

| 要做的事 | 调用次数 | 费用 |
|---|---|---|
| 一条分享链接转 BV 号并拿数据 | 1 | $0.002 |
| 一次投放收集的 500 条链接 | 500 | $1.00 |
| 只要 BV 号，自己解析 | 0 | 免费 |

## 示例

```python
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](/zh/answers/douyin-share-link-to-video-id/)。

## 用到的接口

- [B站视频详情](https://okdata.online/zh/apis/bilibili/videos/get/) `bilibili.videos.get`：$0.002/次

## 更多B站内容

- [B站 API](https://okdata.online/zh/apis/bilibili/)
- [B站 API Python 教程：搜索、视频数据、评论和热门榜（2026）](https://okdata.online/zh/guides/bilibili-api-python/)
- [知道 BV 号，怎么拿到播放、投币和弹幕数？](https://okdata.online/zh/answers/bilibili-bv-id-video-stats/)
- [B 站 BV 号和 AV 号是什么关系，数据库里该存哪个？](https://okdata.online/zh/answers/bilibili-bv-vs-av-number/)
- [想找某个领域的 B 站 UP 主做推广，怎么筛？](https://okdata.online/zh/answers/bilibili-find-up-creators-for-sponsorship/)
- [B 站的 mid（UID）是什么，从哪里拿到？](https://okdata.online/zh/answers/bilibili-mid-uid/)
- [B站热门榜有接口吗？](https://okdata.online/zh/answers/bilibili-popular-board-api/)
- [内容详情接口](https://okdata.online/zh/roles/posts-get/)
- [B站热搜榜：今日榜单](https://okdata.online/zh/tools/hot-search/bilibili/)

## 资料来源

- [yt-dlp 的 B 站提取器：短链解析后落到的 bilibili.com/video/ 地址格式](https://github.com/yt-dlp/yt-dlp/blob/master/yt_dlp/extractor/bilibili.py) (读取于 2026-11-12)

这个问题出现过的地方（读取于 2026-11-12）：

- https://github.com/Hanschase/BiliAnalysis/issues/2
- https://github.com/mengshouer/nonebot_plugin_analysis_bilibili/issues/15
- https://github.com/InfinityLoop1308/PipePipe/issues/93

更新于 2026-11-12
