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/skills/obsidian-kb/SKILL.md
T
OpenClaw Agent e0a2b323d9 Update obsidian-kb skill and add find-skills
- obsidian-kb: Add OCR processors (easyocr, tesseract)
- obsidian-kb: Fix subtitle detection with test files
- obsidian-kb: Add cookie verification script
- Add find-skills skill for discovering capabilities
- Add video processing scripts
- Update clawhub lock file
2026-02-09 11:53:42 +08:00

17 KiB
Raw Blame History

name, description
name description
obsidian-kb Multi-source content knowledge base with video processing. Use when user says "保存知识库", "添加到知识库", "处理这个视频", "生成obsidian笔记" etc. Supports B站/bilibili (BV号, b23.tv, www.bilibili.com) using Playwright, YouTube videos, and Zhihu articles using DrissionPage.

SKILL.md - Obsidian KB Skill

🚀 重要:处理流程

当用户发送视频链接并要求保存到知识库时,直接处理,不要问用户!

正确流程:

  1. 用户发送B站链接(BV号、完整URL、或短链接如 b23.tv/xxxxx)
  2. 用户说"保存到知识库"、"添加到知识库"、"处理这个视频"等
  3. 直接使用 workspace/skills/obsidian-kb 处理
  4. 不要检查全局命令,不要问用户"要安装工具还是手动处理"

示例触发词:

  • "保存到知识库"
  • "添加到知识库"
  • "处理这个视频"
  • "提取字幕生成笔记"
  • "生成obsidian笔记"

元数据

  • 名称: obsidian-kb
  • 版本: 1.0.0
  • 描述: 多源内容知识库维护系统,支持长视频分段分析
  • 作者: OpenClaw

命令列表

命令 描述 用法
/kb-subscribe 订阅内容源 /kb-subscribe <source>:<type>:<id>
/kb-inbox 查看收件箱 /kb-inbox [--limit N]
/kb-process 处理内容 /kb-process [content_id]
/kb-skip 跳过内容 /kb-skip <content_id>
/kb-status 查看状态 /kb-status
/kb-search 搜索知识库 /kb-search <query>

命令详解

/kb-subscribe

订阅一个内容源,支持自动获取更新。

用法:

/kb-subscribe bilibili:fav:12345678
/kb-subscribe bilibili:up:123456
/kb-subscribe youtube:channel:UCxxx
/kb-subscribe zhihu:collection:12345

支持的源:

  • bilibili:fav:<fav_id> - Bilibili 收藏夹
  • bilibili:up:<mid> - Bilibili UP主
  • youtube:channel:<channel_id> - YouTube 频道
  • zhihu:collection:<collection_id> - 知乎收藏夹

/kb-inbox

显示待处理的内容列表。

用法:

/kb-inbox
/kb-inbox --limit 10
/kb-inbox --status new

输出示例:

📥 收件箱 (5 items)
────────────────────
1. BV1xx411c7mD | Python入门教程 | ⭐ 85 | 📝 一句话摘要...
2. BV2yy522c8nE | React Hooks详解 | ⭐ 92 | 📝 一句话摘要...

/kb-process

处理内容,生成 Obsidian 笔记。

用法:

/kb-process --all              # 处理所有待处理项
/kb-process BV1xx411c7mD       # 处理指定内容
/kb-process --id BV1xx411c7mD  # 同上

处理流程:

  1. 轻量扫描 → 生成一句话摘要和评分
  2. 深度分析 → 生成详细内容(长视频会分段)
  3. 选择模板 → 根据类型和时长
  4. 生成笔记 → Markdown 格式
  5. Git 同步 → 提交到 Obsidian

/kb-skip

跳过指定内容,不进行处理。

用法:

/kb-skip BV1xx411c7mD

/kb-status

显示系统状态和统计信息。

用法:

/kb-status

输出示例:

📊 Obsidian KB 状态
────────────────────
收件箱: 12 待处理 / 45 已完成
Git同步: ✅ 已启用 (最后同步: 5分钟前)
订阅源: 3 个活跃
存储: 128MB / 1GB

