Skill: englandtong/web-search-rules (version 2.0.2)

--- name: "web-search-rules" description: "搜尋網頁時的規則管理技能。支持多種知識庫平台（IMA、騰訊文檔、Obsidian、NotebookLM），自動管理搜尋網址庫（白名單、黑名單、未分類），暫存搜尋內容，並在用戶確認後整理歸檔。⚠️ 使用前請閱讀 SECURITY.md。" agent_created: true --- # Web Search Rules Skill > **⚠️ 安全提醒**：本技能支援多平台整合，某些功能需要檔案系統存取和瀏覽器自動化權限。在使用前，請先閱讀 [`SECURITY.md`](./SECURITY.md) 了解安全注意事項。 搜尋網頁時的規則管理技能，實現智能的網址過濾和內容管理流程。支援多種知識庫平台，讓用戶自由選擇。 ## 核心功能 1. **多平台支持**：支持 IMA 知識庫、騰訊文檔、或其他知識庫平台 2. **網址庫管理**：維護「搜尋網址庫」，記錄白名單、黑名單和未分類網址 3. **內容暫存**：使用「未整理搜尋內容」暫存搜尋結果 4. **智能過濾**：根據白名單/黑名單自動過濾搜尋結果 5. **用戶確認**：對新網址諮詢用戶意見後再決定分類 6. **內容歸檔**：將確認的內容整理並保存到目標知識庫 ## 知識庫平台選擇 ### 支持的平台 1. **IMA 知識庫** (`ima`) - 使用 `ima-skill` 進行操作 - 適合：需要 AI 搜索、知識圖譜的場景 - 功能：筆記管理、知識庫操作、文件上傳 2. **騰訊文檔** (`tencent-docs`) - 使用 `tencent-docs` skill 進行操作 - 適合：需要協作編輯、在線預覽的場景 - 功能：在線文檔、智能表格、思維導圖 3. **Obsidian** (`obsidian`) - 使用文件系統直接操作（推薦）或 Obsidian Local REST API 插件 - 適合：本地化知識管理、Markdown 原生支持、雙向鏈接 - 功能：Markdown 編輯、雙向鏈接、標籤系統、本地存儲 - 操作方式： - **方案 A**：直接操作 Vault 文件夾（更簡單、無依賴） - **方案 B**：通過 Obsidian Local REST API 插件（需要安裝插件） 4. **NotebookLM** (`notebooklm`) - 使用瀏覽器自動化（`playwright-cli` 或 `agent-browser`）進行操作 - 適合：需要 AI 輔助分析的場景、Google 生態系統用戶 - 功能：AI 摘要、自動問答、來源管理、Google Drive 集成 - 操作方式： - **方案 A**：瀏覽器自動化（推薦，使用 `playwright-cli` 或 `agent-browser`） - **方案 B**：通過 Google Drive API 間接集成（NotebookLM 可以導入 Drive 文件） 5. **其他平台** (`custom`) - 用戶自定義平台 - 需要提供 API 或操作方式 ### 平台選擇流程 在用戶首次使用時，詢問並記錄用戶的知識庫平台偏好： ``` 詢問用戶： 「請問您想要使用哪個平台來管理搜尋規則和內容？」 選項： 1. IMA 知識庫（推薦）- 支持 AI 搜索和知識圖譜 2. 騰訊文檔 - 支持協作編輯和在線預覽 3. Obsidian - 本地化 Markdown 知識管理，支持雙向鏈接 4. NotebookLM - Google AI 輔助研究工具 5. 其他平台 - 請指定平台名稱和操作方式 用戶選擇後，將選擇記錄到配置文件： `~/.workbuddy/skills/web-search-rules/config.json` ``` ## 前置準備 ### 檢查並創建必要知識庫 根據用戶選擇的平台，檢查並創建兩個知識庫： 1. **搜尋網址庫** (`search-url-library`) - 用途：記錄搜尋規則、網址的暫存名單（未分類白名單還是黑名單）、白名單和黑名單 - 結構： ``` 白名單/ ├── 網址1 ├── 網址2 └── ... 黑名單/ ├── 網址1 ├── 網址2 └── ... 未分類/ ├── 網址1 ├── 網址2 └── ... ``` 2. **未整理搜尋內容** (`unorganized-search-content`) - 用途：暫存搜尋後的網頁內容 - 結構：按搜尋日期組織 ``` 2026-05-05/ ├── 網頁標題1.md ├── 網頁標題2.md └── ... ``` **平台特定操作**： - **IMA 知識庫**：使用 `ima-skill` 檢查並創建 - **騰訊文檔**：使用 `tencent-docs` skill 檢查並創建 - **Obsidian**： - **方案 A（推薦）**：直接在 Vault 文件夾中創建文件夾和文件 - 檢查 Vault 路徑（從配置文件或環境變量讀取） - 創建 `search-url-library/` 和 `unorganized-search-content/` 文件夾 - 使用 Markdown 格式存儲數據 - **方案 B**：通過 Obsidian Local REST API 插件操作 - 需要先安裝並啟用 Obsidian Local REST API 插件 - 使用 HTTP API 創建、讀取、更新筆記 - **NotebookLM**： - **方案 A（推薦）**：使用瀏覽器自動化（`playwright-cli` 或 `agent-browser`） - 自動登錄 Google 帳號 - 上傳文件或添加網頁鏈接 - 等待 AI 處理完成 - **方案 B**：通過 Google Drive API 間接集成 - 將文件上傳到 Google Drive - 在 NotebookLM 中導入 Drive 文件 - **其他平台**：根據用戶提供的操作方式進行 ## 搜尋工作流程 ### 步驟 1：解析搜尋請求 從用戶請求中提取： - 搜尋關鍵詞 - 目標知識庫（內容最終要保存到的知識庫） - 知識庫平台（從配置文件讀取或用戶指定） - 其他搜尋參數（時間範圍、來源等） ### 步驟 2：載入網址庫 根據用戶選擇的平台，從「搜尋網址庫」中讀取： - 白名單列表 - 黑名單列表 - 未分類列表 如果無法讀取或文件不存在，提示用戶並協助創建。 ### 步驟 3：執行搜尋 使用適當的搜尋工具（如 `wechat-article-search`、`web_search`、`web_fetch` 等）執行搜尋。 ### 步驟 4：過濾搜尋結果 對每個搜尋結果進行分類： ``` 對於每個搜尋結果： 1. 提取網址 2. 如果網址在白名單中： → 標記為「自動通過」 3. 如果網址在黑名單中： → 標記為「自動過濾」，跳過 4. 如果網址在未分類中或不在任何列表中： → 標記為「待確認」 ``` ### 步驟 5：暫存待確認內容 將所有「待確認」和「自動通過」的網頁內容暫存到「未整理搜尋內容」： **平台特定操作**： - **IMA 知識庫**：使用 `ima-skill` 上傳文件 - **騰訊文檔**：使用 `tencent-docs` skill 創建文檔 - **Obsidian**： - **方案 A（推薦）**：直接在 Vault 中創建 Markdown 文件 - 文件路徑：`{vault_path}/unorganized-search-content/{date}/{title}.md` - 使用 Markdown 格式編寫內容 - **方案 B**：通過 Obsidian Local REST API 創建筆記 - **NotebookLM**： - **方案 A（推薦）**：使用瀏覽器自動化上傳 - 使用 `playwright-cli` 或 `agent-browser` 打開 NotebookLM - 上傳文件或添加網頁鏈接 - 等待 AI 處理完成 - **方案 B**：上傳到 Google Drive，然後在 NotebookLM 中導入 - **其他平台**：根據用戶提供的操作方式進行 ``` 文件格式： # 網頁標題 - 網址：<url> - 發布時間：<date> - 來源：<source> - 狀態：待確認 / 自動通過 - 搜尋關鍵詞：<keywords> ## 內容摘要 <content_summary> ## 完整內容 <full_content> ``` ### 步驟 6：諮詢用戶 列出所有「待確認」的網頁，向用戶展示： ``` 找到 <N> 個新網址需要確認： 1. [網頁標題1](網址1) - 來源：<source> - 摘要：<brief_summary> 2. [網頁標題2](網址2) - 來源：<source> - 摘要：<brief_summary> ... 請問： - 哪些網址應該加入白名單？（可以直接保存內容） - 哪些網址應該加入黑名單？（以後搜尋時自動過濾） - 哪些網址的內容需要保存？（保存到目標知識庫） ``` ### 步驟 7：更新網址庫 根據用戶的反饋，更新「搜尋網址庫」： - 將用戶確認的白名單網址添加到白名單文件 - 將用戶確認的黑名單網址添加到黑名單文件 - 將用戶未決定的網址添加到未分類文件 **平台特定操作**： - **IMA 知識庫**：使用 `ima-skill` 更新文件 - **騰訊文檔**：使用 `tencent-docs` skill 更新文檔 - **Obsidian**： - **方案 A（推薦）**：直接操作 Vault 中的 Markdown 文件 - 文件路徑：`{vault_path}/search-url-library/{category}/{url}.md` - 使用 Markdown 格式記錄網址信息 - **方案 B**：通過 Obsidian Local REST API 更新筆記 - **NotebookLM**： - **方案 A（推薦）**：使用瀏覽器自動化更新 - 使用 `playwright-cli` 或 `agent-browser` 打開 NotebookLM - 更新來源列表 - **方案 B**：通過 Google Drive API 更新文件 - **其他平台**：根據用戶提供的操作方式進行 格式： ``` # 白名單 ## 添加時間 | 網址 | 添加原因 2026-05-05 19:30 | https://example.com/article1 | 用戶確認，內容優質 ``` ### 步驟 8：整理並歸檔內容 ⚠️ **安全提醒**： 1. **刪除前需要用戶顯式確認** 2. **建議啟用備份/版本歷史** 3. **避免批量清理，除非用戶明確批准** 將用戶確認需要保存的網頁內容： 1. 從「未整理搜尋內容」中讀取 2. 根據目標知識庫的格式要求整理內容 3. 保存到目標知識庫 4. **⚠️ 刪除前需要用戶確認**：從「未整理搜尋內容」中刪除已處理的內容 **平台特定操作**： - **IMA 知識庫**：使用 `ima-skill` 操作 - **騰訊文檔**：使用 `tencent-docs` skill 操作 - **Obsidian**： - **方案 A（推薦）**：直接操作 Vault 中的 Markdown 文件 - 從 `unorganized-search-content/` 讀取 Markdown 文件 - 處理後移動到目標知識庫文件夾 - 使用 Markdown 格式，支持雙向鏈接 - **方案 B**：通過 Obsidian Local REST API 操作 - **NotebookLM**： - **方案 A（推薦）**：使用瀏覽器自動化上傳 - 使用 `playwright-cli` 或 `agent-browser` 打開 NotebookLM - 上傳文件或添加網頁鏈接 - AI 自動處理並生成摘要 - **方案 B**：上傳到 Google Drive，然後在 NotebookLM 中導入 - **其他平台**：根據用戶提供的操作方式進行 ### 步驟 9：生成搜尋報告 向用戶提供搜尋結果摘要： ``` 搜尋完成報告 ==================== 搜尋關鍵詞：<keywords> 搜尋時間：<timestamp> 使用平台：<platform> 結果統計： - 總共找到：<total> 個結果 - 白名單自動通過：<whitelist_count> 個 - 黑名單自動過濾：<blacklist_count> 個 - 用戶確認保存：<saved_count> 個 - 用戶放棄：<discarded_count> 個 網址庫更新： - 新增白名單：<new_whitelist_count> 個 - 新增黑名單：<new_blacklist_count> 個 已保存內容位置： - 知識庫平台：<platform> - 知識庫：<target_knowledge_base> - 文件數量：<folder_path> ``` ## 配置文件 ### config.json 在用戶首次選擇平台後，創建配置文件以記錄用戶偏好： ```json { "platform": "ima", "search_url_library": "搜尋網址庫", "unorganized_content": "未整理搜尋內容", "auto_create": true, "last_used": "2026-05-05 22:30:00" } ``` **字段說明**： - `platform`：知識庫平台（ima / tencent-docs / custom） - `search_url_library`：搜尋網址庫的名稱或 ID - `unorganized_content`：未整理搜尋內容的名稱或 ID - `auto_create`：是否自動創建必要的知識庫 - `last_used`：最後使用時間 ## 例外處理 ### 知識庫不存在 1. 提示用戶「搜尋網址庫」不存在 2. 詢問是否要創建 3. 如果用戶同意，根據平台選擇使用相應的 skill 創建知識庫並初始化結構 ### 搜尋工具失敗 1. 嘗試使用備用搜尋工具 2. 如果所有工具都失敗，提示用戶並建議替代方案 ### 用戶長時間未回應 1. 將所有「待確認」的網頁保留在「未整理搜尋內容」中 2. 記錄搜尋狀態 3. 提示用戶可以稍後繼續 ### 平台操作失敗 1. 根據錯誤消息判斷失敗原因 2. 提示用戶並建議解決方案 3. 如果平台不支持某些功能，建議用戶切換到其他平台 ## 進階功能 ### 規則建議 根據用戶的歷史決策，自動建議規則： ``` 根據您的歷史決策，系統建議以下規則： 1. 網域規則：所有來自 <domain> 的網頁都應該加入白名單 2. 關鍵詞規則：標題包含 <keyword> 的網頁通常是有價值的 3. 作者規則：<author> 發布的文章質量較高 是否要應用這些規則？ ``` ### 批量操作 支持批量確認和批量操作： ``` 找到 10 個來自同一網域的網頁，是否要： 1. 全部加入白名單 2. 全部加入黑名單 3. 逐個確認 ``` ### 平台切換 如果用戶想要切換知識庫平台： ``` 詢問用戶： 「請問您想要切換到哪個知識庫平台？」 選項： 1. IMA 知識庫 2. 騰訊文檔 3. Obsidian 4. NotebookLM 5. 其他平台 切換後，需要： 1. 重新配置知識庫 2. 遷移現有的網址庫和暫存內容（可選） 3. 更新配置文件 ``` ## 注意事項 1. **隱私保護**：暫存的網頁內容可能包含敏感信息，確保「未整理搜尋內容」的訪問權限設置正確 2. **定期清理**：建議定期清理「未整理搜尋內容」中的過期內容 3. **網址庫維護**：定期檢查網址庫，移除失效的網址 4. **用戶確認**：始終在用戶確認後再更新網址庫和保存內容 5. **平台兼容性**：不同平台的功能可能有所差異，需要根據實際情況調整操作流程 6. **Obsidian 特定**： - 確保 Vault 路徑正確配置 - 如果使用 Obsidian Local REST API，需要預先安裝並啟用插件 - 建議使用方案 A（直接操作文件）以避免插件依賴 7. **NotebookLM 特定**： - 瀏覽器自動化需要穩定的網路連接 - 需要預先登錄 Google 帳號 - 考慮使用 Google Drive API 作為備用方案 ## 參考資料 - IMA skill 使用說明 - 騰訊文檔 skill 使用說明 - Obsidian 使用說明（文件系統操作 / Local REST API） - NotebookLM 使用說明（瀏覽器自動化 / Google Drive API） - 網頁搜尋工具文檔 - 知識庫管理最佳實踐 ## 附加參考文件 本 skill 包含以下參考文件，根據需要載入： - `references/ima-operations.md` - IMA 知識庫操作詳解，包含文件結構、格式規範和操作示例 - `references/tencent-docs-operations.md` - 騰訊文檔操作詳解，包含文檔創建、編輯和管理的操作方法 - `references/obsidian-operations.md` - Obsidian 操作詳解，包含 Vault 文件系統操作和 Local REST API 操作方法 - `references/notebooklm-operations.md` - NotebookLM 操作詳解，包含瀏覽器自動化和 Google Drive API 集成方法 - `references/examples.md` - 完整的使用場景示例，包含基本搜尋、規則建議、批量操作和定期維護等情境 - `references/platform-comparison.md` - 各平台功能對比表，幫助用戶選擇適合的平台 當遇到複雜的平台操作時，請先讀取相應的參考文件以獲取詳細的操作指導。當需要向用戶說明工作流程時，可以參考 `references/examples.md` 中的示例。

