|
针对收藏夹页面中视频统一显示为av/bv号的问题,关键在于识别和处理番剧重定向。以下是优化方案:
### 核心解决方案:通过API直接获取收藏夹内容
无需解析HTML,直接调用B站收藏夹API获取所有视频的真实信息(含BV号):
- import requests
- import json
- def get_favorites(fid, cookie):
- """获取收藏夹内所有视频的真实BV号"""
- api_url = f"https://api.bilibili.com/x/v3/fav/resource/list?media_id={fid}&ps=20"
- headers = {
- "User-Agent": "Mozilla/5.0",
- "Cookie": cookie # 需要有效cookies
- }
-
- bv_list = []
- pn = 1
- while True:
- resp = requests.get(f"{api_url}&pn={pn}", headers=headers)
- data = resp.json().get('data', {})
-
- # 提取所有视频的BV号
- for item in data.get('medias', []):
- bvid = item.get('bvid')
- if bvid:
- bv_list.append(bvid)
-
- # 检查是否还有下一页
- if data.get('has_more') != 1:
- break
- pn += 1
-
- return bv_list
- # 使用示例
- cookie = "SESSDATA=你的SESSDATA;"
- favorites_id = "收藏夹ID" # 在收藏夹URL中找到
- bv_ids = get_favorites(favorites_id, cookie)
复制代码
### 工作流程
1. **获取收藏夹ID**:
- 打开收藏夹页面,URL格式:`https://space.bilibili.com/用户ID/favlist?fid=收藏夹ID`
- 从URL中复制`fid=`后面的数字
2. **获取SESSDATA**:
- 浏览器按F12 → 应用(Application) → Cookies → 复制`SESSDATA`值
- 注意:不要泄露给他人!
3. **调用函数获取BV列表**:
- bv_list = get_favorites("1234567", "SESSDATA=abc123...")
- for bvid in bv_list:
- download_audio(bvid, "下载文件夹")
复制代码
### 为什么更可靠?
1. **直接获取真实ID**:API返回的视频信息包含真实的`bvid`字段
2. **自动处理番剧**:B站API已统一返回BV号,无需区分普通/番剧
3. **支持分页**:自动处理超过20个视频的情况
### 注意事项
1. **cookie有效期**:SESSDATA通常有效1-3个月
2. **请求频率限制**:
- 添加延时:`import time; time.sleep(1)`
- 避免高频请求(>1次/秒)
3. **错误处理**:
- try:
- resp = requests.get(...)
- resp.raise_for_status()
- except requests.exceptions.RequestException as e:
- print(f"请求失败: {e}")
复制代码
> 此方案完全避开链接类型判断,直接从源头获取真实BV号,100%兼容普通视频和番剧内容。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|