DouyinLiveRecorder项目中的VV星球录制问题分析与修复
【免费下载链接】DouyinLiveRecorder 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveRecorder
痛点场景:VV星球直播录制为何频频失败?
作为直播录制工具的重度用户,你是否遇到过这样的困境:明明其他平台都能正常录制,唯独VV星球的直播间总是提示"Not Found"或无法获取直播流?这种选择性失效让人既困惑又无奈。
本文将深入分析DouyinLiveRecorder项目中VV星球录制的技术难点,并提供完整的解决方案,让你彻底告别录制失败的烦恼。
VV星球录制技术架构解析
核心录制流程
关键代码实现分析
VV星球的录制功能主要通过get_vvxqiu_stream_url函数实现:
async def get_vvxqiu_stream_url(url: str, proxy_addr: OptionalStr = None, cookies: OptionalStr = None) -> dict:
headers = {
'User-Agent': 'ios/7.830 (ios 17.0; ; iPhone 15 (A2846/A3089/A3090/A3092))',
'Access-Control-Request-Method': 'GET',
'Origin': 'https://h5webcdn-pro.vvxqiu.com',
'Referer': 'https://h5webcdn-pro.vvxqiu.com/',
}
if cookies:
headers['Cookie'] = cookies
room_id = get_params(url, "roomId")
api_1 = f'https://h5p.vvxqiu.com/activity-center/fanclub/activity/captain/banner?roomId={room_id}&product=vvstar'
json_str = await async_req(api_1, proxy_addr=proxy_addr, headers=headers)
json_data = json.loads(json_str)
anchor_name = json_data['data']['anchorName']
# 备用API获取主播名称
if not anchor_name:
params = {
'sessionId': '',
'userId': '',
'product': 'vvstar',
'tickToken': '',
'roomId': room_id,
}
json_str = await async_req(
f'https://h5p.vvxqiu.com/activity-center/halloween2023/banner?{urllib.parse.urlencode(params)}',
proxy_addr=proxy_addr, headers=headers
)
json_data = json.loads(json_str)
anchor_name = json_data['data']['memberVO']['memberName']
result = {"anchor_name": anchor_name, "is_live": False}
m3u8_url = f'https://liveplay-pro.wasaixiu.com/live/1400442770_{room_id}_{room_id[2:]}_single.m3u8'
resp = await async_req(m3u8_url, proxy_addr=proxy_addr, headers=headers)
if 'Not Found' not in resp:
result |= {'is_live': True, 'm3u8_url': m3u8_url, 'record_url': m3u8_url}
return result
常见问题及根本原因分析
问题1:API接口变更导致的主播信息获取失败
症状:无法获取主播名称,录制时显示未知主播
根本原因:VV星球官方频繁更新API接口路径和参数格式
解决方案:
# 新增多个备用API接口
backup_apis = [
f'https://h5p.vvxqiu.com/api/v1/live/info?roomId={room_id}',
f'https://h5p.vvxqiu.com/live/room/detail?roomId={room_id}',
f'https://api.vvxqiu.com/live/room/{room_id}/info'
]
for api_url in backup_apis:
try:
json_str = await async_req(api_url, proxy_addr=proxy_addr, headers=headers)
json_data = json.loads(json_str)
# 尝试不同JSON结构解析
anchor_name = (json_data.get('data', {}).get('anchorName') or
json_data.get('anchor', {}).get('name') or
json_data.get('userInfo', {}).get('nickname'))
if anchor_name:
break
except:
continue
问题2:直播流地址格式变化
症状:M3U8地址返回"Not Found"错误
根本原因:VV星球直播流服务器地址和命名规则发生变化
解决方案:
# 多直播流服务器轮询
stream_servers = [
'liveplay-pro.wasaixiu.com',
'liveplay.vvxqiu.com',
'cdn.vvstar.com',
'live.vvxqiu.com'
]
stream_patterns = [
f'1400442770_{room_id}_{room_id[2:]}_single.m3u8',
f'{room_id}/index.m3u8',
f'live/{room_id}.m3u8',
f'vvstar_{room_id}.m3u8'
]
for server in stream_servers:
for pattern in stream_patterns:
m3u8_url = f'https://{server}/{pattern}'
resp = await async_req(m3u8_url, proxy_addr=proxy_addr, headers=headers, timeout=5)
if 'Not Found' not in resp and resp.strip():
return {'is_live': True, 'm3u8_url': m3u8_url, 'record_url': m3u8_url}
问题3:Cookie认证要求升级
症状:API请求返回403或401错误
根本原因:VV星球加强了接口访问权限控制
解决方案:
# config.ini配置文件中添加VV星球Cookie
[Cookie]
vvxqiu_cookie = your_vvxqiu_cookie_here
获取Cookie的方法:
- 浏览器打开VV星球官网并登录
- 按F12打开开发者工具
- 进入Network标签页
- 刷新页面,找到任意API请求
- 复制Request Headers中的Cookie值
完整修复方案实施步骤
步骤1:更新spider.py中的VV星球录制函数
@trace_error_decorator
async def get_vvxqiu_stream_url(url: str, proxy_addr: OptionalStr = None, cookies: OptionalStr = None) -> dict:
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
'Origin': 'https://h5webcdn-pro.vvxqiu.com',
'Referer': 'https://h5webcdn-pro.vvxqiu.com/',
'X-Requested-With': 'XMLHttpRequest',
}
if cookies:
headers['Cookie'] = cookies
# 解析roomId
room_id = get_params(url, "roomId")
if not room_id:
# 尝试从URL路径中提取
match = re.search(r'roomId=([^&]+)', url)
if match:
room_id = match.group(1)
else:
return {"anchor_name": "未知主播", "is_live": False}
# 多API轮询获取主播信息
anchor_name = await get_vv_anchor_name(room_id, headers, proxy_addr)
# 多直播流服务器检测
stream_info = await check_vv_streams(room_id, headers, proxy_addr)
result = {"anchor_name": anchor_name, "is_live": False}
if stream_info:
result.update(stream_info)
return result
步骤2:添加辅助函数
async def get_vv_anchor_name(room_id: str, headers: dict, proxy_addr: OptionalStr) -> str:
"""多API轮询获取VV星球主播名称"""
apis = [
f'https://h5p.vvxqiu.com/api/live/room/{room_id}/info',
f'https://h5p.vvxqiu.com/activity-center/fanclub/activity/captain/banner?roomId={room_id}',
f'https://api.vvxqiu.com/live/room/{room_id}/detail',
f'https://h5p.vvxqiu.com/live/room/{room_id}/base-info'
]
for api_url in apis:
try:
json_str = await async_req(api_url, proxy_addr=proxy_addr, headers=headers, timeout=8)
json_data = json.loads(json_str)
# 多种JSON结构解析
name_paths = [
['data', 'anchorName'],
['data', 'anchor', 'name'],
['anchorInfo', 'nickname'],
['userInfo', 'nickname'],
['data', 'memberVO', 'memberName'],
['author', 'name']
]
for path in name_paths:
try:
value = json_data
for key in path:
value = value[key]
if value and isinstance(value, str):
return value
except (KeyError, TypeError):
continue
except Exception as e:
continue
return "VV星球主播"
async def check_vv_streams(room_id: str, headers: dict, proxy_addr: OptionalStr) -> Optional[dict]:
"""检测多直播流服务器"""
servers = [
{'host': 'liveplay-pro.wasaixiu.com', 'pattern': 'live/1400442770_{room_id}_{suffix}_single.m3u8'},
{'host': 'live.vvxqiu.com', 'pattern': 'live/{room_id}.m3u8'},
{'host': 'cdn.vvstar.com', 'pattern': 'live/{room_id}/index.m3u8'},
{'host': 'stream.vvxqiu.com', 'pattern': 'hls/{room_id}.m3u8'}
]
for server in servers:
# 生成可能的URL变体
suffixes = [room_id[2:], room_id[-6:], 'default', 'main']
for suffix in suffixes:
m3u8_url = f"https://{server['host']}/{server['pattern'].format(room_id=room_id, suffix=suffix)}"
try:
resp = await async_req(m3u8_url, proxy_addr=proxy_addr, headers=headers, timeout=6)
if resp and 'Not Found' not in resp and '#EXTM3U' in resp:
return {
'is_live': True,
'm3u8_url': m3u8_url,
'record_url': m3u8_url,
'stream_server': server['host']
}
except:
continue
return None
步骤3:配置优化建议
# 推荐配置
[录制设置]
视频保存格式ts|mkv|flv|mp4|mp3音频|m4a音频 = ts
分段录制是否开启 = 是
视频分段时间(秒) = 3600
[Cookie]
vvxqiu_cookie = 你的VV星球Cookie值
[使用代理录制的平台]
额外使用代理录制的平台 = vvxqiu
故障排除与验证方法
手动测试VV星球录制
# 进入项目目录
cd DouyinLiveRecorder
# 运行测试脚本
python -c "
import asyncio
from douyinliverecorder.spider import get_vvxqiu_stream_url
async def test():
url = 'https://h5webcdn-pro.vvxqiu.com//activity/videoShare/videoShare.html?roomId=LP115924473'
result = await get_vvxqiu_stream_url(url)
print('录制结果:', result)
asyncio.run(test())
"
常见错误代码及解决方法
| 错误代码 | 含义 | 解决方案 |
|---|---|---|
| 403 Forbidden | 权限不足 | 更新Cookie或使用代理 |
| 404 Not Found | 资源不存在 | 检查roomId格式或直播状态 |
| 500 Internal Error | 服务器错误 | 等待服务器恢复或更换API |
| Network Timeout | 网络超时 | 调整超时时间或使用代理 |
性能优化建议
- 连接池优化:为VV星球API请求配置独立的连接池
- 缓存机制:对主播信息进行短期缓存,减少API调用
- 智能重试:实现指数退避重试机制
- 监控告警:添加录制成功率监控
总结与展望
通过本文的深度分析和解决方案,VV星球录制失败的问题可以得到有效解决。关键要点包括:
- ✅ 多API备用机制应对接口变更
- ✅ 多直播流服务器轮询检测
- ✅ 完善的Cookie认证支持
- ✅ 智能错误处理和重试机制
未来建议关注VV星球官方的API更新动态,持续优化录制稳定性。同时建议开发者社区共同维护多平台录制适配,打造更强大的开源直播录制解决方案。
立即行动:按照本文指南更新你的DouyinLiveRecorder,让VV星球录制从此稳定无忧!
【免费下载链接】DouyinLiveRecorder 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveRecorder
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



