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
338 lines
8.8 KiB
Markdown
338 lines
8.8 KiB
Markdown
# B站收藏夹 API 深度调研
|
||
|
||
**调研时间**: 2026-02-06
|
||
**调研人**: 阿里巴巴助手
|
||
**文档类型**: 技术补充调研
|
||
|
||
---
|
||
|
||
## 1. 收藏夹隐私机制
|
||
|
||
### 1.1 公开 vs 私密
|
||
|
||
B站收藏夹支持两种隐私状态:
|
||
|
||
| 状态 | 说明 | 谁能查看 |
|
||
|------|------|----------|
|
||
| **公开** | 用户主动设置为公开 | 任何人(包括未登录用户)|
|
||
| **私密** | 默认状态 | 仅用户本人 |
|
||
|
||
### 1.2 设置方式
|
||
|
||
用户需要在两个地方设置才能完全公开:
|
||
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位)|
|
||
|
||
**返回关键字段**:
|
||
```json
|
||
{
|
||
"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)
|
||
|
||
**返回字段**:
|
||
```json
|
||
{
|
||
"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 获取他人收藏夹
|
||
|
||
**可行性**: ⚠️ **很低**
|
||
|
||
**原因**:
|
||
1. 默认私密,大多数用户不会公开
|
||
2. 即使公开,也需要用户主动在两处设置
|
||
3. 公开收藏夹通常只展示精选内容
|
||
|
||
**适用场景**:
|
||
- 分析特定UP主的公开收藏(如教程合集)
|
||
- 获取用户自己公开的收藏夹(需用户授权后)
|
||
|
||
### 3.2 获取自己的收藏夹
|
||
|
||
**可行性**: ✅ **高**
|
||
|
||
**前提条件**:
|
||
1. 获取完整的 Cookie (SESSDATA)
|
||
2. Cookie 未过期
|
||
3. 账号状态正常
|
||
|
||
**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 用户交互设计
|
||
|
||
**如果实现"我的收藏夹"功能**:
|
||
|
||
1. **授权时明确提示**:
|
||
> "获取收藏夹需要完整登录态,可能存在账号风险,建议使用小号"
|
||
|
||
2. **降级方案**:
|
||
- 如果无法获取收藏夹 → 提示用户手动输入Cookie
|
||
- 或仅展示公开收藏夹内容
|
||
|
||
3. **功能限制**:
|
||
- 仅读取,不提供"添加到收藏夹"功能
|
||
- 仅展示前N个收藏夹,避免频繁调用
|
||
|
||
### 4.3 技术实现建议
|
||
|
||
**如果决定支持收藏夹**:
|
||
|
||
```python
|
||
# 伪代码示例
|
||
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站收藏夹默认是私密的,大部分用户不会主动公开。如果需要获取您的收藏夹,需要:
|
||
> 1. 在B站设置中将其设为公开
|
||
> 2. 或者提供完整登录Cookie(存在风险,建议使用小号)
|
||
|
||
---
|
||
|
||
## 附录
|
||
|
||
### API 快速参考
|
||
|
||
```bash
|
||
# 获取用户收藏夹列表
|
||
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](./bilibili-plugin-feasibility.md)
|
||
- 数据API调研: [phase-2-data-api.md](./research-notes/phase-2-data-api.md)
|
||
|
||
---
|
||
|
||
*本文档为 B站插件调研的补充材料*
|