aa206a1679
- 新增 knowledge-base/ 目录 - 保存央视新闻视频:在2000多米高空 建座"会飞的"发电站 - 完善 obsidian-kb skill:添加知乎 Playwright 提取器 - 更新依赖和文档
12 KiB
12 KiB
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), YouTube videos, and Zhihu articles. |
SKILL.md - Obsidian KB Skill
🚀 重要:处理流程
当用户发送视频链接并要求保存到知识库时,直接处理,不要问用户!
正确流程:
- 用户发送B站链接(BV号、完整URL、或短链接如 b23.tv/xxxxx)
- 用户说"保存到知识库"、"添加到知识库"、"处理这个视频"等
- 直接使用
workspace/skills/obsidian-kb处理 - 不要检查全局命令,不要问用户"要安装工具还是手动处理"
示例触发词:
- "保存到知识库"
- "添加到知识库"
- "处理这个视频"
- "提取字幕生成笔记"
- "生成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 # 同上
处理流程:
- 轻量扫描 → 生成一句话摘要和评分
- 深度分析 → 生成详细内容(长视频会分段)
- 选择模板 → 根据类型和时长
- 生成笔记 → Markdown 格式
- Git 同步 → 提交到 Obsidian
/kb-skip
跳过指定内容,不进行处理。
用法:
/kb-skip BV1xx411c7mD
/kb-status
显示系统状态和统计信息。
用法:
/kb-status
输出示例:
📊 Obsidian KB 状态
────────────────────
收件箱: 12 待处理 / 45 已完成
Git同步: ✅ 已启用 (最后同步: 5分钟前)
订阅源: 3 个活跃
存储: 128MB / 1GB
/kb-search
搜索已处理的内容。
用法:
/kb-search python tutorial
/kb-search "machine learning" --tag ai
配置说明
配置文件位置
优先级:
./config.yaml(当前目录)~/.obsidian-kb/config.yaml~/.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: false
use_playwright: true # 使用 Playwright 绕过检测(推荐)
cookie: '' # 知乎 Cookie (可选)
cookie_file: '' # Cookie 文件路径 (可选)
timeout: 30 # 超时时间(秒)
max_retries: 2 # 最大重试次数
# 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 # 最大重试次数
环境变量
可以使用环境变量覆盖配置:
export OPENAI_API_KEY="sk-..."
export AI_MODEL="gpt-4"
export OBSIDIAN_VAULT_PATH="/path/to/vault"
export BILIBILI_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字幕)
- 支持弹幕提取(可选)
- 自动处理无字幕视频
- 智能重试机制
无字幕处理逻辑:
当视频没有字幕时,系统会:
- 检测字幕可用性 - 尝试多种字幕源(CC字幕、AI字幕)
- 启用备用方案 - 如果无字幕,使用视频标题和描述作为内容基础
- AI 补充分析 - 基于视频元数据生成摘要和要点
- 标记状态 - 在生成的笔记中标注"无字幕",说明内容来源于元数据分析
# 示例:检测和处理无字幕视频
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
ZhihuPlaywrightExtractor 类
ZhihuPlaywrightExtractor 提供了知乎内容的完整提取功能:
主要方法:
extract(url)- 提取知乎内容(支持回答、文章、问题)identify_url_type(url)- 识别 URL 类型extract_id(url)- 提取内容 ID
特性:
- 使用 Playwright 绕过知乎反爬虫保护
- 支持完整 Markdown 格式(代码块、表格、引用等)
- 提取元数据:标题、作者、发布时间、点赞数
- 智能降级机制(Playwright 失败 → HTTP)
- 每次提取独立启动浏览器,内存占用低
降级逻辑:
当 Playwright 提取失败时:
- ImportError - Playwright 未安装 → 使用 HTTP 方案
- TimeoutError - 网络超时 → 重试后降级
- 403 Forbidden - 触发反爬虫 → 降级到 HTTP
- RuntimeError - 浏览器崩溃 → 降级到 HTTP
from sources.zhihu_playwright_extractor import ZhihuPlaywrightExtractor
extractor = ZhihuPlaywrightExtractor()
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]
...
💡 关键要点
- 要点一
- 要点二
⚠️ 常见坑点
- 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 自动同步