读取已采集的 B 站数据
供程序与站点后端调用的只读 API。使用独立密钥,无需 B 站 Cookie,也无需登录控制台会话。
1. 创建密钥
管理员在「API 接入」中创建调用方密钥,可限制房间范围、有效期和每分钟请求次数。完整密钥仅在创建时显示一次,撤销后立即失效。
Authorization: Bearer YOUR_API_KEY
请把密钥放在服务端环境变量中。公开网页应通过自己的后端调用本站;直接把长期密钥写入网页会让访问者取得同等数据权限。需要浏览器直连时,需管理员配置明确的 CORS 来源,默认不允许跨域浏览器读取。
2. 请求地址
所有接口相对于本站域名,前缀为 /api/v1。原有 /api/monitor/* 等接口继续兼容原会话鉴权;新 API 密钥只能访问 v1 数据接口,不能管理房间、扫码或导入数据。
| GET 路径 | 用途 | 参数 |
|---|---|---|
| /rooms | 房间元数据、订阅与直播状态 | 仅返回密钥范围内房间,最多 1000 条 |
| /sessions | 场次,按 ID 升序分页 | room_id、after_id、limit |
| /events/{event_type} | 原始事件,按 ID 升序分页 | room_id、session_id、after_id、limit、start_time、end_time |
| /openapi.json | OpenAPI 接口定义 | 无需密钥 |
event_type 可选:danmaku、gifts、super_chats、guards、enters、popularity。
每页默认 100 条,最多 500 条。room_id 支持已知短号,服务会解析为真实房间号。时间筛选使用 Unix 秒,范围为 [start_time, end_time)。UID 和房间号以字符串返回,避免 JavaScript 数字精度损失。
3. 游标分页与增量同步
GET /api/v1/events/danmaku?room_id=213&after_id=0&limit=100
{
"data": [{"id": 101, "room_id": "47867", "uid": "123", "text": "…", "ts": 1789200000}],
"meta": {"limit": 100, "returned": 1, "has_more": false, "next_after_id": 101}
}读取后保存 next_after_id,下次将它作为 after_id 传入。has_more=true 时继续翻页;false 表示当时已经读完,持续同步可等待后用相同游标再次请求。空页仍返回原游标。首次 after_id=0 会从符合条件的最早记录开始,若只需要近期数据,请同时指定 start_time。
每种事件和每组筛选条件分别保存游标,不要把一个房间或事件类型的游标拿去读取其他范围。客户端以事件类型 + id 去重;ID 不是连续计数。正在采集的场次 end_time 后续会更新,场次游标只同步新增场次,不能用于发现旧场次字段更新。
4. 程序调用示例
curl -H "Authorization: Bearer $BILI_API_KEY" \ "https://YOUR_HOST/api/v1/events/danmaku?room_id=213&limit=100"
import os, requests
response = requests.get(
"https://YOUR_HOST/api/v1/events/danmaku",
headers={"Authorization": "Bearer " + os.environ["BILI_API_KEY"]},
params={"room_id": "213", "after_id": saved_cursor, "limit": 100},
timeout=15,
)
response.raise_for_status()
page = response.json()
# 先持久化处理 page["data"],成功后再保存游标。
saved_cursor = page["meta"]["next_after_id"]5. 限流、错误与数据口径
- 401:密钥无效、过期或被撤销;403:密钥无权访问该房间;422:参数错误;429:超过限流,按 Retry-After 秒数等待;503:数据库繁忙或不可用。
- 错误响应含 error.code、error.message、request_id。响应头提供 X-Request-ID 和限流额度信息,报障时提供请求 ID,不要提供完整密钥。
- 目前限流按单个 Web 进程计数,服务重启后重置。不要直接多副本部署后假设额度是全局共享的。
- status=live 表示直播,loop 表示轮播,offline 表示未开播;monitor_enabled 表示是否订阅采集,两者不是同一含义。
- 礼物为原始事件,is_combo=true 是连击汇总;计算收入时不能与单次礼物重复累加。只有 coin_type=gold 才按付费金币统计,1000 金币为 1 元。SC price 为元;guard 的 price 为金币单价,结合 num 使用。
- 进场和互动记录不等于完整观众名单。未收到的上游消息无法保证补回。本站不提供音视频录像文件。