搜索已处理的内容。

用法:

/kb-search python tutorial
/kb-search "machine learning" --tag ai

配置说明

配置文件位置

优先级:

  1. ./config.yaml (当前目录)
  2. ~/.obsidian-kb/config.yaml
  3. ~/.config/obsidian-kb/config.yaml

配置项

# AI 配置
ai:
  provider: openai          # AI 提供商
  model: gpt-4             # 模型名称
  api_key: sk-...          # API Key (建议使用环境变量)

# 存储配置
storage:
  inbox_dir: inbox         # 收件箱目录
  topics_dir: topics       # 主题目录
  data_dir: data           # 数据目录

# 输出配置
output:
  format: markdown         # 输出格式
  encoding: utf-8          # 文件编码
  include_timestamp: true  # 包含时间戳
  include_source: true     # 包含源链接

# Git 同步配置
git:
  enabled: true            # 启用 Git 同步
  vault_path: ~/ObsidianVault  # Obsidian 知识库路径
  remote: origin           # 远程仓库名
  branch: main             # 分支名
  auto_commit: true        # 自动提交
  commit_message_template: "Update from obsidian-kb: {count} items"

# 分段配置
chunking:
  enabled: true            # 启用长视频分段
  chunk_duration_seconds: 900      # 分段时长 (15分钟)
  max_chunk_duration_seconds: 1800 # 最大分段时长
  long_video_threshold: 1800       # 长视频阈值 (30分钟)

# 数据源配置
sources:
  bilibili:
    enabled: true
    cookie: ''             # Bilibili Cookie (可选)
  youtube:
    enabled: false
    api_key: ''            # YouTube API Key
  zhihu:
    enabled: true
    use_drissionpage: true  # 使用 DrissionPage 绕过检测(推荐)
    cookie_file: ~/.obsidian-kb/zhihu_cookies.json  # Cookie 文件路径
    cookie_str: ""  # 可选:直接在配置中填入 Cookie JSON
    timeout: 30
    headless: true

# Bilibili 提取器配置
bilibili_extraction:
  use_playwright: true     # 使用 Playwright 绕过检测
  headless: true           # 无头模式
  cookie_file: ''          # Cookie 文件路径 (可选)
  enable_subtitle: true    # 启用字幕提取
  subtitle_language: zh-CN # 字幕语言
  enable_danmaku: false    # 启用弹幕提取
  timeout_seconds: 30      # 超时时间
  max_retries: 3           # 最大重试次数

# 硬字幕提取配置 (OCR 方式)
hard_subtitle:
  # 是否启用硬字幕提取功能
  enabled: true

  # OCR 引擎选择
  # 可选值: "paddleocr" (推荐), "tesseract"
  engine: "paddleocr"

  # 字幕区域检测配置
  detection:
    # 默认字幕区域: "bottom" (底部), "full" (全屏), "auto" (自动检测)
    default_region: "bottom"
    # 当默认区域未检测到字幕时,是否自动回退到全屏模式
    fallback_auto: true
    # 是否缓存字幕区域检测结果(提升处理速度)
    cache_region: true

  # OCR 识别配置
  ocr:
    # 置信度阈值: 低于此值的识别结果将被过滤
    confidence_threshold: 0.7
    # 批处理大小: 每次处理的帧数(影响内存使用和速度)
    batch_size: 32
    # 最大并发工作线程数
    max_workers: 4

  # 视频帧提取配置
  video:
    # 抽帧间隔 (秒): 每隔多少秒抽取一帧进行识别
    interval_seconds: 5
    # 最大抽取帧数: 防止处理过长视频导致资源耗尽
    max_frames: 500
    # 流式处理模式: 逐步读取视频帧,避免一次性加载整个视频
    stream_mode: true

  # 后处理配置
  postprocess:
    # 是否启用去重: 去除连续相同的字幕文本
    deduplicate: true
    # 最小文本长度: 少于此长度的识别结果将被视为噪声
    min_length: 2
    # 是否过滤噪声: 使用规则过滤明显错误的识别结果
    filter_noise: true

