This repository has been archived on 2026-02-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
openclaw-skills/memory/tasks/obsidian-kb-improvements.md
T
OpenClaw Agent 7a1ad6088a feat(obsidian-kb): 实现自动触发机制
- 更新 SKILL.md:添加 frontmatter 元数据和自动触发规则说明
- 创建 handler.py:实现链接检测和预览生成
- 支持多种 URL 模式:B站(完整/BV号/短链接)、YouTube、知乎
- 智能去重避免重复显示
- 短链接显示友好提示
- 支持批量检测多个链接
- 添加 AUTO_TRIGGER.md 实现文档
- 更新任务文件:标记任务1已完成

测试通过:
✅ B站完整 URL、BV号、短链接
✅ YouTube 视频
✅ 知乎文章
✅ 批量检测和去重
2026-02-06 21:05:20 +08:00

8.3 KiB
Raw Blame History

obsidian-kb 技能改进待办事项

创建时间: 2026-02-06 20:15 技能版本: 1.0.0 状态: 🟡 进行中


问题记录

事件背景

用户通过 WhatsApp 发送 B站视频短链接 https://b23.tv/oLBZZfK,期望技能自动处理。实际流程:

  1. ❌ 技能未自动触发
  2. ⚠️ 短链接解析失败(B站 412 反爬虫)
  3. 📝 手动提取 BV 号 BV1jcFqz7EFW 成功处理
  4. ⚠️ 视频无字幕,生成笔记内容为空

用户反馈的四个问题:

  1. 技能应该立刻触发
  2. 应该有短链接到长链接的解析过程(手机用户无法获取长链)
  3. 为技能增加单个视频链接分析功能
  4. 针对没有字幕的,看看有没有本地生成字幕的方法

待办任务

✅ 任务1:实现自动触发机制

状态: 已完成 ✓ 完成时间: 2026-02-06 优先级: P0(最高) 实际工时: 2 小时

实施结果

方案A: SKILL.md 触发规则 + Handler 脚本 在 SKILL.md 中添加了 frontmatter 元数据和触发规则说明,创建了 handler.py 脚本处理链接检测和预览。

完成的修改:

  • 1.1 研究 OpenClaw 技能触发机制
  • 1.2 在 SKILL.md 中添加触发规则(frontmatter + 文档)
  • 1.3 创建 handler.py 处理链接检测
  • 1.4 测试所有 URL 模式
  • 1.5 优化用户体验(确认提示、短链接友好提示)

文件变更:

  • skills/obsidian-kb/SKILL.md - 添加 frontmatter 和触发规则章节
  • skills/obsidian-kb/handler.py - 新增自动触发处理器
  • skills/obsidian-kb/AUTO_TRIGGER.md - 新增实现文档

支持的模式:

  • B站视频: https://www.bilibili.com/video/BV*, BV*, https://b23.tv/*
  • YouTube 视频: https://www.youtube.com/watch?v=*, https://youtu.be/*
  • 知乎文章: https://zhuanlan.zhihu.com/p/*

测试结果: ✅ 所有 URL 模式检测正确 ✅ 短链接显示友好提示 ✅ 支持批量检测多个链接 ✅ 智能去重避免重复显示

详细文档: skills/obsidian-kb/AUTO_TRIGGER.md


🟠 任务2:短链接解析功能

优先级: P2(中等) 预计工时: 2-3 小时

问题描述

B站短链接 b23.tv 会被反爬虫拦截(HTTP 412),手机用户无法获取完整 URL。

技术方案

方案A: 浏览器自动化 使用 Playwright/Selenium 模拟真实浏览器:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto(short_url)
    final_url = page.url
    browser.close()
    return final_url

方案B: 用户引导(轻量级) 检测到短链接时,友好提示用户:

🔗 检测到 B站短链接

⚠️  由于反爬虫保护,短链接无法自动解析

📱 手机用户:
   1. 打开链接
   2. 在浏览器地址栏复制完整 URL
   3. 发送给助手

💻 桌面用户:
   1. 发送 BV 号(如:BV1jcFqz7EFW)
   2. 或使用完整 URL

💡 提示:完整 URL 格式为:https://www.bilibili.com/video/BVxxxxx

方案C: 代理池 + 请求头伪装

  • 使用代理轮换
  • 模拟真实浏览器请求头
  • 随机延迟

实施步骤

  • 2.1 评估各方案可行性
  • 2.2 优先实施方案B(用户引导)
  • 2.3 可选:研究 Playwright 集成
  • 2.4 测试各种短链接场景

验收标准

  • 短链接能够友好处理(要么解析成功,要么引导用户)
  • 用户不会感到困惑
  • 支持 b23.tv 和其他短链接服务

🟡 任务3:单个视频快速添加功能

优先级: P1(高) 预计工时: 1 小时

问题描述

当前技能是批量订阅模式,缺少快速添加单个视频的命令。用户需要手动编写脚本。