path: SECURITY.md
content: # Web Search Rules Skill - Security Guide

## ⚠️ 安全声明

本 skill 支持多平台知识库集成，**某些功能需要文件系统访问和浏览器自动化权限**。在使用前，请仔细阅读本安全指南。

---

## 🔒 权限需求说明

### 必需的权限
1. **配置文件读写** (`~/.skill-config/web-search-rules/config.json`)
   - 用途：存储用户平台选择偏好
   - 风险：低
   - 保护：仅存储非敏感配置信息

2. **搜索结果暂存** (`~/.skill-config/web-search-rules/temp/`)
   - 用途：临时存储搜索结果
   - 风险：中（可能包含敏感信息）
   - 保护：定期清理，不上传到云端

### 可选权限（按平台）
1. **Obsidian 支持**
   - 权限：读写 Obsidian Vault 目录
   - 风险：中高（可以访问所有 Vault 文件）
   - 保护：**限制操作仅在用户指定的 Vault 目录内**

2. **NotebookLM 支持**
   - 权限：浏览器自动化（Playwright），Google Account 访问
   - 风险：高（需要 Google Account 认证）
   - 保护：**不存储 Google Account 凭证**，每次手动登录

3. **网络搜索**
   - 权限：访问外部搜索 API
   - 风险：低
   - 保护：仅搜索用户指定的关键词

---

## 🛡️ 安全措施

### 1. 路径验证
所有文件路径操作都经过验证，**不允许任意路径写入**：

```python
import os
import re

# 允许的路径白名单
ALLOWED_PATHS = [
    os.path.expanduser("~/.skill-config/web-search-rules/"),
    os.path.expanduser("~/Documents/ObsidianVault/"),  # 需要用户确认
]

def validate_path(path):
    """验证路径是否在白名单内"""
    abs_path = os.path.abspath(path)
    for allowed in ALLOWED_PATHS:
        if abs_path.startswith(os.path.abspath(allowed)):
            return True
    raise SecurityError(f"Path {path} is not allowed!")

# 使用前验证
validate_path(user_specified_path)
```

### 2. 用户确认
所有敏感操作（文件写入、浏览器自动化、API 调用）都需要**用户显式确认**：

```python
# 在执行前询问用户
if not user_confirmed:
    ask_user("是否要将此内容保存到 Obsidian Vault？")
    if not user_response:
        abort_operation()
```

### 3. 凭证管理
- **不存储** Google Account 凭证
- **不存储** Obsidian Local REST API Key 到磁盘
- **仅存储**非敏感配置（平台选择、Vault 路径等）
- 敏感凭证存储在用户环境变量或密钥管理器中