环境变量

可以使用环境变量覆盖配置:

export OPENAI_API_KEY="sk-..."
export AI_MODEL="gpt-4"
export OBSIDIAN_VAULT_PATH="/path/to/vault"
export BILIBILI_COOKIE="..."
export ZHIHU_COOKIE='[{"name":"z_c0","value":"xxx"}]'

Zhihu 提取器配置

知乎提取器使用 DrissionPage + Cookie 方式:

sources:
  zhihu:
    enabled: true
    use_drissionpage: true
    cookie_file: ~/.obsidian-kb/zhihu_cookies.json  # Cookie 文件路径
    cookie_str: ""  # 可选:直接在配置中填入 Cookie JSON
    timeout: 30
    headless: true

Cookie 获取方式:

  1. 在有浏览器的机器上登录知乎
  2. 打开开发者工具 (F12)
  3. 进入 Application → Cookies → https://www.zhihu.com
  4. 导出所有 Cookie 为 JSON 文件
  5. 上传到服务器指定路径

Cookie 文件格式:

[
  {
    "name": "z_c0",
    "value": "xxx",
    "domain": ".zhihu.com",
    "path": "/",
    "expiry": 1234567890,
    "secure": true,
    "httpOnly": false
  }
]

Cookie 加载优先级:

  1. 配置文件中的 cookie_str(最高优先级)
  2. 环境变量 ZHIHU_COOKIE
  3. Cookie 文件(最低优先级)

提取器说明

Extractors 目录

extractors/ 目录包含内容提取器实现:

extractors/
├── __init__.py
├── base.py           # 提取器基类
└── bilibili.py       # Bilibili 提取器

BilibiliExtractor 类

BilibiliExtractor 提供了 Bilibili 视频的完整提取功能:

主要方法:

  • extract_video(video_url) - 提取视频信息
  • extract_subtitle(video_url) - 提取字幕
  • extract_danmaku(video_url) - 提取弹幕(可选)
  • extract_video_info(video_url) - 提取视频元信息

特性:

  • 使用 Playwright 绕过反爬检测
  • 支持字幕提取(CC字幕 + AI字幕)
  • 支持弹幕提取(可选)
  • 自动处理无字幕视频
  • 智能重试机制

无字幕处理逻辑:

当视频没有字幕时,系统会:

  1. 检测字幕可用性 - 尝试多种字幕源(CC字幕、AI字幕)
  2. 启用备用方案 - 如果无字幕,使用视频标题和描述作为内容基础
  3. AI 补充分析 - 基于视频元数据生成摘要和要点
  4. 标记状态 - 在生成的笔记中标注"无字幕",说明内容来源于元数据分析
# 示例:检测和处理无字幕视频
if not subtitle_text:
    logger.warning(f"Video {video_url} has no subtitles")
    # 使用视频元数据生成基础内容
    content = {
        "title": video_info["title"],
        "description": video_info["desc"],
        "tags": video_info["tags"],
        "subtitle_available": False
    }
else:
    content["subtitle_available"] = True
    content["subtitle_text"] = subtitle_text

硬字幕提取功能

当视频没有内置字幕时,硬字幕提取功能可以通过 OCR(光学字符识别)技术从视频画面中识别字幕文本。

功能介绍:

  • 自动检测和识别视频画面中的字幕文本
  • 支持多种 OCR 引擎(PaddleOCR、Tesseract)
  • 智能字幕区域检测(底部、全屏、自动)
  • 自动去重和噪声过滤
  • 支持流式处理,降低内存占用

使用场景:

  • 视频没有提供 CC 字幕或 AI 字幕
  • 字幕嵌入在视频画面中(硬编码字幕)
  • 需要提取非标准格式的字幕

配置说明:

