💡阅读指南

前面我们看过 Hermes 怎么操作网页。这一节我们把抖音里的视频保存到本地。正文不展开具体代码,只讲思路、难点和处理顺序。真正可执行的流程,放在本节配套 Skill 里。

🎬
本节附有教学视频 #25

该视频为课程站点内嵌片段,未收录于本地离线包;如需观看请回到线上课程对应课时。

2.1 保存视频这件事没那么直接

我们经常会刷到一条自己很喜欢的视频,想先存下来。但抖音只有极少部分的视频提供下载链接,我们不能直接下载。

那么有没有办法让 Agent 去下载?比如,我看到一个喜欢的视频,直接把这个视频通过飞书、微信分享给 Hermes,它自动下载后存入指定目录?

这听起来不像什么复杂任务。很多网页里的视频,只要能找到 <video> 标签,顺着 src 拿到 mp4 地址,就能下载。

但抖音不是这么简单。页面上确实有视频在播放,但浏览器里看到的地址未必是一个完整的文件。它可能是一条短时间有效的直链,也可能是 blob: 开头的临时地址。后者背后通常是 MSE 流,视频和音频被拆成一段段小碎片,由浏览器边加载边喂给播放器。

这就会有一个问题:页面元素可能根本找不到“下载地址”。那怎么办?

2.2 难点在于视频源有两种格式

第一种情况比较幸运,<video> 元素里能拿到一个真实的 mp4 直链。这个地址通常来自抖音的视频 CDN,有效时间很短。拿到以后就要马上下载,中间不要插太多操作。否则刚才还能打开的地址,过一会儿可能就失效了。

第二种情况麻烦一些。页面里的视频地址是 blob:,它不是远程文件地址,只是浏览器内部创建出来的临时引用。真正的视频片段藏在网络请求里,可能还被拆成纯视频流和纯音频流。Hermes 要从浏览器的资源记录里把它们找出来,再分别下载,最后合并成一个完整文件。

这就是很多人手动保存失败的原因。页面看起来只是在播放一个视频,背后其实有两套完全不同的处理路径。直链可以直接取,MSE 流就要找到碎片;如果音视频分离,还要把两条轨道合回来。

2.3 兜底方案是录下来

如果直链和 MSE 流都拿不到,还有一个朴素但可靠的兜底办法:让浏览器自己播放,Hermes 在页面里录制 <video> 元素的媒体流。

这个办法的好处是稳定。只要浏览器能正常播放,录制就有机会成功。它不太关心视频源到底怎么分发,也不需要提前拿到完整文件地址。

代价也很明显。录制是实时的,视频有多长就要等多久。一个三分钟的视频,基本就要等三分钟以上。输出格式也可能是 webm,后续如果需要 mp4,还要再转换一次。

所以实际使用时,顺序通常是先试直链,再处理 MSE 流,最后才用录制兜底。这个顺序看起来有点繁琐,但它符合真实的情况。

2.4 把流程沉淀成 Skill

之前我们总是用提示词来断断续续地执行一些小任务,但是对于这种逻辑比较复杂的任务,比较好的做法是直接写成 Skill,然后丢给 Hermes 执行。

我已经将 Skill 编写好了。

💡配套 Skill

本节对应的 Skill 已放在资料包中:

  • profile/douyin-skills/douyin-download.md

读完正文后,可以把这个 Skill 交给 Hermes,让它按 Skill 里的流程测试一个抖音分享链接。正文理解思路,Skill 负责执行细节。

实际测试时,提示词不用写得很复杂:

Text
请参考 profile/douyin-skills/douyin-download.md,
帮我把这个抖音视频保存到本地:
1.71 复制打开抖音,看看蒸馏知识博主?五步实操,照着做就行 ... https://v.douyin.com/zabjGQs8/ teB:3 G@I.II :3pm 
💡提示

抖音视频的真实地址不好获取,可以用这种分享链接作为地址。

或者让你的 Hermes 先安装这个 Skill。然后直接告诉它使用 xx Skill 执行。

如果 Chrome 没有打开调试端口,或者浏览器里还没登录抖音,Hermes 会先停下来处理这些前置条件。等视频保存成功以后,下一节才有素材继续做字幕和笔记。

2.5 ■ 学点英语

中文 English 音标 说明
视频下载 Video Download /ˈvɪdioʊ ˈdaʊnloʊd/ 从平台获取视频文件到本地的过程
媒体提取器 Media Extractor /ˈmiːdiə ɪkˈstræktər/ 从网页或链接中解析音视频资源的工具
下载链接 Download URL /ˈdaʊnloʊd ˌjuː ɑːr ˈel/ 指向可下载媒体资源的地址
平台限制 Platform Restriction /ˈplætfɔːrm rɪˈstrɪkʃən/ 平台对访问、下载或登录态的限制