### 4. 数据清理
- 临时文件在任务完成后**自动删除**
- 搜索结果暂存目录定期清理（默认 7 天）
- 不将敏感数据上传到云端

---

## 🚨 潜在风险

### 1. Prompt 注入
**风险**：恶意网页内容可能包含特殊指令，影响 AI 决策  
**缓解措施**：
- 对网页内容进行清理，移除特殊标记
- 不执行网页中的代码
- 所有决策需要用户确认

### 2. 路径遍历攻击
**风险**：恶意路径可能导致任意文件读写  
**缓解措施**：
- 严格验证所有文件路径
- 使用路径白名单
- 不允许用户指定任意路径

### 3. 凭证泄露
**风险**：Google Account 凭证可能被泄露  
**缓解措施**：
- 不存储凭证到磁盘
- 使用 OAuth 2.0 认证流程
- 定期提醒用户检查已授权的应用

### 4. 数据隐私
**风险**：搜索结果可能包含敏感信息  
**缓解措施**：
- 临时文件本地存储，不上传云端
- 定期清理临时文件
- 提醒用户注意敏感信息

---

## 📋 安全检查清单

在使用本 skill 前，请确认：

- [ ] 我已阅读并理解本安全指南
- [ ] 我确认 Obsidian Vault 路径设置正确
- [ ] 我了解 NotebookLM 需要 Google Account 认证
- [ ] 我确认不处理敏感或机密信息
- [ ] 我同意临时文件存储在本地磁盘
- [ ] 我了解如何报告和应对安全问题

---

## 📞 安全报告

如果你发现任何安全漏洞或潜在风险，请：

1. **不要**在公开场合披露漏洞详情
2. 通过安全渠道联系开发者
3. 提供详细的复现步骤
4. 等待官方修复后再公开披露

---

## 🔄 更新历史

- **v2.0.1** (2026-05-06): 添加安全指南，降低权限请求
- **v2.0.0** (2026-05-05): 初始版本，支持 Obsidian 和 NotebookLM

---

## 📚 参考资料

- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [Prompt Injection Attacks](https://genai.owasp.org/llm-top-10-overview/)
- [Google API Security Best Practices](https://developers.google.com/drive/api/v3/about/auth)
- [Obsidian Security Guide](https://help.obsidian.md/)

---

**最后更新**: 2026-05-06  
**版本**: v2.0.1


path: references/examples.md
content: # Web Search Rules Skill 使用示例

## 示例 1：基本搜尋流程

### 用戶請求
```
請幫我搜尋關於「AI 代理」的微信公眾號文章，並保存到「科技」知識庫
```

### 執行流程

1. **檢查知識庫**
   - 檢查「搜索網址庫」是否存在 → 不存在，提示用戶創建
   - 檢查「未整理搜尋內容」是否存在 → 不存在，提示用戶創建

2. **用戶確認創建知識庫後**
   - 創建「搜索網址庫」知識庫，初始化白名單.md、黑名單.md、未分類.md
   - 創建「未整理搜尋內容」知識庫

3. **載入網址庫**
   - 讀取白名單.md → 獲得 5 個網址
   - 讀取黑名單.md → 獲得 3 個網址
   - 讀取未分類.md → 獲得 2 個網址

4. **執行搜尋**
   - 使用 `wechat-article-search` skill 搜尋「AI 代理」
   - 找到 10 篇文章

5. **過濾搜尋結果**
   - 文章 1：網址在白名單中 → 標記「自動通過」
   - 文章 2：網址在黑名單中 → 標記「自動過濾」，跳過
   - 文章 3-10：不在任何列表 → 標記「待確認」

6. **暫存內容**
   - 將文章 1、3-10 的內容保存到「未整理搜尋內容/2026-05-05/」

7. **諮詢用戶**
   ```
   找到 8 個新網址需要確認：
   
   1. [文章標題3](網址3)
      - 來源：微信公眾號 A
      - 摘要：介紹 AI 代理的基本概念...
   
   2. [文章標題4](網址4)
      - 來源：微信公眾號 B
      - 摘要：探討 AI 代理的應用場景...
   
   ...
   
   請問：
   - 哪些網址應該加入白名單？
   - 哪些網址應該加入黑名單？
   - 哪些文章的內容需要保存到「科技」知識庫？
   ```

8. **用戶回應**
   ```
   - 網址3、4、5 加入白名單
   - 網址6 加入黑名單
   - 網址3、4、5、7、8 的內容保存到「科技」知識庫
   ```

9. **更新網址庫**
   - 更新「搜索網址庫/白名單.md」，添加網址3、4、5
   - 更新「搜索網址庫/黑名單.md」，添加網址6

10. **整理並歸檔內容**
    - 從「未整理搜尋內容」讀取網址3、4、5、7、8 的內容
    - 整理格式，添加標籤
    - 保存到「科技」知識庫
    - 從「未整理搜尋內容」刪除這些文件

11. **生成報告**
    ```
    搜尋完成報告
    ====================
    
    搜尋關鍵詞：AI 代理
    搜尋時間：2026-05-05 20:15
    
    結果統計：
    - 總共找到：10 個結果
    - 白名單自動通過：1 個
    - 黑名單自動過濾：1 個
    - 用戶確認保存：5 個
    - 用戶放棄：3 個
    
    網址庫更新：
    - 新增白名單：3 個
    - 新增黑名單：1 個
    
    已保存內容位置：
    - 知識庫：科技
    - 文件數量：5 個
    ```

## 示例 2：規則建議

### 用戶請求
```
搜尋「區塊鏈技術」相關文章
```

### 執行流程

1. 完成搜尋和過濾
2. 暫存內容
3. 諮詢用戶

### 用戶確認模式

在用戶多次確認後，系統學習到規則：

```
根據您的歷史決策，系統建議以下規則：

1. 網域規則：所有來自 `区块链前沿` 公眾號的文章都應該加入白名單
2. 關鍵詞規則：標題包含「技術原理」的文章通常是有價值的
3. 來源規則：`科技日報` 發布的文章質量較高

是否要應用這些規則？
- 是：應用規則並自動分類類似內容
- 否：繼續手動確認
- 自定義：修改規則後應用
```

## 示例 3：批量操作

### 用戶請求
```
搜尋「投資理財」相關內容
```

### 執行結果

```
找到 20 個結果，其中：
- 15 個來自同一網域 (investment-news.com)
- 5 個來自其他來源

是否要：
1. 將所有來自 investment-news.com 的網頁加入白名單
2. 將所有來自 investment-news.com 的網頁加入黑名單
3. 逐個確認每個網頁
```

## 示例 4：定期維護

### 用戶請求
```
清理「未整理搜尋內容」中上個月的內容
```

### 執行流程

1. 列出「未整理搜尋內容」中上個月（2026-04）的文件夾
2. 顯示文件統計（數量、大小）
3. 詢問用戶是否要：
   - 刪除所有上個月的内容
   - 只刪除已處理的內容
   - 保留某些特定內容
   - 取消操作

## 注意事項

1. **首次使用**：確保在用戶首次使用時引導創建必要的知識庫
2. **用戶確認**：始終在用戶確認後再執行關鍵操作（更新網址庫、保存內容）
3. **錯誤處理**：如果 IMA 操作失敗，提供清晰的錯誤消息和建議解決方案
4. **性能考慮**：如果搜尋結果很多（>20），考慮分批處理或提供批量操作選項

## 示例 5：使用騰訊文檔作爲知識庫平台

### 用戶請求
```
請使用騰訊文檔作爲知識庫平台，幫我搜尋關於「機器學習」的微信公眾號文章，
並保存到「學術」知識庫
```

### 執行流程

1. **選擇平台**
   ```
   詢問用戶：「請問您想要使用哪個平台來管理搜尋規則和內容？」
   
   用戶選擇：「騰訊文檔」
   
   創建配置文件 `~/.workbuddy/skills/web-search-rules/config.json`：
   ```json
   {
     "platform": "tencent-docs",
     "search-url-library": "搜索網址庫",
     "unorganized-content": "未整理搜尋內容",
     "auto_create": true,
     "last_used": "2026-05-05 22:30:00"
   }
   ```
   
2. **檢查知識庫**
   - 使用 `tencent-docs` skill 檢查「搜索網址庫」是否存在 → 不存在，提示用戶創建
   - 使用 `tencent-docs` skill 檢查「未整理搜尋內容」是否存在 → 不存在，提示用戶創建
   
3. **用戶確認創建知識庫後**
   - 使用 `tencent-docs` skill 創建「搜索網址庫」知識庫
     - 創建文件「白名單.md」、「黑名單.md」、「未分類.md」
   - 使用 `tencent-docs` skill 創建「未整理搜尋內容」知識庫
   
4. **載入網址庫**
   - 使用 `tencent-docs` skill 讀取「白名單.md」→ 獲得 3 個網址
   - 使用 `tencent-docs` skill 讀取「黑名單.md」→ 獲得 2 個網址
   - 使用 `tencent-docs` skill 讀取「未分類.md」→ 獲得 1 個網址
   
5. **執行搜尋**
   - 使用 `wechat-article-search` skill 搜尋「機器學習」
   - 找到 8 篇文章
   
6. **過濾搜尋結果**
   - 文章 1：網址在白名單中 → 標記「自動通過」
   - 文章 2：網址在黑名單中 → 標記「自動過濾」，跳過
   - 文章 3-8：不在任何列表 → 標記「待確認」
   
7. **暫存內容**
   - 使用 `tencent-docs` skill 創建文件到「未整理搜尋內容/2026-05-05/」
   - 將文章 1、3-8 的內容保存為 Markdown 文件
   
8. **諮詢用戶**
   ```
   找到 6 個新網址需要確認：
   
   1. [文章標題3](網址3)
      - 來源：微信公眾號 C
      - 摘要：介紹機器學習的基本概念...
   
   2. [文章標題4](網址4)
      - 來源：微信公眾號 D
      - 摘要：探討機器學習的應用場景...
   
   ...
   
   請問：
   - 哪些網址應該加入白名單？
   - 哪些網址應該加入黑名單？
   - 哪些文章的內容需要保存到「學術」知識庫？
   ```
   
9. **用戶回應**
   ```
   - 網址3、4、5 加入白名單
   - 網址6 加入黑名單
   - 網址3、4、5、7 的內容保存到「學術」知識庫
   ```
   
10. **更新網址庫**
    - 使用 `tencent-docs` skill 更新「搜索網址庫/白名單.md」，添加網址3、4、5
    - 使用 `tencent-docs` skill 更新「搜索網址庫/黑名單.md」，添加網址6
    
11. **整理並歸檔內容**
    - 使用 `tencent-docs` skill 讀取「未整理搜尋內容/2026-05-05/」中的文件
    - 整理格式，添加標籤
    - 使用 `tencent-docs` skill 保存到「學術」知識庫
    - 使用 `tencent-docs` skill 從「未整理搜尋內容」刪除這些文件
    
12. **生成報告**
    ```
    搜尋完成報告
    ====================
    
    搜尋關鍵詞：機器學習
    搜尋時間：2026-05-05 23:00
    使用平台：騰訊文檔
    
    結果統計：
    - 總共找到：8 個結果
    - 白名單自動通過：1 個
    - 黑名單自動過濾：1 個
    - 用戶確認保存：4 個
    - 用戶放棄：2 個
    
    網址庫更新：
    - 新增白名單：3 個
    - 新增黑名單：1 個
    
    已保存內容位置：
    - 知識庫平台：騰訊文檔
    - 知識庫：學術
    - 文件數量：4 個
    ```

## 示例 6：平台切換

### 用戶請求
```
我想要從 IMA 知識庫切換到騰訊文檔
```

### 執行流程

1. **確認切換**
   ```
   詢問用戶：「您確定要從 IMA 知識庫切換到騰訊文檔嗎？」
   
   注意：切換平台可能需要手動遷移數據。
   ```
   
2. **用戶確認後**
   ```
   提供選項：
   1. 遷移現有的網址庫和暫存內容
   2. 不遷移數據，重新開始
   
   用戶選擇：「遷移現有的網址庫和暫存內容」
   ```
   
3. **導出 IMA 數據**
   - 使用 IMA skill 導出「搜索網址庫」中的白名單、黑名單、未分類數據
   - 使用 IMA skill 導出「未整理搜尋內容」中的網頁內容
   
4. **導入騰訊文檔**
   - 使用 `tencent-docs` skill 創建「搜索網址庫」知識庫
   - 使用 `tencent-docs` skill 創建「白名單.md」、「黑名單.md」、「未分類.md」
   - 將導出的數據導入到這些文件
   - 使用 `tencent-docs` skill 創建「未整理搜尋內容」知識庫
   - 將導出的網頁內容導入
   
5. **更新配置**
   - 更新 `config.json` 中的 `platform` 字段為 `tencent-docs`
   - 更新 `search-url-library` 和 `unorganized-content` 字段
   
6. **完成切換**
   ```
   平台切換完成！
   
   原平台：IMA 知識庫
   新平台：騰訊文檔
   
   遷移的數據：
   - 白名單：5 個網址
   - 黑名單：3 個網址
   - 未分類：2 個網址
   - 暫存內容：8 個網頁
   
   後續的搜尋操作將使用騰訊文檔作爲知識庫平台。
   ```

## 平台功能對比參考

在幫助用戶選擇平台時，可以參考 `references/platform-comparison.md` 中的詳細對比表。

**快速建議**：

- 選擇 **IMA 知識庫**，如果：
  - 需要 AI 搜索和智能推薦
  - 主要存儲文本內容
  - 個人使用

- 選擇 **騰訊文檔**，如果：
  - 需要多人協作編輯
  - 需要豐富的格式支持
  - 需要強權限管理


path: references/ima-operations.md
content: # IMA 知識庫操作參考

## 知識庫管理

### 檢查知識庫是否存在

使用 IMA skill 列出所有知識庫，檢查目標知識庫是否存在。

### 創建知識庫

如果知識庫不存在，使用 IMA skill 創建：

```
知識庫名稱：搜索網址庫
描述：記錄搜尋規則、網址的暫存名單（未分類白名單還是黑名單）、白名單和黑名單

知識庫名稱：未整理搜尋內容
描述：暫存搜尋後的網頁內容，按搜尋日期組織
```

## 文件操作

### 搜索網址庫結構

```
搜索網址庫/
├── 白名單.md
├── 黑名單.md
└── 未分類.md
```

#### 白名單.md 格式

```markdown
# 白名單

## 添加時間 | 網址 | 添加原因 | 分類標籤

2026-05-05 19:30 | https://example.com/article1 | 用戶確認，內容優質 | 科技, AI
2026-05-05 19:35 | https://blog.example.org/post1 | 權威來源 | 學術
```

#### 黑名單.md 格式

```markdown
# 黑名單

## 添加時間 | 網址 | 屏蔽原因

2026-05-05 19:40 | https://spam.example.com | 內容質量低
2026-05-05 19:45 | https://ads.example.org | 廣告內容
```

#### 未分類.md 格式

```markdown
# 未分類

## 發現時間 | 網址 | 備註

2026-05-05 19:50 | https://new.example.com/article | 待用戶確認
```

### 未整理搜尋內容結構

```
未整理搜尋內容/
└── 2026-05-05/
    ├── 網頁標題1.md
    ├── 網頁標題2.md
    └── ...
```

#### 網頁內容文件格式

```markdown
# 網頁標題

- 網址：https://example.com/article
- 發布時間：2026-05-05
- 來源：來源網站名稱
- 狀態：待確認 / 自動通過
- 搜尋關鍵詞：AI, 機器學習
- 暫存時間：2026-05-05 19:30

## 內容摘要

這是一篇關於...的文章

## 完整內容

<article_content>
```

## IMA Skill 調用示例

### 搜索知識庫

```
使用 IMA skill 搜索「搜索網址庫」，查詢網址是否存在
```

### 上傳文件到知識庫

```
使用 IMA skill 上傳文件到「未整理搜尋內容」知識庫
文件路徑：/tmp/search_result_1.md
目標文件夾：2026-05-05
```

### 從知識庫刪除文件

```
使用 IMA skill 從「未整理搜尋內容」刪除已處理的文件
文件ID：xxx
```

## 注意事項

1. **文件夾結構**：確保按日期組織文件，便於管理和清理
2. **網址去重**：在添加前檢查網址是否已存在於白名單或黑名單
3. **定期維護**：建議每月清理一次「未整理搜尋內容」中的過期內容
4. **權限管理**：確保知識庫的訪問權限設置正確，避免敏感信息泄露


path: references/notebooklm-operations.md
content: # NotebookLM 操作详解

本文档详细说明如何使用 NotebookLM 作为知识库平台。

## 概述

NotebookLM 是 Google 推出的 AI 辅助研究工具，可以自动摘要、问答、分析上传的内容。本 skill 支持两种操作方式：

1. **方案 A（推荐）**：使用浏览器自动化（`playwright-cli` 或 `agent-browser`）
2. **方案 B**：通过 Google Drive API 间接集成

---

## 方案 A：浏览器自动化（推荐）

### 优点
- ✅ 直接操作 NotebookLM Web 界面
- ✅ 支持所有 NotebookLM 功能
- ✅ 不需要 Google Drive API 配置
- ✅ 可以处理任意格式的文件

### 缺点
- ❌ 需要稳定的网络连接
- ❌ **需要手动登录 Google 账号（不要存储凭证！）**
- ❌ 浏览器自动化可能较慢

### 前置准备

⚠️ **安全提醒**：
1. **不要存储 Google 账号凭证**！每次手动登录。
2. **使用单独的浏览器 profile**，避免与主浏览器混淆。
3. **限制 OAuth scopes**，只授权必要的权限。

#### 1. 安装浏览器自动化工具：

**选项 1**：`playwright-cli`（推荐）

```bash
# ⚠️ 推荐使用虚拟环境
python -m venv venv
source venv/bin/activate  # Linux/Mac
# 或 venv\Scripts\activate  (Windows)

# 安装固定版本（避免供应链攻击）
pip install playwright==1.44.0
playwright install chromium
```

**选项 2**：`agent-browser` skill
- 确保 `agent-browser` skill 已安装
- 使用独立的环境运行

#### 2. 手动登录 Google 账号：

⚠️ **重要**：**不要**在代码中硬编码凭证！

```bash
# 手动打开 NotebookLM
# 1. 打开浏览器
# 2. 访问 https://notebooklm.google.com/
# 3. 手动登录 Google 账号
# 4. 确保可以正常上传文件
```

#### 3. 配置（不包含凭证！）：

在 `config.json` 中设置：

```json
{
  "platform": "notebooklm",
  "method": "browser-automation",
  "notebook_name": "Search Results",
  "google_account": "[REDACTED_SECRET]",  # 仅用于标识，不用于登录
  "browser_profile": "separate-profile"  # 使用单独的浏览器 profile
}
```

### 操作示例

#### 1. 创建新知识库（Notebook）

使用 `playwright-cli`：

```bash
# 启动浏览器并打开 NotebookLM
playwright-cli open "https://notebooklm.google.com/"

# ⚠️ 手动登录（不要自动化登录过程！）

# 点击「新建」按钮
playwright-cli click "text=新建"

# 输入知识库名称
playwright-cli type "input[placeholder='输入名称']" "Search Results"

# 点击「创建」按钮
playwright-cli click "text=创建"
```

#### 2. 上传文件

```bash
# ⚠️ 上传前需要用户确认
if user_confirmed("确认要上传这个文件到 NotebookLM 吗？"):
    # 上传文件
    playwright-cli upload "input[type='file']" "path/to/webpage-content.md"
    
    # 等待 AI 处理完成
    playwright-cli wait "text=处理完成" --timeout 60000
```

#### 3. 添加网页链接

```bash
# 点击「添加来源」按钮
playwright-cli click "text=添加来源"

# 选择「网页」选项
playwright-cli click "text=网页"

# 输入网址
playwright-cli type "input[placeholder='输入网址']" "https://example.com/article1"

# 点击「添加」按钮
playwright-cli click "text=添加"

# 等待 AI 处理完成
playwright-cli wait "text=处理完成" --timeout 60000
```

#### 4. 提问（AI 问答）

```bash
# 在提问框中输入问题
playwright-cli type "textarea[placeholder='询问任何问题...']" "这篇文章的主要观点是什么？"

# 点击「发送」按钮
playwright-cli click "button[aria-label='发送']"

# 等待回答生成
playwright-cli wait "text=回答完成" --timeout 30000

# 提取回答内容
answer = playwright-cli extract "div.answer-content"
```

#### 5. 导出摘要

```bash
# 点击「导出」按钮
playwright-cli click "button[aria-label='导出']"

# 选择「导出为 Markdown」
playwright-cli click "text=导出为 Markdown"

# 等待下载完成
playwright-cli wait "text=下载完成" --timeout 30000
```

---

## 方案 B：通过 Google Drive API 间接集成

### 优点
- ✅ 不需要浏览器自动化
- ✅ 更稳定、更快速
- ✅ 可以批量上传文件

### 缺点
- ❌ 需要配置 Google Drive API
- ❌ 需要手动在 NotebookLM 中导入 Drive 文件
- ❌ 不支持实时操作

### 前置准备

⚠️ **安全提醒**：
1. **固定包版本**，避免供应链攻击
2. **使用虚拟环境**，隔离依赖
3. **限制 OAuth scopes**，只申请最小必要权限

#### 1. 启用 Google Drive API：

- 访问 [Google Cloud Console](https://console.cloud.google.com/)
- 创建项目（或选择现有项目）
- 启用 **Google Drive API**
- 创建 OAuth 2.0 凭证（Desktop App）
- 下载 `credentials.json`

#### 2. 安装 Google Client Library（固定版本！）：

```bash
# ⚠️ 推荐使用虚拟环境
python -m venv venv
source venv/bin/activate  # Linux/Mac
# 或 venv\Scripts\activate  (Windows)

# 安装固定版本（避免供应链攻击）
pip install --upgrade google-api-python-client==2.116.0 google-auth-httplib2==0.2.0 google-auth-oauthlib==1.2.0
```

#### 3. 配置（不包含敏感信息！）：

在 `config.json` 中设置：

```json
{
  "platform": "notebooklm",
  "method": "google-drive-api",
  "google_drive_folder_id": "your-folder-id",
  "credentials_file": "path/to/credentials.json",
  "token_file": "path/to/token.json",
  "oauth_scopes": [
    "https://www.googleapis.com/auth/drive.file"  # 最小权限
  ]
}
```

### 操作示例

#### 1. 上传文件到 Google Drive

```python
import os
import google.auth
from google.auth2.credentials import Credentials
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload

# 认证（使用最小 OAuth scope）
creds = Credentials.from_authorized_user_file(
    config["token_file"],
    scopes=config.get("oauth_scopes", ["https://www.googleapis.com/auth/drive.file"])
)

# 构建 Drive API 客户端
service = build("drive", "v3", credentials=creds)

# 上传文件
file_metadata = {
    "name": "webpage-content.md",
    "parents": [config["google_drive_folder_id"]]
}

media = MediaFileUpload(
    "path/to/webpage-content.md",
    mimetype="text/markdown"
)

file = service.files().create(
    body=file_metadata,
    media_body=media,
    fields="id, webViewLink"
).execute()

print(f"文件已上传：{file.get('webViewLink')}")
```

#### 2. 在 NotebookLM 中导入 Drive 文件

**注意**：NotebookLM 目前不支持通过 API 自动导入 Drive 文件，需要手动操作：

1. 打开 [NotebookLM](https://notebooklm.google.com/)
2. 打开目标知识库（Notebook）
3. 点击「添加来源」
4. 选择「Google Drive」
5. 选择上传的文件
6. 点击「导入」

**自动化方案**：可以使用浏览器自动化（方案 A）来自动化这个过程（但需要手动登录）。

---

## 完整工作流程示例

### 场景：搜索网页并保存到 NotebookLM

```python
# ⚠️ 安全提醒：
# 1. 所有上传操作需要用户确认
# 2. 不要上传敏感信息
# 3. 使用单独的浏览器 profile

# 1. 搜索网页
search_results = search_web("AI 机器学习")

# 2. 过滤结果（根据白名单/黑名单）
filtered_results = filter_results(search_results)

# 3. 暂存网页内容
for result in filtered_results:
    # 下载网页内容
    content = download_webpage(result["url"])
    
    # 保存为 Markdown 文件
    filename = f"temp/{result['title']}.md"
    with open(filename, "w", encoding="utf-8") as f:
        f.write(content)
    
    # ⚠️ 上传前需要用户确认
    if user_confirmed(f"确认要上传 {filename} 到 NotebookLM 吗？"):
        # 上传到 NotebookLM（使用浏览器自动化）
        upload_to_notebooklm(filename)
        
        # 等待 AI 处理完成
        wait_for_processing()

# 4. 提取 AI 摘要
summary = ask_notebooklm("请总结所有上传文档的主要观点")

# 5. 保存摘要（需要用户确认）
if user_confirmed("确认要保存这个摘要吗？"):
    save_summary(summary)
```

---

## 注意事项

⚠️ **安全提醒**：
1. **凭证管理**：本 skill **不存储** Google 账号凭证。每次手动登录。
2. **数据隐私**：上传的内容会被发送到 Google 服务器。**请勿上传敏感信息**！
3. **浏览器自动化安全**：如果使用方案 A，请确保 `playwright-cli` 或 `agent-browser` 来自可信源。
4. **API 配额**：注意 Google Drive API 使用配额，避免服务中断。
5. **网络安全**：确保稳定且安全的网络连接，传输数据时使用 HTTPS。
6. **OAuth Scope 限制**：只申请最小必要的 OAuth 权限（如 `drive.file` 而不是 `drive`）。
7. **单独浏览器 Profile**：使用单独的浏览器 profile，避免与主浏览器混淆。
8. **虚拟环境**：使用虚拟环境安装 Python 包，避免污染系统环境。
9. **固定版本**：固定所有依赖包的版本，避免供应链攻击。

## 安全最佳实践

```python
# ✅ 推荐：让用户手动登录，DO NOT 存储凭证
# 错误示例 (DO NOT DO THIS):
config = {
    "google_username": "[REDACTED_SECRET]",
    "google_password": "password123"  # 永远不要存储密码！
}

# 正确示例:
config = {
    "notebook_name": "Search Results",
    "method": "browser-automation"
    # 没有存储凭证
}

# 用户会在浏览器中手动登录
```

```python
# ✅ 推荐：使用最小 OAuth scope
# 错误示例 (DO NOT DO THIS):
scopes = ["https://www.googleapis.com/auth/drive"]  # 权限太大

# 正确示例:
scopes = ["https://www.googleapis.com/auth/drive.file"]  # 最小权限
```

```python
# ✅ 推荐：上传前需要用户确认
filename = "path/to/webpage-content.md"

# 错误示例 (DO NOT DO THIS):
upload_to_notebooklm(filename)  # 没有确认就上传

# 正确示例:
if user_confirmed(f"确认要上传 {filename} 到 NotebookLM 吗？"):
    upload_to_notebooklm(filename)
```

1. **网络连接**：确保稳定的网络连接
2. **Google 账号**：手动登录 Google 账号（不存储凭证）
3. **API 配额**：注意 Google Drive API 使用配额
4. **文件格式**：NotebookLM 支持 PDF、Markdown、纯文本、Google Docs 等格式
5. **隐私保护**：上传的内容会被发送到 Google 服务器，请注意敏感信息
6. **浏览器自动化**：如果使用方案 A，请确保 `playwright-cli` 或 `agent-browser` 已正确安装
7. **等待时间**：AI 处理需要时间，请确保设置足够的等待时间
8. **定期清理**：定期清理临时文件和浏览器缓存
9. **使用本地替代方案**：如果需要处理敏感信息，请使用本地 Obsidian 存储

---

## 参考资源

- [NotebookLM 官方网站](https://notebooklm.google.com/)
- [NotebookLM 帮助中心](https://support.google.com/notebooklm/)
- [Google Drive API 文档](https://developers.google.com/drive/api/v3/about)
- [Playwright CLI 文档](https://playwright.dev/)
- [Agent Browser Skill](https://clawhub.ai/skills/agent-browser)
- [OAuth 2.0 Security Best Practices](https://oauth.net/2/security-considerations/)


path: references/obsidian-operations.md
content: # Obsidian 操作详解

本文档详细说明如何使用 Obsidian 作为知识库平台。

## 概述

Obsidian 是一款基于 Markdown 的知识库工具，支持双向链接、标签系统、插件生态等功能。本 skill 支持两种操作方式：

1. **方案 A（推荐）**：直接操作 Vault 文件系统
2. **方案 B**：通过 Obsidian Local REST API 插件操作

---

## 方案 A：直接操作 Vault 文件系统（推荐）

### 优点
- ✅ 无需额外依赖
- ✅ 简单高效
- ✅ 支持离线操作
- ✅ 完全掌控数据

### 缺点
- ❌ 无法触发 Obsidian 的实时更新（需要手动刷新）
- ❌ 不支持复杂的 Obsidian 特定功能（如双向链接自动创建）

### 配置

在 `config.json` 中设置：

```json
{
  "platform": "obsidian",
  "vault_path": "C:/Users/engla/Documents/ObsidianVault",
  "search_url_library": "search-url-library",
  "unorganized_content": "unorganized-search-content",
  "method": "filesystem"
}
```

### 文件结构

```
{Vault 路径}/
├── search-url-library/
│   ├── whitelist/
│   │   ├── example-com.md
│   │   └── ...
│   ├── blacklist/
│   │   ├── spam-site.md
│   │   └── ...
│   └── uncategorized/
│       ├── new-site-1.md
│       └── ...
└── unorganized-search-content/
    ├── 2026-05-05/
    │   ├── webpage-title-1.md
    │   └── ...
    └── ...
```

### 操作示例

#### 1. 创建/检查知识库

```python
import os

# 读取配置
vault_path = config["vault_path"]
search_url_library = config["search_url_library"]
unorganized_content = config["unorganized_content"]

# 创建目录
os.makedirs(os.path.join(vault_path, search_url_library, "whitelist"), exist_ok=True)
os.makedirs(os.path.join(vault_path, search_url_library, "blacklist"), exist_ok=True)
os.makedirs(os.path.join(vault_path, search_url_library, "uncategorized"), exist_ok=True)
os.makedirs(os.path.join(vault_path, unorganized_content, "2026-05-05"), exist_ok=True)
```

#### 2. 添加网址到白名单

```python
import os
from datetime import datetime

# 生成文件名（使用网址的域名）
url = "https://example.com/article1"
domain = url.split("/")[2].replace(".", "-")
filename = f"{domain}.md"
filepath = os.path.join(vault_path, search_url_library, "whitelist", filename)

# 写入内容
content = f"""---
added: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
category: whitelist
---

# {url}

## 添加信息

- **添加时间**：{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
- **添加原因**：用户确认，内容优质
- **网址**：{url}

## 相关笔记

- [[search-rules]]
"""

with open(filepath, "w", encoding="utf-8") as f:
    f.write(content)
```

#### 3. 暂存搜索内容

```python
import os
from datetime import datetime

# 生成文件名（使用网页标题）
title = "网页标题1"
date = datetime.now().strftime("%Y-%m-%d")
filename = f"{title.replace(' ', '-')}.md"
filepath = os.path.join(vault_path, unorganized_content, date, filename)

# 写入内容
content = f"""---
title: {title}
url: https://example.com/article1
date: {date}
status: pending
keywords: AI, 机器学习
---

# {title}

## 基本信息

- **网址**：https://example.com/article1
- **发布时间**：2026-05-05
- **来源**：Example Source
- **状态**：待确认
- **搜索关键词**：AI, 机器学习

## 内容摘要

这是一篇关于 AI 和机器学习的文章...

## 完整内容

这是文章的完整内容...

## 标签

#AI #机器学习 #待确认
"""

with open(filepath, "w", encoding="utf-8") as f:
    f.write(content)
```

#### 4. 读取网址库

```python
import os

# 读取白名单
whitelist_dir = os.path.join(vault_path, search_url_library, "whitelist")
whitelist_files = os.listdir(whitelist_dir)

whitelist_urls = []
for filename in whitelist_files:
    filepath = os.path.join(whitelist_dir, filename)
    with open(filepath, "r", encoding="utf-8") as f:
        content = f.read()
        # 提取网址
        if "网址**：" in content:
            url = content.split("网址**：")[1].split("\n")[0].strip()
            whitelist_urls.append(url)
```

#### 5. 整理并归档内容

```python
import os
import shutil

# 从「未整理搜索内容」移动到目标知识库
source_dir = os.path.join(vault_path, unorganized_content, "2026-05-05")
target_dir = os.path.join(vault_path, "knowledge-base", "AI")

# ⚠️ 安全提醒：移动文件前需要用户确认
if user_confirmed("确认要移动这些文件到知识库吗？"):
    # 移动文件
    for filename in os.listdir(source_dir):
        source_file = os.path.join(source_dir, filename)
        target_file = os.path.join(target_dir, filename)
        shutil.move(source_file, target_file)
        print(f"已移动：{filename}")
```

---

## 方案 B：使用 Obsidian Local REST API 插件

### 安装插件

1. 打开 Obsidian
2. 进入 **设置** → **第三方插件**
3. 点击 **浏览社区插件**
4. 搜索 **Local REST API**
5. 点击 **安装**
6. 点击 **启用**

### 配置插件

1. 进入 **设置** → **Local REST API**
2. **不建议设置 API Key**（留空更安全）
3. 记下 **Port**（默认：27123）

### 配置

⚠️ **安全提醒**：请不要将 API Key 存储在 `config.json` 中！应该使用环境变量或密钥管理工具。

**推荐方法：不使用 API Key（最简单安全）**

在 `config.json` 中设置（不包含 API key）：

```json
{
  "platform": "obsidian",
  "vault_path": "C:/Users/engla/Documents/ObsidianVault",
  "search_url_library": "search-url-library",
  "unorganized_content": "unorganized-search-content",
  "method": "rest-api",
  "obsidian_api_url": "http://localhost:27123"
}
```

**如果需要 API Key 认证**，请使用环境变量：

```bash
# Linux/Mac
export OBSIDIAN_API_KEY="your-api-key"

# Windows (PowerShell)
$env:OBSIDIAN_API_KEY="your-api-key"
```

然后在代码中读取：

```python
import os

[REDACTED_SECRET]"OBSIDIAN_API_KEY")  # 从环境变量读取
```

### 操作示例

#### 1. 创建笔记

```python
import requests
import os

api_url = config["obsidian_api_url"]
[REDACTED_SECRET]"OBSIDIAN_API_KEY")  # 从环境变量读取

headers = {}
if [REDACTED_SECRET]"Authorization"] = f"Bearer {api_key}"
headers["Content-Type"] = "application/json"

