端点概览
获取全量院校数据,返回包含 2956 条记录的 JSON 数组,建议客户端本地过滤。
院校列表接口
接口地址:https://api.yuki-can.top/schools.json
响应结构
{
"total": 2956,
"data": [
{
"name": "北京大学",
"province": "北京",
"city": "北京",
"type": "综合",
"level": "本科",
"985": true,
"211": true,
"double_first_class": true,
"website": "https://www.pku.edu.cn"
}
// ...
]
}
字段说明
| 字段 | 类型 | 说明 |
| name | string | 院校名称 |
| province | string | 所在省份 |
| city | string | 所在城市 |
| type | string | 院校类型(综合/理工/师范等) |
| level | string | 办学层次(本科/专科) |
| 985 | boolean | 是否 985 高校 |
| 211 | boolean | 是否 211 高校 |
| double_first_class | boolean | 是否双一流 |
| website | string|null | 官网地址,部分院校可能为 null |
使用示例
const res = await fetch('https://api.yuki-can.top/schools.json');
const { data } = await res.json();
// 过滤 985 高校
const s985 = data.filter(s => s['985']);
// 按省份筛选
const hubei = data.filter(s => s.province === '湖北');
// 搜索院校名
const pku = data.find(s => s.name.includes('北京大学'));
端点概览
302 跳转到视频直链(经由 CF Worker 视频代理,自动处理 CDN 防盗链),VRChat 可直接播放。支持 BV 号、B站 URL、b23.tv 短链。带 IP 限流保护(20次/日,同BV不重复计数)。
仅解析 BV 号和分P信息,返回 JSON { bv, part },不请求 B站 API。支持 BV 号、B站 URL、b23.tv 短链。
CF Worker 视频流代理,自动添加 Referer 头绕过 B站 CDN 防盗链。由 /bili 接口内部调用,一般不需要直接使用。
架构说明
v2.0 采用本地代理 + CF Worker 双层架构,将 BV 解析与视频流转发分离:
客户端 (VRChat / 浏览器)
│
├─ GET api.yuki-can.top/bili?id=BVxxx
│ └─ 本地代理 (bili_limit_proxy)
│ ├─ 解析 BV 号 → 请求 B站 API → 获取 CDN 直链
│ └─ 返回 302 → bilibili.yuki-can.asia/video?url=base64(CDN直链)
│
├─ GET api.yuki-can.top/resolve?id=BVxxx
│ └─ 本地代理
│ └─ 仅提取 BV 号和分P,返回 JSON(不请求 B站 API)
│
└─ GET bilibili.yuki-can.asia/video?url=xxx
└─ CF Worker 视频代理
├─ 解码 CDN URL → 安全校验(仅允许 .bilivideo.com)
├─ 带Referer: https://www.bilibili.com/ 请求 CDN
└─ 转发视频流给客户端(解决 CDN 403 防盗链)
为什么需要两层?
- 本地代理负责 BV 解析:需要 B站 Cookie(SESSDATA)以提高解析成功率,这些密钥不能放在 CF Worker
- CF Worker负责视频流转发:视频流量走 CF 边缘节点,不消耗本地服务器带宽
- CDN 防盗链:B站 CDN 会检查 Referer 头,VRChat 播放器不带 Referer 所以会 403。CF Worker 代理自动添加 Referer 头解决这个问题
GET /bili(主接口)
返回 HTTP 302 重定向到视频直链。经由 CF Worker 视频代理转发,自动处理 B站 CDN 防盗链(Referer 头),VRChat 可直接播放。
限流说明
- 次数限制:每 IP 每日 20 次请求
- 同 BV 去重:同一 IP 访问同一视频不重复计数
- 配额查询:
GET /quota 可查询当前剩余次数
- 超限响应:HTTP 429,返回 JSON 说明剩余次数和重置时间
| 参数 | 必填 | 说明 | 示例 |
| id | 必填 | BV 号 / B站视频 URL / b23.tv 短链 | BV1xx411c7XZ |
| p | 选填 | 分 P 编号(默认 1) | 2 |
成功响应
HTTP/1.1 302 Found
Location: https://bilibili.yuki-can.asia/video?url=aHR0cHM6Ly91cG9zLXN6LW1pcnJvcmNvcy4uLg...
// 实际播放流程:
// 1. 客户端收到 302 → 跟随跳转到 CF Worker
// 2. CF Worker 添加 Referer 头请求 B站 CDN
// 3. CDN 返回视频流 → CF Worker 转发给客户端
// 4. VRChat / 浏览器开始播放视频
VRChat 使用方式
在 VRChat 世界中播放
在 VRChat 视频播放器的 URL 输入框中粘贴:
https://api.yuki-can.top/bili?id=BV1xx411c7XZ
https://api.yuki-can.top/bili?id=BV1xx411c7XZ&p=2
https://api.yuki-can.top/bili?id=https://b23.tv/xxxxx
错误响应
{
"error": "官方 API 解析失败",
"errors": ["bilibili_official: 获取视频信息失败: 访问过于频繁..."],
"suggestion": "请稍后重试",
"bv": "BV1xx411c7XZ"
}
GET /resolve
仅解析 BV 号和分P信息,返回 JSON。不请求 B站 API,仅从输入中提取信息。支持 b23.tv 短链(后端跟随 302 从 Location 头提取)。
| 参数 | 必填 | 说明 | 示例 |
| id | 必填 | BV 号 / B站视频 URL / b23.tv 短链 | https://b23.tv/xxxxx |
成功响应
// BV 号输入
{ "bv": "BV1xx411c7XZ", "part": 1 }
// b23.tv 短链输入(自动提取 BV 号和分P)
{ "bv": "BV1XY411J7aG", "part": 27 }
// B站 URL 输入(自动提取 BV 号和分P)
{ "bv": "BV1xx411c7XZ", "part": 3 }
错误响应
{ "error": "无法提取 BV 号,请检查输入" }
使用示例
// ── VRChat 视频播放(302 跳转到直链)──
// 直接在 VRChat 视频播放器中粘贴这个 URL
const videoUrl = 'https://api.yuki-can.top/bili?id=BV1xx411c7XZ';
// 分 P 视频
const videoUrlP2 = 'https://api.yuki-can.top/bili?id=BV1xx411c7XZ&p=2';
// b23.tv 短链也可以直接用
const videoUrlShort = 'https://api.yuki-can.top/bili?id=https://b23.tv/xxxxx';
// ── 仅解析 BV 号(返回 JSON)──
const res = await fetch('https://api.yuki-can.top/resolve?id=BV1xx411c7XZ');
const { bv, part } = await res.json();
// 解析 b23.tv 短链
const shortRes = await fetch('https://api.yuki-can.top/resolve?id=https://b23.tv/xxxxx');
const { bv: bv2, part: part2 } = await shortRes.json();
console.log('BV:', bv2, 'P:', part2);
// ── 查询剩余配额 ──
const quotaRes = await fetch('https://api.yuki-can.top/quota');
const quota = await quotaRes.json();
console.log('剩余次数:', quota.remaining, '/', quota.total);
b23.tv 短链解析
完整短链支持
所有接口均支持直接传入 b23.tv 短链,后端自动跟随 302 重定向,从 Location 头提取真实 BV 号和分P参数。
- 输入格式:
https://b23.tv/xxxxx
- 支持提取分P参数:
b23.tv/xxx?p=2 → part: 2
- 短链解析在前端通过后端
/resolve 接口完成(避免 CORS 限制)
- 注意:BV 号为 base58 编码,大小写敏感,服务端不会对 BV 号做大小写转换
错误码
Location 头指向 CF Worker 视频代理地址(bilibili.yuki-can.asia/video?url=...)
429 Too Many Requests
超过每日限额
当日次数用完,次日 00:00 重置。可通过响应头 X-RateLimit-Remaining 查看剩余次数
确认 id 参数存在且为有效 BV 号、B站 URL 或 b23.tv 短链
503 Service Unavailable
B站 API 异常
B站限流或视频不可用,稍后重试
响应头(限流代理)
| 响应头 | 说明 |
| X-RateLimit-Limit | 每日限额(20) |
| X-RateLimit-Remaining | 剩余次数 |
| X-RateLimit-BV | 当前请求的 BV 号 |
| Access-Control-Allow-Origin | CORS 允许所有来源 |
限制范围
以下视频无法解析
- 私密视频、仅好友可见视频
- 大会员专属视频
- 已被删除或下架的视频
- 互动视频、课程类特殊视频
GET /quota(配额查询)
查询当前 IP 的剩余配额信息,无需任何参数。返回当日已用次数、剩余次数和总限额。
返回当前 IP 的配额信息(按 IP 识别,基于请求来源自动判断)
响应示例
{
"remaining": 18,
"total": 20,
"date": "2026-05-30"
}
字段说明
| 字段 | 类型 | 说明 |
| remaining | number | 今日剩余可用次数 |
| total | number | 每日总限额(20) |
| date | string | 配额日期(YYYY-MM-DD),次日 00:00 自动重置 |
提示
- 配额按 IP 自动识别,基于
X-Forwarded-For / X-Real-IP / 请求来源 IP
- 同一 IP 请求同一 BV 号不重复计数(去重策略)
- 配额每天 00:00(服务器时间)自动重置
/quota 本身不计入配额消耗
实时配额