hard_subtitle:
  # 是否启用硬字幕提取功能
  enabled: true

  # OCR 引擎选择
  # 可选值: "paddleocr" (推荐), "tesseract"
  engine: "paddleocr"

  # 字幕区域检测配置
  detection:
    # 默认字幕区域: "bottom" (底部), "full" (全屏), "auto" (自动检测)
    default_region: "bottom"
    # 当默认区域未检测到字幕时,是否自动回退到全屏模式
    fallback_auto: true
    # 是否缓存字幕区域检测结果(提升处理速度)
    cache_region: true

  # OCR 识别配置
  ocr:
    # 置信度阈值: 低于此值的识别结果将被过滤
    confidence_threshold: 0.7
    # 批处理大小: 每次处理的帧数(影响内存使用和速度)
    batch_size: 32
    # 最大并发工作线程数
    max_workers: 4

  # 视频帧提取配置
  video:
    # 抽帧间隔 (秒): 每隔多少秒抽取一帧进行识别
    interval_seconds: 5
    # 最大抽取帧数: 防止处理过长视频导致资源耗尽
    max_frames: 500
    # 流式处理模式: 逐步读取视频帧,避免一次性加载整个视频
    stream_mode: true

  # 后处理配置
  postprocess:
    # 是否启用去重: 去除连续相同的字幕文本
    deduplicate: true
    # 最小文本长度: 少于此长度的识别结果将被视为噪声
    min_length: 2
    # 是否过滤噪声: 使用规则过滤明显错误的识别结果
    filter_noise: true

使用示例:

from obsidian_kb.extractors.bilibili import BilibiliExtractor

# 创建提取器实例(自动启用硬字幕提取)
extractor = BilibiliExtractor(
    use_playwright=True,
    headless=True
)

# 当视频没有内置字幕时,会自动尝试硬字幕提取
subtitle = extractor.extract_subtitle("https://www.bilibili.com/video/BV1xx411c7mD")

print(f"识别到的字幕: {subtitle}")

注意事项:

  1. 性能考虑:硬字幕提取需要较高的计算资源,建议在配置合理的机器上运行
  2. 识别准确度:OCR 识别准确度受字幕字体、颜色、背景等因素影响,可能存在误差
  3. 处理时间:硬字幕提取比软字幕提取慢,对于长视频需要较长时间处理
  4. 依赖安装:使用前需要安装 OCR 引擎依赖:
    • PaddleOCR: pip install paddleocr paddlepaddle
    • Tesseract: 需要安装 Tesseract OCR 引擎和语言包
  5. 网络视频:流式处理需要稳定的网络连接
  6. 字幕格式:不同视频的字幕样式差异较大,可能需要调整配置参数以获得最佳效果

最佳实践:

  • 对于短视频(<30分钟),可以减小 interval_seconds 以提高识别精度
  • 对于长视频,增加 interval_seconds 和减少 max_frames 以平衡速度和质量
  • 如果字幕位置固定在底部,使用 default_region: "bottom" 可以提升速度
  • 首次使用建议先测试一段视频,根据结果调整配置参数

ZhihuDrissionExtractor 类

知乎 DrissionPage 提取器提供知乎内容的完整提取功能:

主要方法:

  • extract(url) - 提取知乎内容(支持回答、文章、问题)
  • identify_url_type(url) - 识别 URL 类型
  • extract_id(url) - 提取内容 ID
  • _load_cookies() - 加载 Cookie(支持配置/环境/文件)
  • _apply_cookies(cookies) - 应用 Cookie 到浏览器

特性:

  • 使用 DrissionPage 绕过知乎反爬虫保护
  • 支持完整 Markdown 格式(代码块、表格、引用等)
  • 提取元数据:标题、作者、发布时间、点赞数
  • Cookie 加载优先级:配置 > 环境变量 > 文件
  • 支持无头模式,适合服务器环境
from obsidian_kb.extractors.zhihu import ZhihuDrissionExtractor