# 创建笔记
data = {
    "content": "# 网页标题\n\n这是内容...",
    "path": "unorganized-search-content/2026-05-05/webpage-title.md"
}

response = requests.post(f"{api_url}/vault/create", headers=headers, json=data)
```

#### 2. 读取笔记

```python
import requests
import os

api_url = config["obsidian_api_url"]
[REDACTED_SECRET]"OBSIDIAN_API_KEY")  # 从环境变量读取

headers = {}
if [REDACTED_SECRET]"Authorization"] = f"Bearer {api_key}"

# 读取笔记
response = requests.get(f"{api_url}/vault/unorganized-search-content/2026-05-05/webpage-title.md", headers=headers)
content = response.text
```

#### 3. 更新笔记

```python
import requests
import os

api_url = config["obsidian_api_url"]
[REDACTED_SECRET]"OBSIDIAN_API_KEY")  # 从环境变量读取

headers = {}
if [REDACTED_SECRET]"Authorization"] = f"Bearer {api_key}"
headers["Content-Type"] = "application/json"

# 更新笔记
data = {
    "content": "# 更新后的标题\n\n这是更新后的内容..."
}

response = requests.post(f"{api_url}/vault/update", headers=headers, json=data)
```

#### 4. 删除笔记

⚠️ **安全提醒**：删除操作需要用户显式确认！

```python
import requests
import os

