开源本地工具箱:将任意 http(s) URL 包装为 B 站会员购 jump.html 长链,并调用公开分享接口签发官方 b23.tv 短链。
🚧 2026-08 状态:B 站已封堵该跳转链路,本项目暂时不维护。
d.bilibili.com的 schema 中转已下线(改为引导页),mall.bilibili.com落地被 App 列为非官方域名拦截,生成的短链在 B 站 App 内不再跳转到目标站。短链签发功能仍可用,但包装跳转能力已失效。
⚠️ 请先阅读 DISCLAIMER.md。
本项目非 B 站官方产品;仅供学习、研究与本地实验。请遵守法律与平台规则。
生成的 b23.tv 不会在普通浏览器里直接打开你填的网址;且 2026-08 起 B 站 App 内也不再跳转(d.bilibili.com schema 中转下线 + mall.bilibili.com 被 App 域名白名单拦截)。
| 打开方式 | 常见结果 |
|---|---|
| B 站 App 内点击短链 | 已失效(2026-08):停在引导页/“该页面不存在”,不再跳转目标站 |
| 系统浏览器 / 微信内置浏览器等 | 停在 d.bilibili.com 或官方中转/唤起页,不会自动跳到目标站 |
| 仅复制链接到电脑 Chrome 打开 | 同样通常到不了目标站 |
请把短链当作「需在 B 站客户端内打开」的链接,而不是通用外链短址。
| 能力 | 说明 |
|---|---|
| 长链包装 | 目标 URL → mall.bilibili.com/jump.html?Url=... |
| 官方短链 | POST /x/share/click → https://b23.tv/xxxxx |
| Web UI | 浏览器本地操作 |
| CLI | 命令行一键生成 |
| HTTP API | POST /api/generate 便于脚本集成 |
零第三方 Python 依赖(仅标准库)。
在线演示站由服务端同源代理提供,支持完整签发 b23.tv 短链;也可以本机运行(见下)。
https://github.com/LING71671/b23wrap
git clone https://github.com/LING71671/b23wrap.git
cd b23wrap- Python 3.10+
- 可访问
https://api.bilibili.com
为什么需要同源代理:浏览器跨域请求 B 站接口时,响应没有
Access-Control-Allow-Origin,JS 读不到 JSON(且带外部 Referer 时还可能被 WAF 403)。
差的就是「同源代理」:python app/server.py代请求 B 站,前端只访问/api/generate。在线演示站 https://b23.int0.cc/ 已部署该服务,可直接使用。
# Windows 推荐双击
start.bat
# 或
python app/server.py浏览器打开:http://127.0.0.1:8765/(不要用 file:// 打开 html)
在线演示站(https://b23.int0.cc/)已部署完整服务,可直接**签发 b23**、切换 C1–C5;也可以按上面方式本机运行。
python scripts/cli.py https://www.example.com
python scripts/cli.py https://www.example.com --long-only # 仅输出包装长链
python scripts/cli.py https://www.example.com --json
python scripts/cli.py https://www.example.com --chain c2 # 备用签发域名
python scripts/cli.py https://www.example.com --chain nest2 # 双层嵌套 C4# 健康检查
curl http://127.0.0.1:8765/api/health
# 生成(示例用 Python,避免 shell 转义问题)
python -c "import urllib.request,json; print(urllib.request.urlopen(urllib.request.Request('http://127.0.0.1:8765/api/generate', data=json.dumps({'url':'https://www.example.com'}).encode(), headers={'Content-Type':'application/json'})).read().decode())"| 方法 | 路径 | 请求体 | 说明 |
|---|---|---|---|
| GET | /api/health |
— | 服务状态 |
| POST | /api/generate |
{"url":"https://..."} 可选 chain / api_host |
返回 short_url / long_url / chain 等 |
b23wrap/
├── app/
│ ├── core.py # 核心逻辑(L0)
│ ├── server.py # 本地 HTTP 服务
│ └── static/ # Web UI
├── scripts/
│ └── cli.py # 命令行入口
├── docs/
│ ├── chains.md # 链路备份(主文在 README)
│ ├── mechanism.md # 机制摘要
│ └── abuse-model.md # 安全实验威胁模型
├── needtest.md # 实验清单
├── report/ # 实验记录与 SUMMARY
├── LICENSE # GPL-3.0
├── DISCLAIMER.md # 免责声明(必读)
├── CONTRIBUTING.md
├── SECURITY.md
├── CHANGELOG.md
├── start.bat
└── README.md
以下链路均已在 B 站 App 内验证:打开生成的 b23.tv 可到达外站目标 T(实验用过 https://www.baidu.com)。
浏览器打不开 不算 成功/失败依据。
| ID | 说明 | CLI | App |
|---|---|---|---|
| C1 | 标准三层:mall/web → d. → jump → 签发 |
默认 | ✅ |
| C2 | 同 C1,签发 host 换 api.biliapi.net |
--chain c2 |
✅ |
| C3 | 与 C1 同构(必杀 scheme = mall/web) |
同 C1 | ✅ |
| C4 | 双层嵌套 C1(C1(T)) | --chain nest2 |
✅(可多一次站内跳) |
| C5 | 外层再 jump?Url= 包一层 C1 长链 |
--chain nest-jump |
✅ |
flowchart TB
B[用户点击 b23.tv/xxx]
B --> R[302 → 站内长链]
R --> APP{打开环境}
APP -->|B 站 App| SCH[解析 jump / schema / mall/web]
SCH --> OUT[到达外站 T]
APP -->|系统浏览器等| STAY[常停中转页]
STAY --> X[通常到不了 T]
flowchart TB
T[外站 T]
C1[C1 标准三层]
C2[C2 换签发 host]
C4[C4 双层]
C5[C5 jump 套 C1]
B[b23.tv]
APP[B 站 App]
OUT[到达 T]
T --> C1
C1 --> B
C1 --> C2 --> B
C1 --> C4 --> B
C1 --> C5 --> B
B --> APP --> OUT
flowchart LR
T["外站 T"]
S["bilibili://mall/web?url=T"]
D["d.bilibili.com/?schema=S"]
J["mall.bilibili.com/jump.html?Url=D"]
API["POST api.bilibili.com/x/share/click<br/>share_id=public.webview.0.0.pv<br/>oid=J"]
B["b23.tv/xxxxx"]
T --> S --> D --> J --> API --> B
T
→ bilibili://mall/web?url=<T>
→ https://d.bilibili.com/?schema=...
→ https://mall.bilibili.com/jump.html?Url=...
→ POST /x/share/click → https://b23.tv/...
python scripts/cli.py https://www.example.com包装与 C1 完全相同,仅签发改为 https://api.biliapi.net/x/share/click。
flowchart LR
J["C1 长链 J"]
A1["api.bilibili.com/x/share/click"]
A2["api.biliapi.net/x/share/click"]
B["b23.tv"]
J --> A1 --> B
J --> A2 --> B
python scripts/cli.py https://www.example.com --chain c2
# 或
python scripts/cli.py https://www.example.com --api-host biliapi实现与 C1 相同。App 实测对比:只有 bilibili://mall/web?url=T 能稳定到外站;link / http / webview 等会失败。
flowchart TB
subgraph ok [App 已证实]
MW["bilibili://mall/web?url=T"]
end
subgraph no [App 未形成有效落地]
L["bilibili://link?url=T"]
H["bilibili://http?url=T"]
V["bilibili://webview?url=T"]
end
MW --> APP[App 内到 T]
L --> FAIL[网页无法打开等]
H --> FAIL
V --> FAIL
把 整条 C1 长链 再当作目标,再做一次 C1 包装后签发。App 可到 T,过程中可能多跳一次 bilibili 站内页。
flowchart LR
T[外站 T]
J1[C1 长链 J1]
J2[C1 再包装 J1 → J2]
API[share/click oid=J2]
B[b23.tv]
T --> J1 --> J2 --> API --> B
flowchart TB
B[b23] --> APP[B 站 App]
APP --> MID[可能多一次站内跳]
MID --> OUT[仍到达 T]
python scripts/cli.py https://www.example.com --chain nest2内层完整 C1,外层再包:jump.html?Url=<C1长链>,再签发。
flowchart LR
T[外站 T]
J1[C1 长链]
J2["jump.html?Url=J1"]
API[share/click oid=J2]
B[b23.tv]
T --> J1 --> J2 --> API --> B
python scripts/cli.py https://www.example.com --chain nest-jump| 形态 | 签发 | App |
|---|---|---|
jump.html?Url=T 裸外站(无 mall/web) |
可 | ❌ 空白页 |
d.bilibili.com?schema=https://T |
可 | ❌ 无跳转 |
bilibili://link / http / webview |
部分可 | ❌ / 不稳定 |
外站直接当 public.webview 的 oid |
否 | — |
| 点 | 说明 |
|---|---|
| 短链真实性 | 由 B 站服务签发,非本工具伪造域名 |
| 跳转场景 | 仅在 B 站 App 内打开短链才可能到目标站 |
| 普通浏览器 | 通常到不了目标站 |
| 客户端策略 | 版本/风控可能影响 |
API:POST /api/generate 可带 "chain":"c1"|"c2"|"c4"|"c5"、"api_host":"biliapi"。
实验记录(可选):report/SUMMARY.md · docs/mechanism.md
完整条款见 DISCLAIMER.md。 摘要:
- 非官方、无担保、使用者自担责任;
- 禁止用于欺诈、违法或误导性用途;
- 使用本软件即视为接受免责声明。
见 CONTRIBUTING.md。欢迎 Issue / PR(文档、兼容性、错误处理等)。
见 SECURITY.md。请勿在 Issue 中公开可被滥用的实时攻击细节。
GPL-3.0 © b23wrap contributors
第三方商标(哔哩哔哩 / bilibili / b23.tv 等)归其权利人所有。