7e0acef4f9
- Add complete skill set including feishu, github, ci-gen, etc. - Add workspace documentation (AGENTS.md, SOUL.md, etc.) - Add memory system and project context
8.8 KiB
8.8 KiB
B站收藏夹 API 深度调研
调研时间: 2026-02-06
调研人: 阿里巴巴助手
文档类型: 技术补充调研
1. 收藏夹隐私机制
1.1 公开 vs 私密
B站收藏夹支持两种隐私状态:
| 状态 | 说明 | 谁能查看 |
|---|---|---|
| 公开 | 用户主动设置为公开 | 任何人(包括未登录用户) |
| 私密 | 默认状态 | 仅用户本人 |
1.2 设置方式
用户需要在两个地方设置才能完全公开:
- 电脑端: 收藏夹管理 → 编辑 → 设置公开
- 手机端: 设置 → 安全隐私 → 空间隐私设置 → 公开显示我的收藏
⚠️ 关键发现: 很多用户不知道需要同时设置两端,导致"设置了公开但别人看不到"
1.3 对用户的影响
- 默认情况: 所有收藏夹都是私密的
- 大多数用户: 不会主动设置为公开
- 实际可用性: 获取他人收藏夹内容非常有限
2. 收藏夹 API 详情
2.1 API 端点汇总
获取用户创建的所有收藏夹列表
GET https://api.bilibili.com/x/v3/fav/folder/created/list-all
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| up_mid | num | 是 | 目标用户mid |
| type | num | 否 | 0=全部, 2=视频稿件 |
| rid | num | 否 | 目标内容id(查询某视频在哪些收藏夹) |
认证: Cookie (SESSDATA) 或 APP
注: 查询私密收藏夹时需要相应用户登录
获取收藏夹元数据
GET https://api.bilibili.com/x/v3/fav/folder/info
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| media_id | num | 是 | 收藏夹完整id(fid + mid后2位) |
返回关键字段:
{
"code": 0,
"data": {
"id": 1052622027, // 收藏夹完整id
"fid": 10526220, // 收藏夹原始id
"mid": 509372, // 创建者mid
"title": "收藏夹标题",
"cover": "封面URL",
"media_count": 100, // 内容数量
"state": 0, // 状态(0=正常)
"fav_state": 0, // 是否已收藏(需登录)
"cnt_info": {
"collect": 50, // 被收藏数
"play": 10000, // 播放量
"thumb_up": 100 // 点赞数
}
}
}
获取收藏夹内容列表
GET https://api.bilibili.com/x/v3/fav/resource/list
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| media_id | num | 是 | 收藏夹完整id |
| pn | num | 否 | 页码,默认1 |
| ps | num | 否 | 每页数量,默认20 |
| keyword | str | 否 | 搜索关键词 |
| order | str | 否 | 排序:mtime=收藏时间,view=播放量 |
| type | num | 否 | 0=全部,2=视频 |
| platform | str | 否 | web |
认证: Cookie (SESSDATA)
返回字段:
{
"code": 0,
"data": {
"info": { /* 收藏夹信息 */ },
"medias": [
{
"id": 583785685, // 视频avid
"type": 2, // 2=视频稿件
"title": "视频标题",
"cover": "封面URL",
"intro": "简介",
"page": 1, // 分P数
"duration": 600, // 时长(秒)
"upper": {
"mid": 123456,
"name": "UP主昵称"
},
"cnt_info": {
"play": 10000,
"danmaku": 500,
"collect": 100
},
"bv_id": "BV1xx411c7mD",
"bvid": "BV1xx411c7mD",
"pubtime": 1609459200, // 发布时间
"fav_time": 1609545600 // 收藏时间
}
]
}
}
批量获取内容信息
GET https://api.bilibili.com/x/v3/fav/resource/infos
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| resources | str | 是 | 格式:{id}:{type},{id}:{type} |
| platform | str | 否 | web |
resources格式:
{内容id}:{内容类型}- 类型: 2=视频稿件, 12=音频, 21=视频合集
- 多个用逗号分隔
示例: 583785685:2,523:21,15664:12
2.2 错误码说明
| code | 含义 | 说明 |
|---|---|---|
| 0 | 成功 | 正常返回 |
| -400 | 请求错误 | 参数缺失或格式错误 |
| -403 | 访问权限不足 | 收藏夹为私密,或Cookie无效 |
| -404 | 不存在 | 收藏夹id不存在 |
| -101 | 账号未登录 | SESSDATA失效或缺失 |
| 11201 | 收藏夹不可见 | 私密收藏夹,无权限访问 |
3. 获取收藏夹的可行性分析
3.1 获取他人收藏夹
可行性: ⚠️ 很低
原因:
- 默认私密,大多数用户不会公开
- 即使公开,也需要用户主动在两处设置
- 公开收藏夹通常只展示精选内容
适用场景:
- 分析特定UP主的公开收藏(如教程合集)
- 获取用户自己公开的收藏夹(需用户授权后)
3.2 获取自己的收藏夹
可行性: ✅ 高
前提条件:
- 获取完整的 Cookie (SESSDATA)
- Cookie 未过期
- 账号状态正常
bili-auth 方案的限制:
- bili-auth 返回 OAuth token,但不直接提供 SESSDATA
- 部分 API 需要完整的 Cookie,不仅仅是 access_token
- 可能需要额外步骤将 OAuth 凭证转换为可用 Cookie
3.3 技术路径对比
| 方案 | 可行性 | 复杂度 | 风险 |
|---|---|---|---|
| OAuth + 公开收藏夹 | 🟡 低 | 低 | 低 |
| OAuth + Cookie提取 | ✅ 中 | 高 | 中 |
| 手动Cookie输入 | ✅ 高 | 低 | 高(用户体验差) |
4. 对 OpenClaw 技能的影响
4.1 功能调整建议
原规划(包含收藏夹):
- 获取关注列表 ✅
- 监控UP主动态 ✅
- 视频搜索 ✅
- 收藏夹同步 ❌(受限)
建议调整为:
| 功能 | 优先级 | 说明 |
|---|---|---|
| 我的收藏夹 | P1 → P2 | 需完整Cookie,实现复杂 |
| UP主公开收藏 | P2 | 仅展示UP主主动公开的内容 |
| 收藏夹元数据 | P2 | 可获取标题、数量等基本信息 |
4.2 用户交互设计
如果实现"我的收藏夹"功能:
-
授权时明确提示:
"获取收藏夹需要完整登录态,可能存在账号风险,建议使用小号"
-
降级方案:
- 如果无法获取收藏夹 → 提示用户手动输入Cookie
- 或仅展示公开收藏夹内容
-
功能限制:
- 仅读取,不提供"添加到收藏夹"功能
- 仅展示前N个收藏夹,避免频繁调用
4.3 技术实现建议
如果决定支持收藏夹:
# 伪代码示例
async def get_fav_list(uid, cookie):
"""获取用户收藏夹列表"""
url = "https://api.bilibili.com/x/v3/fav/folder/created/list-all"
params = {"up_mid": uid}
headers = {"Cookie": cookie}
resp = await fetch(url, params, headers)
if resp.code == -403:
return {"error": "收藏夹为私密或Cookie无效"}
return resp.data
async def get_fav_content(media_id, cookie, pn=1):
"""获取收藏夹内容"""
url = "https://api.bilibili.com/x/v3/fav/resource/list"
params = {
"media_id": media_id,
"pn": pn,
"ps": 20,
"platform": "web"
}
headers = {"Cookie": cookie}
resp = await fetch(url, params, headers)
return resp.data
关键注意点:
- 缓存收藏夹列表(1小时)
- 分页获取内容,避免单次请求过大
- 错误处理:-403时友好提示用户
5. 结论与建议
5.1 关于收藏夹功能的结论
| 方面 | 评估 |
|---|---|
| 技术可行性 | ✅ 可实现,但需完整Cookie |
| 用户可用性 | 🟡 中(需用户理解和授权) |
| 数据完整性 | ⚠️ 受限(大部分为私密) |
| 风险等级 | 🟡 中(需处理Cookie) |
5.2 MVP 功能建议
Phase 1: 不包含收藏夹功能
- 聚焦:关注列表 + UP主动态 + 视频搜索
- 更简单,风险更低
Phase 2: 可选添加收藏夹(如果用户需求强烈)
- 实现"我的收藏夹"(需完整Cookie)
- 明确提示风险
- 提供降级方案
5.3 如果用户询问"为什么看不到收藏夹"
标准回答:
B站收藏夹默认是私密的,大部分用户不会主动公开。如果需要获取您的收藏夹,需要:
- 在B站设置中将其设为公开
- 或者提供完整登录Cookie(存在风险,建议使用小号)
附录
API 快速参考
# 获取用户收藏夹列表
curl -G 'https://api.bilibili.com/x/v3/fav/folder/created/list-all' \
--data-urlencode 'up_mid=509372' \
-b 'SESSDATA=xxx'
# 获取收藏夹内容
curl -G 'https://api.bilibili.com/x/v3/fav/resource/list' \
--data-urlencode 'media_id=1052622027' \
--data-urlencode 'pn=1' \
--data-urlencode 'ps=20' \
-b 'SESSDATA=xxx'
相关文档
- 主调研报告: bilibili-plugin-feasibility.md
- 数据API调研: phase-2-data-api.md
本文档为 B站插件调研的补充材料