api_url = config["obsidian_api_url"]
[REDACTED_SECRET]"OBSIDIAN_API_KEY")  # 从环境变量读取

headers = {}
if [REDACTED_SECRET]"Authorization"] = f"Bearer {api_key}"

# ⚠️ 删除前需要用户确认
if user_confirmed("确认要删除这个笔记吗？"):
    # 删除笔记
    response = requests.delete(f"{api_url}/vault/delete", headers=headers, params={"path": "unorganized-search-content/2026-05-05/webpage-title.md"})
    print("笔记已删除")
```

---

## 双向链接

Obsidian 的强大功能之一是双向链接。在 Markdown 文件中使用 `[[笔记名称]]` 来创建链接。

### 示例

```markdown
# 网页标题

## 相关笔记

- [[AI 概述]]
- [[机器学习基础]]
- [[search-rules]]
```

当你打开 `[[AI 概述]]` 这个笔记时，Obsidian 会自动显示所有链接到这个笔记的其他笔记。

---

## 标签系统

Obsidian 支持使用 `#标签` 来分类笔记。

### 示例

```markdown
# 网页标题

## 标签

#AI #机器学习 #待确认 #重要
```

你可以在 Obsidian 的 **标签页面** 中查看所有标签和对应的笔记。

---

## 注意事项

