基于OpenClaw与本地LLM网关,构建AI驱动的YouTube视频智能分析工具
1. 项目概述基于OpenClaw的AI技能库最近在折腾一个挺有意思的项目叫OpenClaw-Skills。简单来说它是一个建立在OpenClaw LLM网关之上的、由AI驱动的命令行工具集合。你可以把它理解为一个“技能库”每个技能都是一个独立的、能完成特定任务的CLI工具。目前这个库里最成熟的一个技能就是YouTube视频总结器。这个工具能干的事儿挺多不只是生成摘要还能进行基于字幕的问答、深度分析甚至提取视频里的行动要点而且最棒的是它支持多语言——视频是什么语言它就能用什么语言来分析和回复完全不用你手动切换。我之所以花时间研究并部署这套东西是因为每天要看的视频和资料实在太多了。无论是技术教程、行业访谈还是产品发布会动辄一小时的长度想快速抓住核心内容非常耗时。市面上虽然有一些摘要工具但要么是纯云端服务有隐私顾虑要么功能单一比如只给个摘要没法追问细节要么对非英语内容支持得很差。OpenClaw-Skills的YouTube技能正好解决了这几个痛点它在本地通过多种方式获取字幕利用本地的OpenClaw网关调用大模型整个过程数据可控它提供了摘要、问答、深度分析、行动提取四种模式能满足不同深度的信息消化需求最关键的是它的语言自适应能力处理日语、西班牙语、印地语的内容和英语一样流畅。这个项目非常适合那些需要高效处理视频信息的内容创作者、研究者、学生或者任何想从海量视频内容中快速提炼价值的开发者。它不是一个庞大的全功能应用而是一个个轻量、专注、可组合的“技能”你可以按需使用甚至基于它的框架快速开发自己的新技能。接下来我就结合自己的实操经验带你从零开始把它跑起来并深入聊聊每个环节的设计思路和避坑指南。2. 核心架构与设计思路拆解2.1 整体项目结构模块化与技能独立性的权衡刚拿到这个项目源码时我第一眼关注的是它的目录结构。它没有采用传统的、把所有逻辑堆在一个文件里的方式而是清晰地体现了“技能即插件”的思想。openclaw-skills/ ├── index.ts ├── package.json └── src/ └── youtube/ ├── cli.ts ├── config.ts ├── types.ts ├── client.ts ├── youtube.ts ├── transcript.ts ├── cache.ts ├── chunks.ts ├── llm.ts └── qa.tsindex.ts是整个项目的入口但它的角色更像一个“路由器”或“加载器”。它的核心逻辑是动态导入当前激活技能的cli.ts中的main函数并执行。这种设计意味着未来增加新技能比如src/twitter/或src/podcast/时只需要修改index.ts中的导入路径或者通过更动态的配置来指定当前要运行的技能项目的主体架构完全不用动。这为技能库的扩展打下了非常好的基础。src/youtube/目录是第一个也是目前唯一的技能实现。里面的文件分工非常明确体现了单一职责原则。我特别喜欢这种分法cli.ts负责命令行参数的解析使用commander或类似库和整个技能执行流程的编排。它是用户交互的边界。config.ts集中存放所有常量、提示词模板和大模型调用参数。把提示词这种经常需要调整的内容独立出来修改时不用去业务逻辑里翻找非常方便。types.ts定义了整个技能用到的 TypeScript 接口。比如视频元数据、字幕块、缓存项、LLM请求/响应体的结构。这不仅是类型安全的需要更是项目的一份“数据字典”让人一眼就能看懂核心数据结构。client.ts管理youtubei.js一个优秀的非官方YouTube API库客户端的单例。确保整个应用生命周期内只创建一个客户端实例避免重复登录和资源浪费。youtube.ts封装了与YouTube数据相关的操作主要是根据频道ID或URL获取视频列表以及获取视频的基本元数据标题、时长、频道名等。transcript.ts这是整个技能的“心脏”之一实现了三层递进的字幕获取管道。它的健壮性直接决定了技能的上限。cache.ts实现基于磁盘文件的JSON缓存。对于字幕这种获取成本较高可能触发反爬且不常变的数据缓存能极大提升重复查询的速度和成功率。chunks.ts负责将长字幕文本切割成有意义的块并为后续的问答模式实现基于TF-IDF等算法的检索确保答案“有据可查”。llm.ts封装了对OpenClaw网关的调用针对不同的模式摘要、深度分析、行动提取构造不同的提示词并发起请求。qa.ts问答模式的核心它协调chunks.ts进行检索从找到的相关字幕块中提取信息并调用llm.ts生成最终答案同时会标记答案是否“有据可依”。这种架构的好处是高内聚、低耦合。每个文件职责清晰测试和调试时可以单独针对某个模块。比如你想优化字幕获取成功率就专注改transcript.ts想调整摘要的格式和深度就去config.ts里改提示词。这种设计思路非常值得我们在开发自己的自动化工具时借鉴。2.2 核心依赖选型为什么是它们项目的技术选型也经过了一番考量不是随便抓几个流行的库就来用。Bun 作为运行时项目要求 Bun 1.3。Bun 不仅仅是一个像 Node.js 或 Deno 的 JavaScript 运行时它内置了打包器、转译器和 npm 客户端速度非常快。对于这种 CLI 工具启动速度和依赖安装的便捷性很重要。使用 Bun 可以bun install一键安装所有依赖并且运行 TypeScript 文件无需预先编译开发体验很流畅。不过在实际部署时需要注意如果生产环境没有 Bun可能需要用bun build编译成可执行的单一文件。OpenClaw 作为 LLM 网关这是项目的核心前提。OpenClaw 是一个统一的大语言模型网关它可以对接后端不同的 LLM 服务如 OpenAI API、本地部署的 Ollama、Claude 等。这样做的好处是将业务逻辑与具体的大模型提供商解耦。你的代码里只需要向http://localhost:3000发送标准格式的请求而具体由哪个模型处理、密钥如何管理都在 OpenClaw 网关层面配置。这带来了巨大的灵活性和安全性切换模型只需改网关配置而不需要修改技能代码。youtubei.js 作为首选 API获取 YouTube 数据尤其是官方字幕有很多方法。项目首选了youtubei.js这个库。它是一个对 YouTube 内部 API (Innertube) 的反向工程实现能模拟官方客户端的请求。相比于直接爬取网页它的优势是结构化程度高、稳定性相对更好能直接获取到 JSON 格式的字幕轨道信息包括每个字幕片段的起止时间和文本。这是获取字幕最“干净”的方式。yt-dlp 作为保底方案yt-dlp是youtube-dl的一个强大分支几乎是处理 YouTube 视频下载和相关信息提取的“瑞士军刀”。在这个项目里它扮演了“最后一道防线”的角色。当前两种方法都失败时比如视频没有官方字幕且网页上也没有可抓取的隐藏字幕yt-dlp可以尝试下载自动生成的字幕。这里有一个关键细节项目会优先检测视频的原始语言然后只请求该语言的自动字幕避免了去请求可能不存在的翻译轨道从而减少无效请求和触发风控的概率。TypeScript 保障代码质量整个项目用 TypeScript 编写这为这种涉及多个步骤、多种数据流转的复杂 CLI 工具提供了坚实的类型安全基础。它能有效避免很多低级错误比如字段名拼写错误、错误的数据类型传递等尤其是在频繁修改提示词和数据结构时类型检查能提供即时反馈。这样的技术栈组合体现了一个务实的选择用最适合、最专业的工具解决特定问题并通过清晰的架构将它们组合起来而不是追求一个“全能”但可能臃肿的解决方案。3. 环境准备与详细配置指南3.1 基础运行环境搭建要让这个技能跑起来你需要准备好以下四样东西Bun 运行时、yt-dlp 工具、一个运行中的 OpenClaw 网关实例以及对应的认证文件。下面我一步步带你操作并说明每个环节的注意事项。第一步安装 Bun如果你的系统还没安装 Bun官方的一键安装脚本是最快的方式。打开你的终端执行以下命令curl -fsSL https://bun.sh/install | bash安装完成后重启你的终端或者运行source ~/.bashrc或~/.zshrc来让 bun 命令生效。用bun --version检查是否安装成功确保版本至少是 1.3。注意如果你在公司的网络环境下可能会因为网络策略问题导致 curl 下载失败。这时可以尝试使用包管理器安装比如在 macOS 上用 Homebrew (brew install oven-sh/bun/bun)或者在 Ubuntu 上参考官方文档添加 apt 源。Windows 用户可以通过 Windows Subsystem for Linux (WSL) 来获得最好的体验。第二步安装 yt-dlpyt-dlp的安装方式也很多。我推荐直接用 curl 下载可执行文件这样最干净不依赖系统的 Python 环境。sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp sudo chmod x /usr/local/bin/yt-dlp这两条命令的作用是从 GitHub 发布页下载最新的 yt-dlp 二进制文件放到/usr/local/bin目录下这个目录通常已经在系统的 PATH 环境变量里然后赋予它可执行权限。安装后在终端输入yt-dlp --version应该能看到版本号。踩坑提示有些 Linux 发行版或 macOS 系统可能对/usr/local/bin的写入权限管理很严格。如果遇到权限错误可以尝试不加sudo下载到用户目录比如~/bin/yt-dlp然后确保~/bin目录在你的 PATH 中 (export PATH$HOME/bin:$PATH)。Windows 用户可以去发布页面直接下载yt-dlp.exe然后将其所在目录添加到系统环境变量 PATH 中。第三步部署与配置 OpenClaw 网关这是整个项目的大脑。OpenClaw 网关需要单独部署。通常你可以克隆它的仓库然后根据其 README 在本地运行。假设你已经在http://localhost:3000跑起来了一个 OpenClaw 服务并且配置好了后端的大模型比如接入了 OpenAI 的 API 或者本地运行的 Llama 模型。接下来是最关键的一步获取并配置认证令牌。OpenClaw 网关需要 token 来验证请求。这个 token 的获取方式取决于你的 OpenClaw 配置。通常在 OpenClaw 的配置文件或管理界面中你可以生成一个长期有效的 token。第四步创建认证文件项目要求你在~/.openclaw/目录下创建一个名为openclaw.json的配置文件。注意~代表你的用户家目录。mkdir -p ~/.openclaw # 如果目录不存在则创建然后用你喜欢的文本编辑器创建并编辑这个文件nano ~/.openclaw/openclaw.json # 或者用 vim, code 等文件内容如下将YOUR_TOKEN_HERE替换成你从 OpenClaw 网关获取的真实 token{ gateway: { auth: { token: YOUR_ACTUAL_TOKEN_HERE } } }保存并退出。这个文件是高度敏感的务必确保其权限安全不要将其提交到任何公开的版本控制系统。重要检查点完成以上四步后我建议做一个简单的连通性测试。你可以尝试用 curl 命令测试 OpenClaw 网关是否正常工作curl -X POST http://localhost:3000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer YOUR_ACTUAL_TOKEN_HERE \ -d {model: gpt-3.5-turbo, messages: [{role: user, content: Hello}]}如果返回一个包含 AI 回复的 JSON说明网关配置正确。如果遇到连接拒绝或认证错误需要回头检查 OpenClaw 服务是否真的在 3000 端口运行以及 token 是否正确。3.2 项目初始化与技能安装环境准备好后就可以把技能库本身拉下来了。git clone https://github.com/Celestial-0/OpenClaw-Skills.git cd OpenClaw-Skills bun installbun install会读取package.json安装所有必要的 Node.js/TypeScript 依赖包比如commander命令行解析、youtubei.js等。这个过程通常很快。安装完成后项目根目录下的package.json里已经定义好了脚本。你可以通过bun run youtube来执行 YouTube 技能。但为了确保一切就绪我们先运行一个最简单的命令来测试整个链路是否打通bun run youtube --help这个命令会打印出 YouTube 技能所有可用的参数和选项说明。如果你能看到详细的帮助信息恭喜你基础环境已经搭建成功。如果出现“命令未找到”或模块加载错误请检查bun install的日志看是否有依赖安装失败。4. YouTube技能深度解析与实操4.1 字幕获取管道三层递进的稳健策略字幕是这一切分析的基石。如果拿不到字幕后面的LLM分析就成了无米之炊。transcript.ts文件实现的三层获取策略是该项目设计中最精妙、最体现工程思维的部分。第一层Innertube 官方API首选这是通过youtubei.js库来模拟手机或网页客户端直接调用YouTube的内部API获取字幕。这种方法的好处是数据最规范拿到的是结构化的JSON数据包含精确的时间戳和纯文本没有HTML标签污染。可靠性高只要该视频有官方提供的字幕包括创作者上传的.srt文件或YouTube生成的自动字幕且你的请求模拟得足够像真实客户端成功率就很高。速度快直接获取数据无需下载和解析整个视频页面。它的实现核心是创建一个Innertube客户端实例然后通过video.getInfo()获取视频信息其中就包含了captions字幕列表。代码会遍历这个列表寻找语言代码如en,zh-Hans匹配的视频原始语言的字幕轨道。找到后调用track.getCaptions()即可获取字幕片段数组。第二层youtube-transcript 网页抓取备选当第一层失败时比如API结构发生变化或者请求被风控系统会回退到第二层使用youtube-transcript这类库通过HTTP请求获取视频页面HTML然后从中解析出字幕信息。YouTube有时会把字幕数据以JSON格式内嵌在页面HTML中。优点不依赖非官方API只进行普通的网页抓取行为更“低调”。缺点受网页结构变化影响大如果YouTube前端改版解析逻辑可能失效。而且需要下载和解析整个页面效率稍低。第三层yt-dlp 下载自动字幕保底当前两层都失败时常见于一些没有提供任何官方字幕且页面内也无嵌入字幕信息的视频第三层保底方案启动使用yt-dlp。语言检测首先yt-dlp会获取视频的元信息从中判断视频的原始语言是什么比如ja代表日语。定向下载然后它尝试下载该语言对应的“自动生成字幕”。这里的关键是只请求原始语言。如果你请求--sub-lang en而视频是日语的YouTube可能会尝试返回机器翻译的英文字幕这个翻译质量往往很差且更容易触发“字幕不可用”的错误。直接请求原始语言 (--sub-lang ja) 的成功率最高。格式转换yt-dlp默认下载的字幕可能是多种格式SRT, VTT, TTML等。代码需要将这些格式解析、清洗转换成统一的内部数据结构包含text,start,duration的数组。为什么需要三层这是一种典型的“优雅降级”策略。核心目标是最大化获取字幕的成功率。没有任何一种方法能保证100%成功。官方API可能被封网页抓取可能因改版失效有些视频可能根本没有自动字幕。三层策略环环相扣确保只要视频存在任何形式的可获取字幕我们就有很大机会拿到它。在实际使用中我观察到大约85%的视频可以通过第一层获取10%通过第二层剩下5%可能通过第三层获取或最终失败。实操心得你可以通过设置环境变量或修改代码日志级别来观察具体某个视频走了哪一层管道。这对于调试和了解YouTube的反爬现状很有帮助。如果发现大量视频都 fallback 到 yt-dlp可能意味着youtubei.js需要更新了。4.2 缓存机制提升效率与避免风控频繁地对同一个视频请求字幕不仅慢而且很容易触发YouTube的速率限制。cache.ts实现的磁盘缓存机制巧妙地解决了这个问题。缓存键的设计缓存不是简单地用视频URL作为键而是使用video_id。因为同一个视频可能有不同的URL形式比如包含追踪参数的分享链接。提取出标准的11位视频ID如dQw4w9WgXcQ作为键保证了唯一性。缓存内容缓存的文件是一个JSON里面不仅存储了最终清洗好的字幕数组通常还会存储一些元数据比如获取时间、使用的获取方法、视频语言等。这样下次请求时可以直接从缓存加载完全跳过网络请求。缓存目录默认的缓存目录是~/.openclaw/cache/youtube。你可以通过--cache-dir参数自定义。我建议将这个目录放在一个读写速度快的位置比如SSD并且考虑定期清理虽然单个缓存文件很小但数量多了也会占用空间。缓存失效策略当前的实现是“永久缓存”即一旦获取成功就永远使用缓存。这对于静态内容如已上传的视频是合理的。但你需要知道如果视频作者后来更新了字幕你的缓存就不会更新。一个更完善的策略可以加入“缓存有效期”例如7天或者提供一个--no-cache或--force-refresh参数来跳过缓存。缓存带来的好处极速响应第二次分析同一个视频时几乎是瞬间完成。降低风控风险避免了重复的、不必要的网络请求。离线工作只要分析过的视频即使在没有网络的环境下你仍然可以对其进行新的问答或分析因为字幕已在本地。4.3 四大使用模式详解与示例YouTube技能提供了四种核心模式分别对应不同的信息处理需求。下面我用具体的命令示例和输出来展示它们的威力。模式一结构化摘要 (Summary) - 默认模式这是最常用的功能旨在用最少的文字呈现视频的核心内容。bun run youtube --url https://www.youtube.com/watch?vVIDEO_ID输出特点它会生成一个包含5个部分的Markdown格式摘要概述一两句话点明视频主题。核心要点分条列出3-5个最重要的观点或结论。关键时间戳标记出视频中讨论核心话题的具体时间点方便你快速跳转。详细总结对视频内容进行更连贯、更详细的段落式总结。最终收获提炼出观众看完本视频最应该记住的一两个启示。语言自适应如果你不指定--lang它会自动检测字幕语言并用同种语言输出摘要。例如一个日语视频你会得到日语的摘要。如果你想强制用中文输出可以加--lang zh。模式二基于字幕的问答 (QA)当你对视频的某个具体细节有疑问时这个模式就派上用场了。它不是让大模型凭空想象而是严格基于获取到的字幕文本来回答。bun run youtube --url https://www.youtube.com/watch?vVIDEO_ID --mode qa --question 演讲者在第15分钟左右提到的那个实验的具体步骤是什么工作原理检索chunks.ts会将整个字幕文本切割成较小的片段例如按句子或按固定token数。当收到问题时它会使用TF-IDF或类似的向量检索技术快速找出与问题最相关的几个字幕片段。** grounding**qa.ts将找到的相关片段和问题一起发送给LLM并给出严格的指令“请仅基于以下提供的上下文来回答问题。如果上下文没有提供足够信息请回答‘根据提供的字幕无法找到相关信息’。”生成LLM基于提供的“证据”字幕片段生成答案。这样生成的答案可信度非常高因为它有据可查。输出JSON中会有一个grounded: true的字段来表明这一点。模式三深度分析 (Deep Dive)这个模式适合用于分析讲座、辩论、深度访谈等内容旨在解构视频的深层逻辑。bun run youtube --url https://www.youtube.com/watch?vVIDEO_ID --mode deepdive它会生成一个6部分的分析报告背景与上下文视频讨论的问题是在什么背景下产生的核心论点与论据讲者提出了哪些主要观点他用什么证据数据、案例、逻辑来支撑论证结构与逻辑讲者是如何组织这些论据的论证过程是否严密潜在影响与启示如果讲者的观点成立会带来哪些影响未解答的问题与局限视频中有哪些问题被回避了论证存在哪些弱点或假设目标受众与说服策略这个视频是针对谁的采用了哪些说服技巧情感、权威、逻辑这种分析能帮你从“看热闹”进阶到“看门道”特别适合学习和研究。模式四行动要点提取 (Action Points)从教程、产品发布会、方法论分享等视频中直接提取出可操作的步骤。bun run youtube --url https://www.youtube.com/watch?vVIDEO_ID --mode actionpoints输出会将行动分为三类立即行动现在就可以开始做的事情例如“访问XX网站下载模板”。短期计划接下来几天或几周内需要规划的事情例如“研究一下A工具和B工具的对比”。长期战略从视频中获得的、可能影响长期决策的启示例如“考虑将XX方法论引入团队工作流程”。这对于将知识转化为实践非常有帮助。4.4 批量处理与频道监控手动一个个输入URL太麻烦。技能提供了两种批量处理方式。方式一扫描频道最新视频bun run youtube --channel TechLinked --hours 48这个命令会去抓取TechLinked这个频道在过去48小时内发布的所有视频然后依次对每个视频执行默认的摘要模式。--channel参数支持频道ID、开头的句柄或者完整的频道URL。--hours参数控制回溯的时间窗口。这对于跟踪你订阅的频道、制作每日简报非常有用。方式二基于配置文件的每日批处理这是更自动化的工作流。首先复制示例配置文件cp config/channels.example.json config/channels.json然后编辑config/channels.json添加你关注的频道列表{ channels: [ { name: AI Explained, id: UCmG-7A2IzDEsg-7xjeLx7cQ }, { name: Fireship, url: https://www.youtube.com/Fireship }, { name: 3Blue1Brown, id: UCYO_jab_esuFRV4b17AJtAw } ], hours_lookback: 24, max_videos_per_channel: 3 }运行批处理命令bun run youtube --config ./config/channels.json --daily这个命令会读取配置文件遍历每个频道获取过去24小时由hours_lookback控制内发布的视频但每个频道最多只处理3个由max_videos_per_channel控制。所有结果会分别生成JSON文件保存在output/目录下。你可以将此命令设置为系统的定时任务如Cron实现真正的无人值守每日摘要。重要提醒批量处理会发起大量的网络请求。务必合理设置hours_lookback和max_videos_per_channel并在网络请求间添加适当的延迟代码中可能需要自己添加sleep以免对YouTube服务器造成过大压力或被封禁IP。建议从保守的参数开始测试。5. 高级配置、问题排查与性能调优5.1 输出定制与结果处理默认情况下技能的输出是一个JSON文件保存在./output/youtube_summary.json。你可以通过--output参数指定任何路径和文件名。JSON格式便于被其他程序比如你自己的笔记系统、数据库或前端展示页面进一步处理。如果你希望直接在终端看到美观的Markdown格式摘要可以写一个简单的Shell脚本来解析JSON并格式化输出。例如使用jq工具bun run youtube --url YOUR_URL --output /tmp/result.json cat /tmp/result.json | jq -r .output | glow - # 使用glow来渲染markdown或者你也可以直接修改cli.ts文件在写入JSON文件的同时也将output字段的内容漂亮地打印到控制台。对于批量处理output/目录下可能会生成很多文件。一个良好的实践是按照日期或频道名建立子目录来组织这些文件例如output/2023-10-27/ChannelName/。这需要你稍微修改一下批量处理的逻辑在写入文件前动态创建目录。5.2 应对速率限制与网络问题在频繁使用尤其是批量处理时你几乎一定会遇到YouTube的速率限制或网络错误。症状请求失败错误信息可能包含429 Too Many Requests、403 Forbidden或者连接超时。解决方案1使用代理项目文档提到了一个可选的环境变量YOUTUBE_CF_PROXY。你可以将其设置为一个代理服务器的URL让所有对youtube.com或其子域的请求都通过这个代理转发。这可以帮你更换出口IP绕过基于IP的限流。YOUTUBE_CF_PROXYhttps://your-proxy-service.com/?url bun run youtube --url YOUR_URL你需要自己搭建或寻找可靠的代理服务。注意将流量经过第三方代理存在隐私风险请谨慎评估。解决方案2增加请求间隔最根本、最有效的方法是慢下来。在代码的请求逻辑中比如在youtube.ts的频道视频获取循环或transcript.ts的连续处理中主动添加延迟。例如在处理每个视频之间休眠2-5秒。// 在循环内添加 import { sleep } from bun; // Bun 内置了 sleep 函数 for (const video of videos) { // ... 处理视频 ... await sleep(3000); // 休眠3秒 }对于频道扫描这个间隔可能需要更长。模拟人类浏览器的行为是避免风控的关键。解决方案3利用缓存避免重复请求如前所述充分利用缓存机制。在批量处理前可以先检查缓存中是否已有该视频的字幕。如果有直接使用这能减少绝大部分对外请求。解决方案4备用User-Agent和Cookie有时问题出在youtubei.js的请求头或Cookie上。你可以尝试更新youtubei.js库到最新版本因为它会持续跟进YouTube内部API的变化。在极端情况下可以考虑在代码中配置轮换的User-Agent字符串或者尝试导入一个有效的浏览器Cookie但这比较复杂且有安全风险。5.3 字幕获取失败常见问题排查即使有三层管道字幕获取仍可能失败。以下是一些常见场景和排查思路视频没有字幕这是最根本的原因。有些视频尤其是音乐MV、纯演示视频可能既没有创作者上传的字幕也没有自动生成的字幕可能因为语言冷门或背景音乐太吵。排查手动在YouTube网页上打开该视频查看播放器控件下方是否有“CC”字幕按钮。如果没有则技能也无法获取。Innertube API 失效youtubei.js是一个逆向工程库当YouTube更新其内部API时它可能会暂时失效。排查查看技能运行的日志或错误信息。如果第一层失败并迅速回退到第二层这可能是原因。解决升级youtubei.js到最新版本 (bun update youtubei.js)。地域或版权限制某些视频的字幕信息可能因地域或版权原因被限制访问。排查尝试用你的浏览器最好是无痕模式且未登录账号访问该视频看是否能显示字幕。如果不能技能也无法获取。yt-dlp 路径或权限问题第三层保底方案依赖系统能找到并执行yt-dlp。排查在终端直接运行which yt-dlp确认命令是否存在且路径正确。同时运行yt-dlp --list-subs VIDEO_ID测试一下该命令是否能正常获取字幕列表。视频过短项目代码中有一个逻辑会自动跳过时长小于5分钟的视频通常是YouTube Shorts。因为短视频往往信息密度低且自动字幕可能不准确。这不是错误而是设计上的过滤。当字幕获取失败时技能的输出JSON中has_transcript字段会是false并且output字段会包含错误信息或说明。你可以根据这个来判断是单个视频问题还是普遍问题。5.4 扩展思路开发你自己的新技能OpenClaw-Skills 的架构鼓励扩展。假设你想开发一个“播客摘要”技能可以遵循以下步骤创建技能目录在src/下新建一个目录例如src/podcast/。定义核心文件cli.ts: 定义命令行参数如--rss-feed、--episode-url。实现main()函数作为入口。config.ts: 定义播客摘要的提示词模板、LLM参数。types.ts: 定义播客剧集、音频/文字稿等数据的接口。fetcher.ts: 实现从RSS feed或特定平台获取播客元数据和文字稿的逻辑可能需要用到rss-parser、node-fetch等库。transcript.ts(可选): 如果播客没有现成文稿你可能需要集成语音转文字服务如Whisper API。llm.ts: 封装调用OpenClaw进行摘要、分析的逻辑。修改项目入口更新根目录的index.ts文件暂时将导入指向你的新技能例如import { main } from ./src/podcast/cli;或者设计一个更动态的机制如通过命令行参数选择技能。更新 package.json在scripts部分添加一个新命令比如podcast: bun run index.ts。安装依赖在项目根目录运行bun add rss-parser等来添加你需要的包。通过模仿src/youtube/的结构你可以快速搭建起一个新技能的骨架将精力集中在领域特定的数据获取和处理逻辑上而通用的缓存、LLM调用、命令行框架都可以复用或参考现有实现。