extractor = ZhihuDrissionExtractor()
data = extractor.extract("https://www.zhihu.com/question/266309957/answer/2003427891925509507")

print(f"Title: {data['title']}")
print(f"Author: {data['author']}")
print(f"Content (Markdown): {data['content_markdown']}")

返回数据结构:

{
    'type': 'answer' | 'article' | 'question',
    'title': str,
    'author': str,
    'content': str,              # HTML 格式
    'content_markdown': str,      # Markdown 格式
    'publish_time': str,
    'vote_up': int,
    'url': str,
    'content_id': str
}

使用提取器

直接使用提取器:

from obsidian_kb.extractors.bilibili import BilibiliExtractor

# 创建提取器实例
extractor = BilibiliExtractor(
    use_playwright=True,
    headless=True
)

# 提取视频信息
video_info = extractor.extract_video("https://www.bilibili.com/video/BV1xx411c7mD")

# 提取字幕
subtitle = extractor.extract_subtitle("https://www.bilibili.com/video/BV1xx411c7mD")

print(f"Title: {video_info['title']}")
print(f"Subtitle length: {len(subscription)} characters")

通过管道使用:

# 提取器会自动被管道调用
/kb-process BV1xx411c7mD

模板变量

通用变量

所有模板可用:

  • {{ title }} - 标题
  • {{ source }} - 来源 (bilibili/youtube/zhihu)
  • {{ url }} - 原始 URL
  • {{ author }} - 作者/UP主
  • {{ duration }} - 时长
  • {{ date }} - 日期
  • {{ tags }} - 标签列表
  • {{ one_liner }} - 一句话摘要
  • {{ summary }} - 详细摘要
  • {{ key_points }} - 核心要点列表
  • {{ quality_score }} - 质量评分

教程视频额外变量

仅 tutorial_video.md 可用:

  • {{ prerequisites }} - 前置知识列表
  • {{ outline }} - 分段大纲列表
    • {{ section.title }} - 分段标题
    • {{ section.time_range }} - 时间段
    • {{ section.summary }} - 分段摘要
    • {{ section.code_snippet }} - 代码片段
    • {{ section.code_language }} - 代码语言
  • {{ pitfalls }} - 常见坑点列表
  • {{ practice_advice }} - 实践建议列表

输出格式

轻量视频输出

---
title: "视频标题"
source: "bilibili"
url: "https://..."
author: "UP主"
duration: "10:30"
date: "2024-01-01T00:00:00"
tags:
  - python
  - tutorial
---

#python #tutorial

**一句话摘要**: 这是一句摘要

## 摘要
详细摘要内容...

## 核心要点
1. 要点一
2. 要点二

教程视频输出

---
title: "Python 完整教程"
source: "bilibili"
url: "https://..."
up主: "CodeMaster"
duration: "2:30:00"
quality_score: 95
---

## 🎯 一句话总结
...

## 📚 前置知识
- 基础编程概念
- Python 环境搭建

## 📝 步骤详解
### 环境配置 [00:00-15:00]
如何配置 Python 开发环境

```bash
pip install python

基础语法 [15:00-45:00]

...

💡 关键要点

  1. 要点一
  2. 要点二

⚠️ 常见坑点

  • Python 2 与 3 的区别
  • 缩进问题

🤔 实践建议

  • 跟随视频动手编码
  • 完成课后练习

## 故障排除

### 无法获取字幕

1. 检查 Bilibili Cookie 是否正确设置
2. 确认视频有字幕/CC字幕
3. 检查网络连接

### Git 同步失败

1. 确认 vault_path 指向正确的 Git 仓库
2. 检查 Git 配置和权限
3. 查看 Git 日志: `git status` 在 vault 目录

### AI 分析失败

1. 检查 API Key 是否有效
2. 确认有可用额度
3. 查看详细错误日志

## 更新日志

### v1.0.0
- 初始版本发布
- 支持 Bilibili、YouTube、知乎
- 长视频分段分析
- Git 自动同步