feat(obsidian-kb): 实现自动触发机制
- 更新 SKILL.md:添加 frontmatter 元数据和自动触发规则说明 - 创建 handler.py:实现链接检测和预览生成 - 支持多种 URL 模式:B站(完整/BV号/短链接)、YouTube、知乎 - 智能去重避免重复显示 - 短链接显示友好提示 - 支持批量检测多个链接 - 添加 AUTO_TRIGGER.md 实现文档 - 更新任务文件:标记任务1已完成 测试通过: ✅ B站完整 URL、BV号、短链接 ✅ YouTube 视频 ✅ 知乎文章 ✅ 批量检测和去重
This commit is contained in:
@@ -115,3 +115,170 @@ skills/obsidian-kb/
|
||||
🟢 **已完成** - 功能已实现并测试通过
|
||||
|
||||
现在30分钟以上的长视频会自动分段处理,不会再出现 "Context overflow: prompt too large for the model" 错误。
|
||||
|
||||
---
|
||||
|
||||
## 待办事项 - obsidian-kb 技能改进
|
||||
|
||||
**记录时间**: 2026-02-06 20:15
|
||||
**来源**: 用户反馈
|
||||
|
||||
### 🔴 高优先级
|
||||
|
||||
#### 1. 技能自动触发机制
|
||||
- **问题**: 用户发送 B站视频链接时,技能未自动触发
|
||||
- **原因**: SKILL.md 中未定义触发关键词/模式
|
||||
- **解决方案**:
|
||||
- 在 SKILL.md 中添加触发规则,识别 B站/YouTube 视频链接
|
||||
- 或在 _meta.json 中配置触发模式
|
||||
- **预期**: 用户发送视频链接时,自动添加到收件箱并询问是否处理
|
||||
|
||||
#### 2. 短链接解析功能
|
||||
- **问题**: 手机用户无法获取完整 URL,短链接(b23.tv)会被 B站反爬虫拦截
|
||||
- **当前状态**: 手动用 curl 解析,但在代码中 412 错误
|
||||
- **解决方案**:
|
||||
- 实现更强大的短链接解析(浏览器自动化/代理池)
|
||||
- 或提供用户友好的引导:检测到短链接时提示用户复制完整URL或BV号
|
||||
- **技术难点**: B站 412 反爬虫策略
|
||||
- **预期**: 用户可以发送短链接,系统自动解析
|
||||
|
||||
#### 3. 单个视频链接分析功能
|
||||
- **问题**: 技能设计为批量订阅模式,缺少"快速添加单个视频"的便捷命令
|
||||
- **临时方案**: 创建了 add_video.py 辅助脚本
|
||||
- **解决方案**:
|
||||
- 在 CLI 中添加 `/kb-add` 命令
|
||||
- 或集成到现有的 `/kb-subscribe` 中,支持 URL 参数
|
||||
- **预期**: 用户可以用 `/kb-add <URL>` 快速添加单个视频
|
||||
|
||||
#### 4. 本地生成字幕功能
|
||||
- **问题**: 某些视频没有字幕,导致分析内容为空
|
||||
- **当前状态**: 只能跳过无字幕视频
|
||||
- **解决方案**:
|
||||
- 集成语音识别工具(如 OpenAI Whisper、Aliyun 语音识别)
|
||||
- 下载音频,本地生成字幕
|
||||
- 支持多语言识别
|
||||
- **依赖**: 需要额外的语音识别服务/API
|
||||
- **预期**: 无字幕视频也能生成笔记
|
||||
|
||||
### 📋 实施计划
|
||||
|
||||
| 优先级 | 任务 | 预计工时 | 依赖 |
|
||||
|--------|------|----------|------|
|
||||
| P0 | 自动触发机制 | 1-2h | SKILL.md 研究 |
|
||||
| P1 | 单个视频添加命令 | 1h | 无 |
|
||||
| P2 | 短链接解析 | 2-3h | 反爬虫研究 |
|
||||
| P3 | 本地生成字幕 | 3-5h | Whisper/API 集成 |
|
||||
|
||||
### 🔗 相关文件
|
||||
|
||||
- 技能目录: `skills/obsidian-kb/`
|
||||
- 临时脚本: `skills/obsidian-kb/add_video.py`
|
||||
- 待办详情: `memory/tasks/obsidian-kb-improvements.md`
|
||||
|
||||
---
|
||||
|
||||
## 新增:自动触发机制完成(20:45)
|
||||
|
||||
### 任务1:自动触发机制 - 已完成 ✓
|
||||
|
||||
**完成时间**: 2026-02-06 20:45
|
||||
|
||||
#### 实现内容
|
||||
|
||||
1. **SKILL.md 更新**
|
||||
- 添加 frontmatter 元数据(name, description, version, author)
|
||||
- 新增"自动触发规则"章节
|
||||
- 详细说明支持的 URL 模式和触发流程
|
||||
- 添加短链接友好提示说明
|
||||
|
||||
2. **Handler 脚本(handler.py)**
|
||||
- 使用正则表达式检测多种 URL 模式
|
||||
- 支持平台识别:B站、YouTube、知乎
|
||||
- 智能去重避免重复显示
|
||||
- 生成友好的预览信息
|
||||
- 短链接显示用户引导
|
||||
|
||||
3. **支持的 URL 模式**
|
||||
- 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/*`
|
||||
|
||||
4. **测试结果**
|
||||
- ✅ 所有 URL 模式检测正确
|
||||
- ✅ 短链接显示友好提示
|
||||
- ✅ 支持批量检测多个链接
|
||||
- ✅ 智能去重避免重复显示
|
||||
|
||||
#### 文件变更
|
||||
```
|
||||
skills/obsidian-kb/
|
||||
├── SKILL.md [修改] 添加 frontmatter 和触发规则
|
||||
├── handler.py [新增] 自动触发处理器
|
||||
└── AUTO_TRIGGER.md [新增] 实现文档
|
||||
```
|
||||
|
||||
#### 示例输出
|
||||
|
||||
**B站完整 URL:**
|
||||
```
|
||||
🔍 检测到内容链接:
|
||||
|
||||
📺 [1] B站视频
|
||||
URL: https://www.bilibili.com/video/BV1xx411c7mD
|
||||
ID: BV1xx411c7mD
|
||||
|
||||
是否添加到收件箱并处理?(y/n)
|
||||
```
|
||||
|
||||
**B站短链接:**
|
||||
```
|
||||
🔍 检测到内容链接:
|
||||
|
||||
📺 [1] B站视频
|
||||
URL: https://b23.tv/oLBZZfK
|
||||
⚠️ 短链接,需要用户提供完整URL或ID
|
||||
|
||||
🔗 检测到短链接
|
||||
|
||||
⚠️ 由于反爬虫保护,短链接无法自动解析
|
||||
|
||||
📱 手机用户:
|
||||
1. 打开链接
|
||||
2. 在浏览器地址栏复制完整 URL
|
||||
3. 发送给助手
|
||||
|
||||
💻 桌面用户:
|
||||
1. 发送 BV 号(如:BV1jcFqz7EFW)
|
||||
2. 或使用完整 URL
|
||||
```
|
||||
|
||||
**批量链接:**
|
||||
```
|
||||
🔍 检测到内容链接:
|
||||
|
||||
📺 [1] B站视频
|
||||
URL: https://www.bilibili.com/video/BV1xx411c7mD
|
||||
📺 [2] B站视频
|
||||
URL: https://www.bilibili.com/video/BV2yy522c8nE
|
||||
▶️ [3] YouTube视频
|
||||
URL: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
||||
|
||||
是否将上述 3 个内容添加到收件箱?(y/n)
|
||||
```
|
||||
|
||||
#### 验收标准
|
||||
- [x] SKILL.md 添加了触发规则
|
||||
- [x] Handler 能够检测各种 URL 格式
|
||||
- [x] 显示友好的预览信息
|
||||
- [x] 短链接显示友好提示
|
||||
- [x] 支持批量检测多个链接
|
||||
- [x] 智能去重避免重复显示
|
||||
- [x] 所有 URL 模式测试通过
|
||||
|
||||
#### 后续工作
|
||||
- 实现 YouTube 和知乎适配器(当前仅 Bilibili 完整支持)
|
||||
- 短链接自动解析(需要浏览器自动化或代理池)
|
||||
|
||||
#### 相关文档
|
||||
- 实现文档: `skills/obsidian-kb/AUTO_TRIGGER.md`
|
||||
- 任务详情: `memory/tasks/obsidian-kb-improvements.md`
|
||||
|
||||
@@ -0,0 +1,340 @@
|
||||
# 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 脚本处理链接检测和预览。
|
||||
|
||||
**完成的修改**:
|
||||
- [x] 1.1 研究 OpenClaw 技能触发机制
|
||||
- [x] 1.2 在 SKILL.md 中添加触发规则(frontmatter + 文档)
|
||||
- [x] 1.3 创建 handler.py 处理链接检测
|
||||
- [x] 1.4 测试所有 URL 模式
|
||||
- [x] 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 模拟真实浏览器:
|
||||
```python
|
||||
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`**
|
||||
```bash
|
||||
/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 文档
|
||||
|
||||
#### 代码示例
|
||||
```python
|
||||
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(本地)**
|
||||
```python
|
||||
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 添加缓存机制(避免重复生成)
|
||||
|
||||
#### 代码示例
|
||||
```python
|
||||
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(本地方案)
|
||||
```bash
|
||||
pip install openai-whisper
|
||||
pip install ffmpeg # 系统依赖
|
||||
```
|
||||
|
||||
### Playwright(短链接解析)
|
||||
```bash
|
||||
pip install playwright
|
||||
playwright install chromium
|
||||
```
|
||||
|
||||
### yt-dlp(音频下载)
|
||||
```bash
|
||||
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 号 → 触发
|
||||
- 发送非视频链接 → 不触发
|
||||
|
||||
### 单个添加测试
|
||||
```bash
|
||||
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*
|
||||
@@ -2,6 +2,19 @@
|
||||
|
||||
## 活跃任务
|
||||
|
||||
### obsidian-kb 技能改进
|
||||
- **状态**: 🟡 进行中
|
||||
- **开始时间**: 2026-02-06
|
||||
- **预计完成**: 待定
|
||||
- **计划文件**: [memory/tasks/obsidian-kb-improvements.md](./obsidian-kb-improvements.md)
|
||||
- **当前阶段**: 需求记录与方案设计
|
||||
- **待办任务**:
|
||||
- 🔴 P0: 实现自动触发机制
|
||||
- 🟡 P1: 单个视频快速添加功能
|
||||
- 🟠 P2: 短链接解析功能
|
||||
- 🔵 P3: 本地生成字幕功能
|
||||
- **下一步**: 优先实现 P1(单个视频添加),1小时预计完成
|
||||
|
||||
### B站插件技术调研
|
||||
- **状态**: 🟡 进行中
|
||||
- **开始时间**: 2026-02-06
|
||||
@@ -11,7 +24,11 @@
|
||||
- **下一步**: 1.1 官方开放平台调研
|
||||
|
||||
## 历史任务
|
||||
暂无
|
||||
|
||||
### 长视频分段分析功能
|
||||
- **状态**: 🟢 已完成
|
||||
- **完成时间**: 2026-02-06
|
||||
- **详情**: [memory/2026-02-06.md](../2026-02-06.md)
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user