⚠️ **安全提醒**：
1. **Vault 路径验证**：使用前请确保 `vault_path` 设置正确，避免未授权的文件存取
2. **路径白名单**：所有文件操作都会验证路径是否在 Vault 目录内
3. **用户确认**：敏感操作（如删除文件）需要用户显式确认
4. **凭证保护**：Obsidian API Key **不存储到磁盘**，仅存储在内存中（环境变量）
5. **文件备份**：建议定期备份 Vault 目录

## 安全代码示例

```python
import os
from pathlib import Path

# 路径验证函数
def validate_vault_path(vault_path, target_path):
    """验证目标路径是否在 Vault 目录内"""
    vault_abs = Path(vault_path).resolve()
    target_abs = Path(target_path).resolve()
    
    # 检查目标路径是否在 Vault 目录内
    try:
        target_abs.relative_to(vault_abs)
        return True
    except ValueError:
        raise SecurityError(f"路径 {target_path} 不在允许的 Vault 目录内！")

# 使用前验证
vault_path = config["vault_path"]
target_file = os.path.join(vault_path, "search-url-library", "whitelist", "example.com.md")

# 验证路径
validate_vault_path(vault_path, target_file)

# 安全读取文件
with open(target_file, "r", encoding="utf-8") as f:
    content = f.read()
```

1. **Vault 路径**：确保 `vault_path` 配置正确
2. **文件编码**：始终使用 UTF-8 编码
3. **文件名特殊字符**：避免使用特殊字符（如 `/`, `\`, `:`, `*`, `?`, `"`, `<`, `>`, `|`）
4. **方案 A**：修改文件后，需要手动刷新 Obsidian 才能看到更新
5. **方案 B**：需要预先安装并启用 Obsidian Local REST API 插件
6. **API 安全性**：如果设置了 API Key，请确保保密（但推荐使用环境变量，不要写在 config.json 中）
7. **文件备份**：建议定期备份 Vault 目录

---

## 参考资源