技术方案

新增命令: /kb-add

/kb-add <URL>                 # 添加单个视频
/kb-add <URL> --process       # 添加并立即处理
/kb-add <URL> --yes           # 跳过确认

实现位置: src/cli.py

实施步骤

  • 3.1 在 cli.py 中添加 cmd_add() 函数
  • 3.2 调用现有的 BilibiliAdapter.extract_content()
  • 3.3 调用现有的 Storage.save_content()
  • 3.4 支持可选的 --process 参数
  • 3.5 更新 SKILL.md 文档

代码示例

def cmd_add(args: argparse.Namespace):
    """添加单个视频到收件箱"""
    adapter = BilibiliAdapter()

    # 解析 URL
    url = resolve_url(args.url)  # 可选:短链接解析

    # 提取内容
    content = adapter.extract_content(url)
    if not content:
        print(f"❌ 无法提取视频: {url}")
        return 1

    # 获取字幕
    content.transcript = adapter.get_transcript(content)

    # 保存
    storage = Storage()
    content.status = ContentStatus.CONFIRMED
    storage.save_content(content)

    print(f"✅ 已添加: {content.title}")
    print(f"   ID: {content.id}")

    # 可选:立即处理
    if args.process:
        pipeline = ProcessingPipeline()
        result = pipeline.process_full(content)
        print(f"📄 笔记: {result.output_path}")

验收标准

  • /kb-add <URL> 命令可用
  • 支持短链接解析(配合任务2)
  • 支持立即处理选项
  • 更新 SKILL.md 文档

🔵 任务4:本地生成字幕功能

优先级: P3(低) 预计工时: 3-5 小时

问题描述

部分视频没有字幕,导致 AI 分析结果为空。

技术方案

方案A: OpenAI Whisper(本地)

import whisper

model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
print(result["text"])

方案B: 阿里云语音识别(API) 使用 Aliyun TTS/ASR API(如果已配置)

方案C: 腾讯云语音识别(API) 使用腾讯云 ASR API

实施步骤

  • 4.1 评估各方案:Whisper(本地免费)vs 云API(更准确)
  • 4.2 下载视频音频(使用 yt-dlp)
  • 4.3 实现字幕生成
  • 4.4 支持多语言识别
  • 4.5 添加缓存机制(避免重复生成)

代码示例

def generate_subtitles(content: Content) -> str:
    """为无字幕视频生成字幕"""

    # 1. 下载音频
    audio_path = download_audio(content.url)

    # 2. 语音识别
    model = whisper.load_model("base")
    result = model.transcribe(
        audio_path,
        language="zh",  # 自动检测
        task="transcribe"
    )

    # 3. 转换为 SRT 格式
    srt_text = to_srt(result["segments"])

    # 4. 保存到缓存
    cache_path = f"cache/subtitles/{content.id}.srt"
    save_subtitle(cache_path, srt_text)

    return srt_text

验收标准

  • 无字幕视频能生成字幕
  • 字幕准确度可接受
  • 处理时间合理(5分钟视频 < 1分钟)
  • 支持中文字幕

技术依赖

Whisper(本地方案)

pip install openai-whisper
pip install ffmpeg  # 系统依赖

Playwright(短链接解析)

pip install playwright
playwright install chromium

yt-dlp(音频下载)

pip install yt-dlp

实施路线图

Phase 1: 快速修复(1-2天)

  • ✅ 任务3:单个视频添加功能(1h)
  • 🔲 任务1:自动触发机制(1-2h)

Phase 2: 体验优化(3-5天)

  • 🔲 任务2:短链接解析(2-3h)
  • 🔲 测试与文档更新

Phase 3: 功能增强(可选)

  • 🔲 任务4:本地生成字幕(3-5h)
  • 🔲 性能优化与错误处理

测试用例

自动触发测试

  • 发送完整 URL → 触发
  • 发送短链接 → 触发或引导
  • 发送 BV 号 → 触发
  • 发送非视频链接 → 不触发

单个添加测试

python3 src/cli.py add "https://www.bilibili.com/video/BVxxxxx"
python3 src/cli.py add "BVxxxxx"
python3 src/cli.py add "https://b23.tv/xxxxx"
python3 src/cli.py add "https://www.bilibili.com/video/BVxxxxx" --process

字幕生成测试

  • 有字幕视频 → 跳过生成
  • 无字幕视频 → 生成字幕
  • 长视频 → 分段识别
  • 多语言视频 → 正确识别

备注

当前临时方案

  • skills/obsidian-kb/add_video.py - 单个视频添加脚本
  • 手动用 curl 解析短链接
  • 跳过无字幕视频

相关文件

  • 技能目录: skills/obsidian-kb/
  • CLI 入口: src/cli.py
  • B站适配器: src/sources/bilibili.py
  • 存储管理: src/storage.py
  • 处理管道: src/pipeline.py

最后更新: 2026-02-06 20:15