Vimeo Locked-Embed Caption Extraction

从受隐私限制的 Vimeo 嵌入视频中提取自动生成的字幕文本。

已扫描
适合谁
内容研究员、访谈/会议记录整理者
不适合谁
需要视频文件的用户、希望自动处理多语言字幕的高级用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @heavenchenggong/vimeo-locked-captions

Skill 说明

命令、参数、文件名以原文为准

Vimeo 锁定嵌入字幕提取

问题

页面通过 <iframe src="https://player.vimeo.com/video/{ID}?h={HASH}"> 嵌入 Vimeo 视频。

该视频设置了“域名限制”——直接访问播放器 URL 会返回隐私错误,且 yt-dlp 或浏览器自动化也失败,因为 Vimeo 强制校验 Referer。

但你只需要 字幕文本,而非视频本身。Vimeo 自动生成的字幕来自一个独立的带签名 URL,该 URL 被嵌入在播放器 HTML 的 JSON 配置中——而只要 Referer 匹配允许的域名,这个 HTML 就可以被正常获取。因此,你可以在不播放视频的情况下提取字幕。

触发条件

  • 页面包含 <iframe src="https://player.vimeo.com/video/..."> 且无字幕文本。
  • 直接访问播放器 URL 显示“抱歉 — 由于隐私设置,该视频无法在此处播放”。
  • 你需要基于字幕进行分析(如访谈、圆桌讨论、火线对话、会议演讲等)。

解决方案

三个命令。将 {ID}{HASH}{HOST} 替换为嵌入代码中的实际值。

# 1. 使用正确的 Referer 获取播放器 HTML,并提取 text_tracks JSON。
curl -s -H 'Referer: https://{HOST}/' \
  'https://player.vimeo.com/video/{ID}?h={HASH}' \
  | grep -oE '"text_tracks":\[[^]]*\]'

返回结果类似:

"text_tracks":[{"id":303147651,"lang":"en-x-autogen",
"url":"https://captions.vimeo.com/captions/303147651.vtt?expires=...&sig=...",
"kind":"subtitles","label":"English (auto-generated)",
"provenance":"ai_generated","default":true}]
# 2. 下载 VTT 文件(带签名的 URL 不需要 Referer)。
curl -s 'https://captions.vimeo.com/captions/{CAP_ID}.vtt?expires=...&sig=...' \
  -o /tmp/transcript.vtt

# 3. 去除 WEBVTT 语义标记和时间戳,提取纯文本。
awk '/-->/{next} /^[0-9]+$/{next} /^WEBVTT/{next} /^$/{next} {print}' \
  /tmp/transcript.vtt > /tmp/transcript.txt
wc -w /tmp/transcript.txt

如何获取 ID、HASH、HOST

从宿主页面 iframe 的 src 属性中获取:

https://player.vimeo.com/video/1195836424?h=a0154d0f4b
                              └────┬────┘  └────┬────┘
                                  ID         HASH

HOST 是嵌入 iframe 的页面的主机名(例如 www.coatue.com)。若没有 iframe URL,可在 Playwright 或开发者工具中打开宿主页面并执行:

[...document.querySelectorAll('iframe')].map(f => f.src)

验证方法

  • VTT 文件应大于 1 KB,包含 WEBVTT 头部和编号字幕段落。
  • 提取后的文本词数应符合视频时长预期(正常语速约每分钟 150 词)。

注意事项

  • 该 VTT 为 自动生成provenance":"ai_generated")。专有名词和品牌缩写常被误识别(如“Computer Use” → “CP”,“Cherny” → “Cherney”)。阅读时需注意此类偏差,尤其关注姓名、产品代号和数字。
  • 签名 URL 包含 expires 参数——通常有效数天,若返回 403 错误,需重新执行步骤 1 获取新签名。
  • text_tracks 返回空数组 [],表示视频未开启字幕功能。尝试使用 yt-dlp --write-auto-subs 无效(同样受 Referer 限制),建议改用 Whisper 对屏幕录制音频进行转录。
  • 此方法可行的原因是:Vimeo 对 视频流 实施播放限制,但对播放器的 HTML 配置数据包未加限制,从而泄露了字幕 URL。该行为已持续多年;若未来 Vimeo 关闭此漏洞,可考虑在 Playwright 中以正确 Referer 加载嵌入页,通过 Vimeo Player API 的 player.getTextTracks() 获取字幕。
  • 多语言内容中,text_tracks 为数组形式——可通过 lang 字段检查是否存在其他可用字幕轨道(除自动生成的英文外)。

示例

Coatue × Boris Cherny 访谈,2026 年 5 月:

  • 嵌入页面:https://www.coatue.com/blog/video/interview-with-claude-code-creator
  • Iframe src:https://player.vimeo.com/video/1195836424?h=a0154d0f4b
  • 直接访问 → “由于隐私设置,该视频无法在此处播放”
  • 一条 curl 命令加上 Referer: https://www.coatue.com/ → 成功获取字幕 URL
  • 最终字幕:881 行 VTT / 2309 词 / 约 12 分钟对话内容

参考资料

  • [Vimeo 播放器 text-tracks 文档](https://developer.vimeo.com/player/sdk/reference#texttrack)(Player API;当 HTML 抓取失效时可作为备选方案)
  • WebVTT 规范:<https://www.w3.org/TR/webvtt1/>
H
@heavenchenggong

已收录 1 个 Skill

相关推荐