- [Obsidian 官方文档](https://help.obsidian.md/)
- [Obsidian Local REST API 插件](https://github.com/coddingtonbear/obsidian-local-rest-api)
- [Obsidian Markdown 语法](https://help.obsidian.md/Editing+and+formatting/Basic+formatting+syntax)


path: references/platform-comparison.md
content: # 知識庫平台功能對比

## 平台對比表

| 功能 | IMA 知識庫 | 騰訊文檔 | Obsidian | NotebookLM | 其他平台 |
|------|-------------|-------------|-----------|-------------|----------|
| **AI 搜索** | ✅ 支持 | ❌ 不支持 | ❌ 不支持（需插件） | ✅ 支持 | 視平台而定 |
| **知識圖譜** | ✅ 支持 | ❌ 不支持 | ✅ 支持（雙向鏈接） | ❌ 不支持 | 視平台而定 |
| **協作編輯** | ✅ 支持 | ✅ 支持 | ❌ 不支持（需插件） | ❌ 不支持 | 視平台而定 |
| **在線預覽** | ✅ 支持 | ✅ 支持 | ✅ 支持（本地） | ✅ 支持（Web） | 視平台而定 |
| **版本歷史** | ✅ 支持 | ✅ 支持 | ✅ 支持（Git） | ✅ 支持 | 視平台而定 |
| **文件夾管理** | ✅ 支持 | ✅ 支持 | ✅ 支持 | ❌ 不支持 | 視平台而定 |
| **API 操作** | ✅ 支持 | ✅ 支持 | ✅ 支持（Local REST API） | ❌ 不支持（需瀏覽器自動化） | 視平台而定 |
| **批量操作** | ✅ 支持 | ✅ 支持 | ✅ 支持 | ❌ 不支持 | 視平台而定 |
| **權限管理** | ✅ 支持 | ✅ 支持 | ❌ 不支持 | ❌ 不支持 | 視平台而定 |
| **移動端支持** | ✅ 支持 | ✅ 支持 | ✅ 支持（Mobile App） | ✅ 支持 | 視平台而定 |
| **本地存儲** | ❌ 不支持 | ❌ 不支持 | ✅ 支持 | ❌ 不支持 | 視平台而定 |
| **Markdown 原生** | ❌ 不支持 | ❌ 不支持 | ✅ 支持 | ❌ 不支持 | 視平台而定 |

## 詳細對比

### IMA 知識庫

**優點**：
- ✅ **AI 增強**：支持 AI 搜索、自動分類、知識圖譜
- ✅ **智能推薦**：根據用戶興趣推薦相關內容
- ✅ **自動標籤**：自動爲內容添加標籤
- ✅ **語義搜索**：支持自然語言搜索

**缺點**：
- ❌ **協作功能較弱**：相比騰訊文檔，協作功能較簡單
- ❌ **格式限制**：主要支持文本內容

**適用場景**：
- 需要 AI 搜索和智能推薦
- 需要構建知識圖譜
- 主要存儲文本內容

### 騰訊文檔

**優點**：
- ✅ **強大的協作功能**：多人實時協作編輯
- ✅ **豐富的格式支持**：支持文本、表格、幻燈片、思維導圖
- ✅ **在線預覽**：可以直接在瀏覽器中預覽
- ✅ **版本歷史**：自動保存版本，支持回滾
- ✅ **權限管理**：細粒度的權限控制

**缺點**：
- ❌ **缺少 AI 功能**：不支持 AI 搜索和智能推薦
- ❌ **搜索功能較弱**：主要依賴關鍵詞搜索

**適用場景**：
- 需要多人協作編輯
- 需要豐富的格式支持
- 需要強大的權限管理

### 其他平台

**優點**：
- ✅ **靈活定制**：可以根據需求定制功能
- ✅ **多樣化**：可以選擇適合自己需求的平台

**缺點**：
- ❌ **需要額外配置**：需要提供 API 或操作方式
- ❌ **功能不確定**：視平台而定

**適用場景**：
- 已經在使用其他知識庫平台
- 需要特定的功能或集成

### Obsidian

**優點**：
- ✅ **本地化存儲**：所有數據保存在本地，完全掌控
- ✅ **Markdown 原生**：使用標準 Markdown 格式，兼容性強
- ✅ **雙向鏈接**：強大的知識網絡構建能力
- ✅ **標籤系統**：靈活的標籤和元數據支持
- ✅ **插件生態**：豐富的插件（包括 Local REST API）
- ✅ **版本控制**：可以使用 Git 進行版本管理
- ✅ **隱私保護**：數據不上傳雲端

**缺點**：
- ❌ **協作功能弱**：原生不支持多人協作（需插件）
- ❌ **學習曲線**：需要熟悉 Markdown 和文件系統
- ❌ **移動端體驗**：移動端功能相對較弱

**適用場景**：
- 需要本地化知識管理
- 喜歡 Markdown 格式
- 需要構建複雜的知識網絡（雙向鏈接）
- 重視隱私和數據掌控

**操作方式**：
- **方案 A（推薦）**：直接操作 Vault 文件系統
  - 无需额外依赖
  - 简单高效
  - 通过文件路径直接读写 Markdown 文件
- **方案 B**：使用 Obsidian Local REST API 插件
  - 需要安装并启用插件
  - 通过 HTTP API 操作笔记
  - 支持更复杂的操作

### NotebookLM

**優點**：
- ✅ **AI 增強**：Google 的 AI 技術，自動摘要、問答
- ✅ **智能分析**：自動提取關鍵信息
- ✅ **來源管理**：支持多種來源（網頁、PDF、Google Drive）
- ✅ **Google 集成**：與 Google Drive、Google 帳號深度集成
- ✅ **自動問答**：可以對上傳的內容提問

**缺點**：
- ❌ **依賴網絡**：需要穩定的網絡連接
- ❌ **隱私疑慮**：內容需要上傳到 Google 服務器
- ❌ **格式限制**：主要支持文本內容
- ❌ **無官方 API**：需要通過瀏覽器自動化或 Google Drive API 間接集成

**適用場景**：
- 需要 AI 輔助分析
- 主要處理文本內容
- 已經在使用 Google 生態系統
- 需要快速從多個來源提取信息

**操作方式**：
- **方案 A（推薦）**：使用瀏覽器自動化（`playwright-cli` 或 `agent-browser`）
  - 自動登錄 Google 帳號
  - 自動上傳文件或添加網頁鏈接
  - 等待 AI 處理完成
- **方案 B**：通過 Google Drive API 間接集成
  - 將文件上傳到 Google Drive
  - 在 NotebookLM 中導入 Drive 文件

## 選擇建議

### 選擇 IMA 知識庫，如果：

1. **需要 AI 功能**：希望使用 AI 搜索、自動分類、知識圖譜等功能
2. **主要存儲文本**：主要需要存儲和管理文本內容
3. **個人使用**：主要用於個人知識管理

**示例**：
```
用戶：我想要使用 AI 搜索來快速找到相關的網頁內容
推薦：IMA 知識庫
```

### 選擇騰訊文檔，如果：

1. **需要協作編輯**：需要多人協作編輯和管理內容
2. **需要豐富格式**：需要存儲表格、幻燈片、思維導圖等內容
3. **需要強權限管理**：需要細粒度的權限控制

**示例**：
```
用戶：我需要與團隊成員協作編輯和管理搜索規則
推薦：騰訊文檔
```

### 選擇其他平台，如果：

1. **已在使用其他平台**：已經在使用其他知識庫平台
2. **需要特定功能**：需要特定的功能或集成

**示例**：
```
用戶：我已經在使用 Notion 來管理我的知識庫
推薦：其他平台（Notion）
```

### 選擇 Obsidian，如果：

1. **需要本地化存儲**：希望所有數據保存在本地，完全掌控
2. **喜歡 Markdown**：習慣使用 Markdown 格式編輯
3. **需要雙向鏈接**：需要構建複雜的知識網絡
4. **重視隱私**：不希望數據上傳到雲端

**示例**：
```
用戶：我希望所有搜索內容都保存在本地，使用 Markdown 格式
推薦：Obsidian
```

### 選擇 NotebookLM，如果：

1. **需要 AI 輔助**：希望使用 AI 自動摘要、問答
2. **使用 Google 生態**：已經在使用 Google Drive、Google 帳號
3. **主要處理文本**：主要需要分析文本內容
4. **快速提取信息**：需要從多個來源快速提取關鍵信息

**示例**：
```
用戶：我希望 AI 自動幫我摘要搜索到的網頁內容
推薦：NotebookLM
```

## 平台切換指南

### 從 IMA 切換到騰訊文檔

1. **導出 IMA 數據**：
   - 使用 IMA skill 導出白名單、黑名單、未分類數據
   - 導出「未整理搜索內容」中的網頁內容

2. **導入騰訊文檔**：
   - 使用 `tencent-docs` skill 創建相應的文檔
   - 將導出的數據導入到騰訊文檔

3. **更新配置**：
   - 更新 `config.json` 中的 `platform` 字段爲 `tencent-docs`
   - 更新 `search_url_library` 和 `unorganized_content` 字段

### 從騰訊文檔切換到 IMA

1. **導出騰訊文檔數據**：
   - 使用 `tencent-docs` skill 導出文檔內容
   - 下載「未整理搜索內容」中的網頁內容

2. **導入 IMA**：
   - 使用 IMA skill 創建相應的筆記
   - 將導出的數據導入到 IMA

3. **更新配置**：
   - 更新 `config.json` 中的 `platform` 字段爲 `ima`
   - 更新 `search_url_library` 和 `unorganized_content` 字段

### 從其他平台切換到 Obsidian

1. **導出原平台數據**：
   - 根據原平台的導出方法導出數據
   - 轉換爲 Markdown 格式（如果需要）

2. **導入 Obsidian**：
   - 將 Markdown 文件複製到 Obsidian Vault 文件夾
   - 使用 Obsidian 打開 Vault
   - 建立雙向鏈接（可選）

3. **更新配置**：
   - 更新 `config.json` 中的 `platform` 字段爲 `obsidian`
   - 設置 `vault_path` 字段爲 Obsidian Vault 的路徑
   - 更新 `search_url_library` 和 `unorganized_content` 字段爲相對路徑

### 從其他平台切換到 NotebookLM

1. **導出原平台數據**：
   - 根據原平台的導出方法導出數據
   - 轉換爲 PDF 或 Markdown 格式（NotebookLM 支持）

2. **導入 NotebookLM**：
   - **方案 A**：使用瀏覽器自動化上傳
     - 使用 `playwright-cli` 或 `agent-browser` 打開 NotebookLM
     - 自動上傳文件
   - **方案 B**：上傳到 Google Drive，然後在 NotebookLM 中導入

3. **更新配置**：
   - 更新 `config.json` 中的 `platform` 字段爲 `notebooklm`
   - 更新 `search_url_library` 和 `unorganized_content` 字段

### 從 Obsidian 切換到其他平台

1. **導出 Obsidian 數據**：
   - Obsidian 的數據就是 Markdown 文件，可以直接使用
   - 如果需要，可以將 Markdown 轉換爲其他格式

2. **導入目標平台**：
   - 根據目標平台的導入方法導入數據

3. **更新配置**：
   - 更新 `config.json` 中的 `platform` 字段
   - 更新 `search_url_library` 和 `unorganized_content` 字段

### 從 NotebookLM 切換到其他平台

1. **導出 NotebookLM 數據**：
   - 使用瀏覽器自動化下載 NotebookLM 中的內容
   - 或者手動導出爲 PDF 或文本格式

2. **導入目標平台**：
   - 根據目標平台的導入方法導入數據

3. **更新配置**：
   - 更新 `config.json` 中的 `platform` 字段
   - 更新 `search_url_library` 和 `unorganized_content` 字段

## 注意事項

1. **數據遷移**：切換平台時，可能需要手動遷移數據
2. **格式轉換**：不同平台支持的格式可能不同，需要進行格式轉換
3. **功能差異**：不同平台的功能可能有所差異，需要根據實際情況調整操作流程
4. **配置更新**：切換平台後，需要更新 `config.json` 配置文件
5. **用戶確認**：在切換平台前，請務必確認用戶的需求和偏好
6. **Obsidian 特定**：
   - 確保 Vault 路徑正確
   - 如果使用 Obsidian Local REST API，需要先安裝並啓用插件
7. **NotebookLM 特定**：
   - 瀏覽器自動化需要穩定的網絡連接
   - 需要預先登錄 Google 帳號


path: references/tencent-docs-operations.md
content: # 騰訊文檔操作參考

## 知識庫管理

### 檢查知識庫是否存在

使用 `tencent-docs` skill 列出所有文檔，檢查目標知識庫是否存在。

### 創建知識庫

如果知識庫不存在，使用 `tencent-docs` skill 創建：

```
知識庫名稱：搜索網址庫
描述：記錄搜尋規則、網址的暫存名單（未分類白名單還是黑名單）、白名單和黑名單

知識庫名稱：未整理搜尋內容
描述：暫存搜尋後的網頁內容，按搜尋日期組織
```

## 文件操作

### 搜索網址庫結構

```
搜索網址庫/
├── 白名單.md
├── 黑名單.md
└── 未分類.md
```

#### 白名單.md 格式

```markdown
# 白名單

## 添加時間 | 網址 | 添加原因 | 分類標籤

2026-05-05 19:30 | https://example.com/article1 | 用戶確認，內容優質 | 科技, AI
2026-05-05 19:35 | https://blog.example.org/post1 | 權威來源 | 學術
```

#### 黑名單.md 格式

```markdown
# 黑名單

## 添加時間 | 網址 | 屏蔽原因

2026-05-05 19:40 | https://spam.example.com | 內容質量低
2026-05-05 19:45 | https://ads.example.org | 廣告內容
```

#### 未分類.md 格式

```markdown
# 未分類

## 發現時間 | 網址 | 備註

2026-05-05 19:50 | https://new.example.com/article | 待用戶確認
```

### 未整理搜尋內容結構

```
未整理搜尋內容/
└── 2026-05-05/
    ├── 網頁標題1.md
    ├── 網頁標題2.md
    └── ...
```

#### 網頁內容文件格式

```markdown
# 網頁標題

- 網址：https://example.com/article
- 發布時間：2026-05-05
- 來源：來源網站名稱
- 狀態：待確認 / 自動通過
- 搜尋關鍵詞：AI, 機器學習
- 暫存時間：2026-05-05 19:30

## 內容摘要

這是一篇關於...的文章

## 完整內容

<article_content>
```

## 騰訊文檔 Skill 調用示例

### 搜索文檔

```
使用 tencent-docs skill 搜索「搜索網址庫」，查詢網址是否存在
```

### 創建文檔

```
使用 tencent-docs skill 創建文檔到「未整理搜尋內容」知識庫
文檔標題：網頁標題1
文檔內容：（完整的 Markdown 內容）
目標文件夾：2026-05-05
```

### 更新文檔

```
使用 tencent-docs skill 更新「搜索網址庫/白名單.md」
操作：在文件末尾添加新的白名單網址記錄
```

### 從知識庫刪除文檔

```
使用 tencent-docs skill 從「未整理搜尋內容」刪除已處理的文檔
文檔 ID：xxx
```

### 列出文件夾內容

```
使用 tencent-docs skill 列出「未整理搜尋內容/2026-05-05/」中的所有文檔
```

## 騰訊文檔特定功能

### 協作編輯

騰訊文檔支持多人協作編輯，適合團隊使用：

```
在創建「搜索網址庫」時，可以設置協作權限：
- 可編輯：團隊成員可以添加/修改網址
- 只讀：團隊成員只能查看網址庫
```

### 在線預覽

騰訊文檔支持在線預覽，方便查看暫存的網頁內容：

```
使用 tencent-docs skill 獲取文檔的在線預覽鏈接
文檔 ID：xxx
返回：預覽鏈接（可以直接在瀏覽器中打開）
```

### 版本歷史

騰訊文檔自動保存版本歷史，可以回滾到之前的版本：

```
如果誤刪了白名單中的網址，可以：
1. 使用 tencent-docs skill 查看文檔的版本歷史
2. 找到之前的版本
3. 恢復誤刪的內容
```

## 注意事項

1. **文件夾結構**：騰訊文檔使用文件夾來組織文檔，確保按日期組織文檔，便於管理和清理
2. **網址去重**：在添加前檢查網址是否已存在於白名單或黑名單
3. **定期維護**：建議每月清理一次「未整理搜尋內容」中的過期內容
4. **權限管理**：確保知識庫的訪問權限設置正確，避免敏感信息泄露
5. **API 限制**：騰訊文檔 API 可能有調用頻率限制，注意控制操作頻率


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)