text
输入抖音链接 → 获取视频ID → 浏览器提取视频 URL → 下载(可能需合并)
bash
curl.exe -sL -o NUL -w "%{url_effective}" "https://v.douyin.com/xxx/"
# 输出: https://www.douyin.com/video/7612345678901234567
提取视频ID: 7612345678901234567
text
browser(action='open', profile='openclaw', url='https://www.douyin.com/video/{视频ID}')
等待 10-15 秒让页面加载完成。
⚠️ act 操作必须用 request 嵌套格式,直接传 fn 会报错 request required:
text
browser(action='act', targetId='页面ID', request={"kind": "evaluate", "fn": "JS代码"})
❌ 错误写法: browser(action='act', targetId='...', fn='JS代码')
✅ 正确写法: browser(action='act', targetId='...', request={"kind": "evaluate", "fn": "JS代码"})
javascript
(() => {
const entries = performance.getEntriesByType('resource');
const videoEntries = entries.filter(e => {
const name = e.name.toLowerCase();
return name.includes('douyinvod') &&
(name.includes('media-video') || name.includes('media-audio') || name.includes('video_mp4'));
});
return videoEntries.map(e => e.name);
})()
情况A:DASH 分离流(常见)
text
[
"https://v26-web.douyinvod.com/.../media-video-hvc1/...",
"https://v26-web.douyinvod.com/.../media-audio-und-mp4a/..."
]
media-video → 视频流(无音频)media-audio → 音频流情况B:完整 MP4(部分视频)
text
[
"https://v26-web.douyinvod.com/.../?mime_type=video_mp4&..."
]
bash
# 下载视频流
curl.exe -L -H "Referer: https://www.douyin.com/" -o "/path/to/temp/douyin\video.mp4" "<视频流URL>"
# 下载音频流
curl.exe -L -H "Referer: https://www.douyin.com/" -o "/path/to/temp/douyin\audio.mp4" "<音频流URL>"
bash
curl.exe -L -H "Referer: https://www.douyin.com/" -o "/path/to/temp/douyin\video.mp4" "<完整URL>"
⚠️ 教训:DASH 分离流下载后已有独立的音频文件 audio.mp4,转录时直接传给 Whisper ASR 服务即可。合并只用于最终保存完整视频。
bash
# 转录用:直接传给 Whisper ASR(无需处理)
curl.exe -X POST "http://localhost:PORT/asr" -F "audio_file=@/path/to/temp/douyin\audio.mp4"
# 保存用:需要完整视频时用 ffmpeg 合并
ffmpeg -i "/path/to/temp/douyin\video.mp4" -i "/path/to/temp/douyin\audio.mp4" -c:v copy -c:a aac "/path/to/temp/douyin\merged.mp4" -y
文件说明/path/to/temp/douyin\video.mp4视频流或完整视频/path/to/temp/douyin\audio.mp4音频流(仅情况A)/path/to/temp/douyin\merged.mp4合并后的完整视频(仅情况A)
问题原因解决JS 返回空数组页面未加载完等待 15-20 秒后重试,或先 snapshot 确认下载 403URL 过期重新获取视频 URL只有视频没有音频忘记下载音频流确保同时下载 media-audio找不到 DASH 流该视频是完整 MP4扩展搜索条件,找包含 video_mp4 的 URLbrowser act 报错 "request required"格式错误必须用 request={"kind": "evaluate", "fn": "..."} 嵌套格式
提取 URL 失败时:
确认页面已加载 text
browser(action='snapshot', targetId='页面ID')
检查是否有视频播放器元素
扩大搜索范围 javascript
// 查看所有 douyinvod 相关资源
entries.filter(e => e.name.includes('douyinvod')).map(e => e.name)
检查视频时长
/note/,不适用此模块所有中间文件存放在 /path/to/temp/douyin\:
阶段文件保留下载video.mp4, audio.mp4, merged.mp4⚠️ 可选保留 merged.mp4转录audio.wav❌ 转录后删除
内容位置条件转录稿/path/to/knowledge\transcripts\{主题}-完整转录.md必保存视频/path/to/videos\tutorials\{主题}.mp4用户要求时保存
转录完成后:
audio.wav(转录中间产物)video.mp4/audio.mp4/merged.mp4(根据用户需求)/path/to/videos\ 后删除临时副本下载完成后关闭浏览器:
text
browser(action='stop')
释放资源,避免占用内存。
scripts/ 目录下有历史脚本,当前流程不再使用,保留备用:
脚本说明状态fetcher.pyTikHub API 下载脚本❌ 已删除(TikHub API 已废弃且包已卸载)browser_dom.py浏览器 DOM 提取脚本⚠️ 备用,需要 browser tool(沙盒环境不可用)