feat: sync full workspace including web modules, docs, and configurations to Gitea

Optimized the root .gitignore to exclude virtual environments, node modules,
and temp folders to ensure clean and lightweight version tracking.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
王冕
2026-06-09 18:12:25 +08:00
parent 351688006e
commit a27e3b8e43
1510 changed files with 162044 additions and 1517 deletions

View File

@@ -0,0 +1,53 @@
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
venv/
ENV/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# MCP Server (will be cloned during install)
# Keep the directory but ignore its contents
wexin-read-mcp/
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store
# Logs
*.log
# Environment
.env
.env.local
# Temporary files
tmp/
temp/
*.tmp
# macOS
.DS_Store
.AppleDouble
.LSOverride

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Joe
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,396 @@
<div align="center">
# 🎯 多源内容 → NotebookLM 智能处理器
**一句话变播客、PPT、思维导图、Quiz...**
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com)
[![GitHub stars](https://img.shields.io/github/stars/joeseesun/anything-to-notebooklm?style=social)](https://github.com/joeseesun/anything-to-notebooklm/stargazers)
[![GitHub forks](https://img.shields.io/github/forks/joeseesun/anything-to-notebooklm?style=social)](https://github.com/joeseesun/anything-to-notebooklm/network/members)
[![GitHub issues](https://img.shields.io/github/issues/joeseesun/anything-to-notebooklm)](https://github.com/joeseesun/anything-to-notebooklm/issues)
[![GitHub last commit](https://img.shields.io/github/last-commit/joeseesun/anything-to-notebooklm)](https://github.com/joeseesun/anything-to-notebooklm/commits/main)
[快速开始](#-快速开始) • [支持格式](#-支持的内容源) • [使用示例](#-使用示例) • [常见问题](#-常见问题)
</div>
---
## ✨ 这是什么?
一个 **Claude Code Skill**,让你用自然语言把**任何内容**变成**任何格式**。
```
你说:把这篇微信文章生成播客
AI :✅ 8 分钟播客已生成 → podcast.mp3
你说:这本 EPUB 电子书做成思维导图
AI :✅ 思维导图已生成 → mindmap.json
你说:这个 YouTube 视频做成 PPT
AI :✅ 25 页 PPT 已生成 → slides.pdf
```
**原理**:自动从多种来源获取内容 → 上传到 [Google NotebookLM](https://notebooklm.google.com/) → AI 生成你想要的格式
## 🚀 支持的内容源15+ 种格式)
<table>
<tr>
<td width="50%">
### 📱 社交媒体
- **微信公众号**(绕过反爬虫)
- **YouTube 视频**(自动提取字幕)
### 🌐 网页
- **任意网页**(新闻、博客、文档)
- **搜索关键词**(自动汇总结果)
### 📄 Office 文档
- **Word** (.docx)
- **PowerPoint** (.pptx)
- **Excel** (.xlsx)
</td>
<td width="50%">
### 📚 电子书与文档
- **PDF**(支持扫描件 OCR
- **EPUB**(电子书)
- **Markdown** (.md)
### 🖼️ 图片与音频
- **图片**JPEG/PNG/GIF自动 OCR
- **音频**WAV/MP3自动转录
### 📊 结构化数据
- **CSV/JSON/XML**
- **ZIP 压缩包**(批量处理)
</td>
</tr>
</table>
**技术支持**: [Microsoft markitdown](https://github.com/microsoft/markitdown)
## 🎨 可以生成什么?
| 输出格式 | 用途 | 生成时间 | 触发词示例 |
|---------|------|---------|-----------|
| 🎙️ **播客** | 通勤路上听 | 2-5 分钟 | "生成播客"、"做成音频" |
| 📊 **PPT** | 团队分享 | 1-3 分钟 | "做成PPT"、"生成幻灯片" |
| 🗺️ **思维导图** | 理清结构 | 1-2 分钟 | "画个思维导图"、"生成脑图" |
| 📝 **Quiz** | 自测掌握 | 1-2 分钟 | "生成Quiz"、"出题" |
| 🎬 **视频** | 可视化 | 3-8 分钟 | "做个视频" |
| 📄 **报告** | 深度分析 | 2-4 分钟 | "生成报告"、"写个总结" |
| 📈 **信息图** | 数据可视化 | 2-3 分钟 | "做个信息图" |
| 📋 **闪卡** | 记忆巩固 | 1-2 分钟 | "做成闪卡" |
**完全自然语言,无需记命令!**
## ⚡ 快速开始
### 前置需求
- ✅ Python 3.9+
- ✅ GitmacOS/Linux 自带)
**就这两样!** 其他依赖一键自动安装。
### 安装3 步)
```bash
# 1. 克隆到 Claude skills 目录
cd ~/.claude/skills/
git clone https://github.com/joeseesun/anything-to-notebooklm
cd anything-to-notebooklm
# 2. 一键安装所有依赖
./install.sh
# 3. 按提示配置 MCP然后重启 Claude Code
```
### 首次使用
```bash
# NotebookLM 认证(只需一次)
notebooklm login
notebooklm list # 验证成功
# 环境检查(可选)
./check_env.py
```
## 💡 使用示例
### 场景 1快速学习 - 文章 → 播客
```
你:把这篇文章生成播客 https://mp.weixin.qq.com/s/abc123
AI 自动执行:
✓ 抓取微信文章内容
✓ 上传到 NotebookLM
✓ 生成播客2-5 分钟)
✅ 结果:/tmp/article_podcast.mp38 分钟12.3 MB
💡 用途:通勤路上听完一篇深度文章
```
### 场景 2团队分享 - 电子书 → PPT
```
你:这本书做成 PPT /Users/joe/Books/sapiens.epub
AI 自动执行:
✓ 提取电子书内容15 万字)
✓ AI 精炼核心观点
✓ 生成专业 PPT
✅ 结果:/tmp/sapiens_slides.pdf25 页3.8 MB
💡 用途:直接用于读书会分享
```
### 场景 3自测学习 - 视频 → Quiz
```
你:这个 YouTube 视频生成 Quiz https://youtube.com/watch?v=abc
AI 自动执行:
✓ 提取视频字幕
✓ AI 分析关键知识点
✓ 自动出题
✅ 结果:/tmp/video_quiz.md15 道题10 选择 + 5 简答)
💡 用途:检验学习效果
```
### 场景 4信息整合 - 多源 → 报告
```
你:把这些内容一起做成报告:
- https://example.com/article1
- https://youtube.com/watch?v=xyz
- /Users/joe/research.pdf
AI 自动执行:
✓ 汇总 3 个不同来源
✓ AI 整合分析
✓ 生成综合报告
✅ 结果:/tmp/multi_source_report.md7 个章节15.2 KB
💡 用途:全面的主题研究报告
```
### 场景 5文档数字化 - 扫描件 → 文字
```
你:把这个扫描图片做成文档 /Users/joe/scan.jpg
AI 自动执行:
✓ OCR 识别图片中的文字
✓ 提取为纯文本
✓ 生成结构化文档
✅ 结果:/tmp/scan_document.txt识别准确率 95%+
💡 用途:扫描件数字化归档
```
## 🎯 核心特性
### 🧠 智能识别
自动判断输入类型,无需手动指定
```
https://mp.weixin.qq.com/s/xxx → 微信公众号
https://youtube.com/watch?v=xxx → YouTube 视频
/path/to/file.epub → EPUB 电子书
"搜索 'AI 趋势'" → 搜索查询
```
### 🚀 全自动处理
从获取到生成,一气呵成
```
输入 → 获取 → 转换 → 上传 → 生成 → 下载
︿________全自动________︿
```
### 🌐 多源整合
支持混合多种内容源
```
文章 + 视频 + PDF + 搜索结果 → 综合报告
```
### 🔒 本地优先
敏感内容本地处理
```
微信文章 → 本地 MCP 抓取 → 本地转换 → NotebookLM
```
## 📦 技术架构
```
┌─────────────────────────────────────┐
│ 用户自然语言输入 │
│ "把这篇文章生成播客 https://..." │
└──────────────┬──────────────────────┘
┌─────────────────────────────────────┐
│ Claude Code Skill │
│ • 智能识别内容源类型 │
│ • 自动调用对应工具 │
└──────────────┬──────────────────────┘
┌────────┴────────┐
│ │
▼ ▼
┌──────────┐ ┌─────────────┐
│ 微信公众号 │ │ 其他格式 │
│ MCP 抓取 │ │ markitdown │
└─────┬────┘ └──────┬──────┘
│ │
└────────┬────────┘
┌─────────────────────────────────────┐
│ NotebookLM API │
│ • 上传内容源 │
│ • AI 生成目标格式 │
└──────────────┬──────────────────────┘
┌─────────────────────────────────────┐
│ 生成的文件 │
│ .mp3 / .pdf / .json / .md │
└─────────────────────────────────────┘
```
## 🔧 高级用法
### 指定已有 Notebook
```
把这篇文章加到我的【AI研究】笔记本 https://example.com
```
### 批量处理
```
把这些文章都生成播客:
1. https://mp.weixin.qq.com/s/abc123
2. https://example.com/article2
3. /Users/joe/notes.md
```
### ZIP 批量转换
```
把这个压缩包里的所有文档做成播客 /path/to/files.zip
```
自动解压、识别、转换、合并
## 🐛 故障排查
### MCP 工具未找到
```bash
# 测试 MCP 服务器
python ~/.claude/skills/anything-to-notebooklm/wexin-read-mcp/src/server.py
# 重新安装依赖
cd ~/.claude/skills/anything-to-notebooklm/wexin-read-mcp
pip install -r requirements.txt
playwright install chromium
```
### NotebookLM 认证失败
```bash
notebooklm login # 重新登录
notebooklm list # 验证
```
### 环境检查
```bash
./check_env.py # 13 项全面检查
./install.sh # 重新安装
```
## 🤝 贡献
欢迎 PR、Issue、建议
## ❓ 常见问题
<details>
<summary><b>Q: 支持哪些语言?</b></summary>
A: NotebookLM 支持多语言,中文、英文效果最佳。
</details>
<details>
<summary><b>Q: 播客是谁的声音?</b></summary>
A: Google AI 语音合成。英文是两个 AI 主持人对话,中文是单人叙述。
</details>
<details>
<summary><b>Q: 内容长度限制?</b></summary>
A:
- 最短:约 500 字
- 最长:约 50 万字
- 推荐1000-10000 字效果最佳
</details>
<details>
<summary><b>Q: 可以商用吗?</b></summary>
A:
- 本 SkillMIT 开源,可自由使用
- 生成内容:遵守 NotebookLM 服务条款
- 原始内容:遵守原内容版权
- 建议:仅用于个人学习研究
</details>
<details>
<summary><b>Q: 为什么需要 MCP</b></summary>
A: 微信公众号有反爬虫MCP 用浏览器模拟绕过。其他内容源网页、YouTube、PDF不需要 MCP。
</details>
## 📄 许可证
[MIT License](LICENSE)
## 🙏 致谢
- [Google NotebookLM](https://notebooklm.google.com/) - AI 内容生成
- [Microsoft markitdown](https://github.com/microsoft/markitdown) - 文件转换
- [wexin-read-mcp](https://github.com/Bwkyd/wexin-read-mcp) - 微信抓取
- [notebooklm-py](https://github.com/teng-lin/notebooklm-py) - NotebookLM CLI
## 📮 联系
- **Issues**: [GitHub Issues](https://github.com/joeseesun/anything-to-notebooklm/issues)
- **Discussions**: [GitHub Discussions](https://github.com/joeseesun/anything-to-notebooklm/discussions)
---
<div align="center">
**如果觉得有用,请给个 ⭐ Star**
Made with ❤️ by [Joe](https://github.com/joeseesun)
</div>

View File

@@ -0,0 +1,632 @@
---
name: anything-to-notebooklm
description: 多源内容智能处理器支持微信公众号、网页、YouTube、PDF、Markdown等自动上传到NotebookLM并生成播客/PPT/思维导图等多种格式
user-invocable: true
homepage: https://github.com/joeseesun/anything-to-notebooklm
---
# 多源内容 → NotebookLM 智能处理器
自动从多种来源获取内容,上传到 NotebookLM并根据自然语言指令生成播客、PPT、思维导图等多种格式。
## 支持的内容源
### 1. 微信公众号文章
通过 MCP 服务器自动抓取微信公众号文章内容(绕过反爬虫)
### 2. 任意网页链接
支持任何公开可访问的网页(新闻、博客、文档等)
### 3. YouTube 视频
自动提取 YouTube 视频的字幕和元数据
### 4. Office 文档
- **Word (DOCX)** - 保留表格和格式
- **PowerPoint (PPTX)** - 提取幻灯片和备注
- **Excel (XLSX)** - 表格数据
### 5. 电子书与文档
- **PDF** - 全文提取
- **EPUB** - 电子书全文提取
- **Markdown (.md)** - 原生支持
### 6. 图片与扫描件
- **Images** (JPEG, PNG, GIF, WebP) - OCR 识别文字
- 扫描的 PDF 文档 - OCR 提取文字
### 7. 音频文件
- **Audio** (WAV, MP3) - 语音转文字
### 8. 结构化数据
- **CSV** - 逗号分隔数据
- **JSON** - JSON 数据
- **XML** - XML 文档
### 9. 压缩包
- **ZIP** - 自动解压并处理所有支持的文件
### 10. 纯文本
直接输入或粘贴的文本内容
### 11. 搜索关键词
通过 Web Search 搜索关键词,汇总多个来源的信息
## 前置条件
### 1. 安装 wexin-read-mcp
MCP 服务器已安装在:`~/.claude/skills/anything-to-notebooklm/wexin-read-mcp/`
**配置 MCP**(需要手动添加到 Claude 配置文件):
**macOS**: 编辑 `~/.claude/config.json`
```json
{
"primaryApiKey": "any",
"mcpServers": {
"weixin-reader": {
"command": "python",
"args": [
"/Users/joe/.claude/skills/anything-to-notebooklm/wexin-read-mcp/src/server.py"
]
}
}
}
```
**配置后需要重启 Claude Code。**
### 2. notebooklm 认证
首次使用前必须认证:
```bash
notebooklm login
notebooklm list # 验证认证成功
```
## 触发方式
### 微信公众号文章
- `/anything-to-notebooklm [微信文章链接]`
- "把这篇微信文章传到NotebookLM"
- "把这篇微信文章生成播客"
### 网页链接
- "把这个网页做成播客 [URL]"
- "这篇文章帮我做成PPT [URL]"
- "帮我分析这个网页 [URL]"
### YouTube 视频
- "把这个YouTube视频做成播客 [YouTube URL]"
- "这个视频帮我生成思维导图 [YouTube URL]"
### 本地文件
- "把这个PDF上传到NotebookLM /path/to/file.pdf"
- "这个Markdown文件生成PPT /path/to/file.md"
- "这个EPUB电子书生成播客 /path/to/book.epub"
- "把这个Word文档做成思维导图 /path/to/doc.docx"
- "这个PowerPoint生成Quiz /path/to/slides.pptx"
- "把这个扫描PDF做成报告 /path/to/scan.pdf"自动OCR
### 搜索关键词
- "搜索 'AI发展趋势' 并生成报告"
- "搜索关于'量子计算'的资料做成播客"
### 混合使用
- "把这篇文章、这个视频和这个PDF一起上传生成一份报告"
## 自然语言 → NotebookLM 功能映射
| 用户说的话 | 识别意图 | NotebookLM 命令 |
|-----------|---------|----------------|
| "生成播客" / "做成音频" / "转成语音" | audio | `generate audio` |
| "做成PPT" / "生成幻灯片" / "做个演示" | slide-deck | `generate slide-deck` |
| "画个思维导图" / "生成脑图" / "做个导图" | mind-map | `generate mind-map` |
| "生成Quiz" / "出题" / "做个测验" | quiz | `generate quiz` |
| "做个视频" / "生成视频" | video | `generate video` |
| "生成报告" / "写个总结" / "整理成文档" | report | `generate report` |
| "做个信息图" / "可视化" | infographic | `generate infographic` |
| "生成数据表" / "做个表格" | data-table | `generate data-table` |
| "做成闪卡" / "生成记忆卡片" | flashcards | `generate flashcards` |
**如果没有明确指令**,默认只上传不生成任何内容,等待用户后续指令。
## 工作流程
### Step 1: 识别内容源类型
Claude 自动识别输入类型:
| 输入特征 | 识别为 | 处理方式 |
|---------|-------|---------|
| `https://mp.weixin.qq.com/s/` | 微信公众号 | MCP 工具抓取 |
| `https://youtube.com/...``https://youtu.be/...` | YouTube | 直接传递给 NotebookLM |
| `https://``http://` | 网页 | 直接传递给 NotebookLM |
| `/path/to/file.pdf` | PDF 文件 | markitdown 转 Markdown → TXT |
| `/path/to/file.epub` | EPUB 电子书 | markitdown 转 Markdown → TXT |
| `/path/to/file.docx` | Word 文档 | markitdown 转 Markdown → TXT |
| `/path/to/file.pptx` | PowerPoint | markitdown 转 Markdown → TXT |
| `/path/to/file.xlsx` | Excel | markitdown 转 Markdown → TXT |
| `/path/to/file.md` | Markdown | 直接上传 |
| `/path/to/image.jpg` | 图片OCR | markitdown OCR → TXT |
| `/path/to/audio.mp3` | 音频 | markitdown 转录 → TXT |
| `/path/to/file.zip` | ZIP 压缩包 | 解压 → markitdown 批量转换 |
| 关键词无URL无路径 | 搜索查询 | WebSearch → 汇总 → TXT |
### Step 2: 获取内容
**微信公众号**
- 使用 MCP 工具 `read_weixin_article`
- 返回title, author, publish_time, content
- 保存为 TXT`/tmp/weixin_{title}_{timestamp}.txt`
**网页/YouTube**
- 直接使用 URL 调用 `notebooklm source add [URL]`
- NotebookLM 自动提取内容
**Office 文档/电子书/PDF**
- 使用 markitdown 转换为 Markdown
- 命令:`markitdown /path/to/file.docx -o /tmp/converted.md`
- 保存为 TXT`/tmp/{filename}_converted_{timestamp}.txt`
**本地 Markdown**
- 直接上传:`notebooklm source add /path/to/file.md`
**图片OCR**
- markitdown 自动 OCR 识别文字
- 提取 EXIF 元数据
- 保存为 TXT
**音频文件**
- markitdown 自动转录语音为文字
- 提取音频元数据
- 保存为 TXT
**ZIP 压缩包**
- 自动解压到临时目录
- 遍历所有支持的文件
- 批量使用 markitdown 转换
- 合并为单个 TXT 或多个 Source
**搜索关键词**
- 使用 WebSearch 工具搜索关键词
- 汇总前 3-5 条结果
- 保存为 TXT`/tmp/search_{keyword}_{timestamp}.txt`
### Step 3: 上传到 NotebookLM
调用 `notebooklm` skill
```bash
notebooklm create "{title}" # 创建新笔记本
notebooklm source add /tmp/weixin_xxx.txt --wait # 上传文件并等待处理完成
```
**等待处理完成很重要**,否则后续生成会失败。
### Step 5: 根据意图生成内容(可选)
如果用户指定了处理意图,自动调用对应命令:
| 意图 | 命令 | 等待 | 下载 |
|------|------|------|------|
| audio | `notebooklm generate audio` | `artifact wait` | `download audio ./output.mp3` |
| slide-deck | `notebooklm generate slide-deck` | `artifact wait` | `download slide-deck ./output.pdf` |
| mind-map | `notebooklm generate mind-map` | `artifact wait` | `download mind-map ./map.json` |
| quiz | `notebooklm generate quiz` | `artifact wait` | `download quiz ./quiz.md --format markdown` |
| video | `notebooklm generate video` | `artifact wait` | `download video ./output.mp4` |
| report | `notebooklm generate report` | `artifact wait` | `download report ./report.md` |
| infographic | `notebooklm generate infographic` | `artifact wait` | `download infographic ./infographic.png` |
| flashcards | `notebooklm generate flashcards` | `artifact wait` | `download flashcards ./cards.md --format markdown` |
**生成流程**
1. 发起生成请求(返回 task_id
2. 等待生成完成(`artifact wait <task_id>`
3. 下载生成的文件到本地
4. 告知用户文件路径
## 完整示例
### 示例 1微信公众号文章 → 播客
**用户输入**
```
把这篇文章生成播客 https://mp.weixin.qq.com/s/abc123xyz
```
**执行流程**
1. 识别为微信公众号链接
2. MCP 工具抓取文章内容
3. 创建 TXT 文件
4. 上传到 NotebookLM
5. 生成播客(`generate audio`
6. 下载播客到本地
**输出**
```
✅ 微信文章已转换为播客!
📄 文章:深度学习的未来趋势
👤 作者:张三
📅 发布2026-01-20
🎙️ 播客已生成:
📁 文件:/tmp/weixin_深度学习的未来趋势_podcast.mp3
⏱️ 时长:约 8 分钟
📊 大小12.3 MB
```
### 示例 2YouTube 视频 → 思维导图
**用户输入**
```
这个视频帮我画个思维导图 https://www.youtube.com/watch?v=abc123
```
**执行流程**
1. 识别为 YouTube 链接
2. 直接传递给 NotebookLM自动提取字幕
3. 生成思维导图(`generate mind-map`
4. 下载思维导图
**输出**
```
✅ YouTube 视频已转换为思维导图!
🎬 视频Understanding Quantum Computing
⏱️ 时长23 分钟
🗺️ 思维导图已生成:
📁 文件:/tmp/youtube_quantum_computing_mindmap.json
📊 节点数45 个
```
### 示例 3搜索关键词 → 报告
**用户输入**
```
搜索 'AI发展趋势 2026' 并生成报告
```
**执行流程**
1. 识别为搜索查询
2. WebSearch 搜索关键词
3. 汇总前 5 条结果
4. 创建 TXT 文件
5. 上传到 NotebookLM
6. 生成报告(`generate report`
**输出**
```
✅ 搜索结果已生成报告!
🔍 关键词AI发展趋势 2026
📊 来源5 篇文章
📄 报告已生成:
📁 文件:/tmp/search_AI发展趋势2026_report.md
📝 章节7 个
📊 大小15.2 KB
```
### 示例 4混合多源 → PPT
**用户输入**
```
把这篇文章、这个视频和这个PDF一起做成PPT
- https://example.com/article
- https://youtube.com/watch?v=xyz
- /Users/joe/Documents/research.pdf
```
**执行流程**
1. 创建新 Notebook
2. 依次添加 3 个 Source
3. 基于所有 Source 生成 PPT
**输出**
```
✅ 多源内容已整合为PPT
📚 内容源:
1. 网页文章AI in 2026
2. YouTubeFuture of AI
3. PDFResearch Notes (12 页)
📊 PPT 已生成:
📁 文件:/tmp/multi_source_slides.pdf
📄 页数25 页
📦 大小3.8 MB
```
### 示例 5: EPUB 电子书 → 播客
**用户输入**
```
把这本电子书做成播客 /Users/joe/Books/sapiens.epub
```
**执行流程**
1. 识别为 EPUB 文件
2. markitdown 转换为 Markdown
3. 保存为 TXT
4. 上传到 NotebookLM
5. 生成播客
**输出**
```
✅ EPUB 电子书已转换为播客!
📚 电子书Sapiens: A Brief History of Humankind
📄 页数:约 450 页
📊 字数:约 15 万字
🎙️ 播客已生成:
📁 文件:/tmp/sapiens_podcast.mp3
⏱️ 时长:约 45 分钟(精华版)
📊 大小48.2 MB
```
### 示例 6Word 文档 → Quiz
**用户输入**
```
这个Markdown生成Quiz /Users/joe/notes/machine_learning.md
```
**执行流程**
1. 识别为本地 Markdown 文件
2. 直接上传到 NotebookLM
3. 生成 Quiz`generate quiz`
**输出**
```
✅ Markdown 已转换为Quiz
📄 文件machine_learning.md
📊 大小8.5 KB
📝 Quiz 已生成:
📁 文件:/tmp/machine_learning_quiz.md
❓ 题目15 道10选择 + 5简答
```
## 错误处理
### URL 格式错误
```
❌ 错误URL 格式不正确
必须是微信公众号文章链接:
https://mp.weixin.qq.com/s/xxx
你提供的链接https://example.com
```
### 文章获取失败
```
❌ 错误:无法获取文章内容
可能原因:
1. 文章已被删除
2. 文章需要登录查看(暂不支持)
3. 网络连接问题
4. 微信反爬虫拦截(请稍后重试)
建议:
- 检查链接是否正确
- 等待 2-3 秒后重试
- 或手动复制文章内容
```
### NotebookLM 认证失败
```
❌ 错误NotebookLM 认证失败
请运行以下命令重新登录:
notebooklm login
然后验证:
notebooklm list
```
### 生成任务失败
```
❌ 错误:播客生成失败
可能原因:
1. 文章内容太短(< 100 字)
2. 文章内容太长(> 50万字
3. NotebookLM 服务异常
建议:
- 检查文章长度是否适中
- 稍后重试
- 或尝试其他格式(如生成报告)
```
## 高级功能
### 1. 多意图处理
用户可以一次性指定多个处理任务:
```
这篇文章帮我生成播客和PPT https://mp.weixin.qq.com/s/abc123
```
Skill 会依次执行:
1. 生成播客
2. 生成 PPT
### 2. 自定义 Notebook
默认每篇文章创建新 Notebook也可以指定已有 Notebook
```
把这篇文章加到我的【AI研究】笔记本 https://mp.weixin.qq.com/s/abc123
```
Skill 会:
1. 搜索名为"AI研究"的 Notebook
2. 将文章添加为新 Source
3. 基于所有 Sources 生成内容
### 3. 自定义生成指令
为生成任务添加具体要求:
```
这篇文章生成播客要求轻松幽默的风格时长控制在5分钟
```
Skill 会将要求作为 instructions 传给 NotebookLM。
## 注意事项
1. **频率限制**
- 每次请求间隔 > 2 秒,避免被微信封禁
- NotebookLM 生成任务有并发限制(最多 3 个同时进行)
2. **内容长度**
- 微信文章通常 1000-5000 字适合生成播客3-8 分钟)
- 超过 10000 字的长文可能需要更长生成时间
- 少于 500 字的短文可能生成效果不佳
3. **版权遵守**
- 仅用于个人学习研究
- 遵守微信公众号的版权规定
- 生成的内容不得用于商业用途
4. **生成时间**
- 播客2-5 分钟
- 视频3-8 分钟
- PPT1-3 分钟
- 思维导图1-2 分钟
- Quiz/闪卡1-2 分钟
5. **文件清理**
- TXT 源文件保存在 `/tmp/`,系统重启后自动清理
- 生成的文件MP3/PDF/MD 等)默认保存在 `/tmp/`
- 可以指定自定义保存路径
## 相关 Skills
- `notebooklm` - NotebookLM 核心功能
- `notebooklm-deep-analyzer` - 深度分析 NotebookLM 内容
- `markitdown` - 转换其他格式文档
## 配置 MCP重要
⚠️ **第一次使用前必须配置**
编辑 `~/.claude/config.json`
```json
{
"primaryApiKey": "any",
"mcpServers": {
"weixin-reader": {
"command": "python",
"args": [
"/Users/joe/.claude/skills/anything-to-notebooklm/wexin-read-mcp/src/server.py"
]
}
}
}
```
**配置后重启 Claude Code**
## 故障排查
### 1. MCP 工具未找到
```bash
# 测试 MCP 服务器
python ~/.claude/skills/anything-to-notebooklm/wexin-read-mcp/src/server.py
# 如果报错,检查依赖
cd ~/.claude/skills/anything-to-notebooklm/wexin-read-mcp
pip install -r requirements.txt
playwright install chromium
```
### 2. NotebookLM 命令失败
```bash
# 检查认证状态
notebooklm status
# 重新登录
notebooklm login
# 验证
notebooklm list
```
### 3. 文件权限问题
```bash
# 确保临时目录可写
chmod 755 /tmp
# 测试写入
touch /tmp/test.txt && rm /tmp/test.txt
```
### 4. 生成任务卡住
```bash
# 检查任务状态
notebooklm artifact list
# 如果显示 "pending" 超过 10 分钟,取消重试
# (目前 CLI 不支持取消,需要在网页端操作)
```
## 典型使用场景
### 场景 1快速学习
```
我想学习这篇文章,帮我生成播客,上下班路上听
链接https://mp.weixin.qq.com/s/abc123
```
→ 生成 8 分钟播客,通勤时间听完
### 场景 2分享给团队
```
这篇文章不错做成PPT分享给团队
https://mp.weixin.qq.com/s/abc123
```
→ 生成 15 页 PPT直接用于团队分享
### 场景 3复习巩固
```
这篇技术文章帮我出题,想测试一下掌握程度
https://mp.weixin.qq.com/s/abc123
```
→ 生成 10 道选择题 + 5 道简答题
### 场景 4可视化理解
```
这篇文章概念比较多,画个思维导图帮我理清结构
https://mp.weixin.qq.com/s/abc123
```
→ 生成思维导图,一目了然
---
**Skill 创建时间**2026-01-25
**最后更新**2026-01-25
**版本**v1.0.0

View File

@@ -0,0 +1,218 @@
#!/usr/bin/env python3
"""
环境检查脚本 - 验证 anything-to-notebooklm skill 所有依赖
"""
import sys
import os
import json
from pathlib import Path
# 颜色输出
RED = '\033[0;31m'
GREEN = '\033[0;32m'
YELLOW = '\033[1;33m'
BLUE = '\033[0;34m'
NC = '\033[0m'
def print_status(status, message):
"""打印状态信息"""
if status == "ok":
print(f"{GREEN}{message}{NC}")
elif status == "warning":
print(f"{YELLOW}⚠️ {message}{NC}")
elif status == "error":
print(f"{RED}{message}{NC}")
else:
print(f"{BLUE} {message}{NC}")
def check_python_version():
"""检查 Python 版本"""
version = sys.version_info
version_str = f"{version.major}.{version.minor}.{version.micro}"
if version.major >= 3 and version.minor >= 9:
print_status("ok", f"Python {version_str}")
return True
else:
print_status("error", f"Python {version_str} (需要 3.9+)")
return False
def check_module(module_name, import_name=None):
"""检查 Python 模块是否已安装"""
if import_name is None:
import_name = module_name
try:
__import__(import_name)
print_status("ok", f"{module_name} 已安装")
return True
except ImportError:
print_status("error", f"{module_name} 未安装")
return False
def check_command(cmd):
"""检查命令是否可用"""
import shutil
if shutil.which(cmd):
# 尝试获取版本
import subprocess
try:
result = subprocess.run([cmd, "--version"],
capture_output=True,
text=True,
timeout=5)
version = result.stdout.split('\n')[0] if result.stdout else "unknown"
print_status("ok", f"{cmd} 已安装 ({version})")
except:
print_status("ok", f"{cmd} 已安装")
return True
else:
print_status("error", f"{cmd} 未找到")
return False
def check_mcp_config():
"""检查 MCP 配置"""
config_path = Path.home() / ".claude" / "config.json"
if not config_path.exists():
print_status("error", f"未找到 Claude 配置文件: {config_path}")
return False
try:
with open(config_path, 'r') as f:
config = json.load(f)
if "mcpServers" in config and "weixin-reader" in config["mcpServers"]:
print_status("ok", "MCP 服务器已配置")
return True
else:
print_status("warning", "MCP 服务器未配置(需要手动添加)")
return False
except Exception as e:
print_status("error", f"无法读取配置文件: {e}")
return False
def check_mcp_server():
"""检查 MCP 服务器文件"""
skill_dir = Path(__file__).parent
mcp_server = skill_dir / "wexin-read-mcp" / "src" / "server.py"
if mcp_server.exists():
print_status("ok", f"MCP 服务器文件存在")
return True
else:
print_status("error", f"MCP 服务器文件不存在: {mcp_server}")
return False
def check_notebooklm_auth():
"""检查 NotebookLM 认证状态"""
import subprocess
try:
result = subprocess.run(["notebooklm", "list"],
capture_output=True,
text=True,
timeout=10)
if result.returncode == 0:
print_status("ok", "NotebookLM 已认证")
return True
else:
print_status("warning", "NotebookLM 未认证(请运行 notebooklm login")
return False
except subprocess.TimeoutExpired:
print_status("warning", "NotebookLM 认证检查超时")
return False
except Exception as e:
print_status("error", f"NotebookLM 认证检查失败: {e}")
return False
def main():
print(f"\n{BLUE}========================================{NC}")
print(f"{BLUE} 环境检查 - anything-to-notebooklm{NC}")
print(f"{BLUE}========================================{NC}\n")
results = []
# 1. Python 版本
print(f"{YELLOW}[1/8] Python 版本{NC}")
results.append(check_python_version())
print()
# 2. 核心依赖
print(f"{YELLOW}[2/9] 核心 Python 依赖{NC}")
results.append(check_module("fastmcp"))
results.append(check_module("playwright"))
results.append(check_module("beautifulsoup4", "bs4"))
results.append(check_module("lxml"))
results.append(check_module("markitdown"))
print()
# 3. Playwright 浏览器
print(f"{YELLOW}[3/9] Playwright 可导入性{NC}")
try:
from playwright.sync_api import sync_playwright
print_status("ok", "Playwright 可以正常导入")
results.append(True)
except Exception as e:
print_status("error", f"Playwright 导入失败: {e}")
results.append(False)
print()
# 4. NotebookLM CLI
print(f"{YELLOW}[4/9] NotebookLM CLI{NC}")
results.append(check_command("notebooklm"))
print()
# 5. markitdown CLI
print(f"{YELLOW}[5/9] markitdown CLI{NC}")
results.append(check_command("markitdown"))
print()
# 6. Git 命令
print(f"{YELLOW}[6/9] Git 命令{NC}")
results.append(check_command("git"))
print()
# 7. MCP 服务器文件
print(f"{YELLOW}[7/9] MCP 服务器文件{NC}")
results.append(check_mcp_server())
print()
# 8. MCP 配置
print(f"{YELLOW}[8/9] MCP 配置{NC}")
results.append(check_mcp_config())
print()
# 9. NotebookLM 认证
print(f"{YELLOW}[9/9] NotebookLM 认证{NC}")
results.append(check_notebooklm_auth())
print()
# 总结
print(f"{BLUE}========================================{NC}")
passed = sum(results)
total = len(results)
if passed == total:
print(f"{GREEN}✅ 所有检查通过 ({passed}/{total})!环境配置完整。{NC}")
elif passed >= total * 0.8:
print(f"{YELLOW}⚠️ 大部分检查通过 ({passed}/{total}),但有些问题需要修复。{NC}")
else:
print(f"{RED}❌ 检查失败 ({passed}/{total}),请运行 install.sh 重新安装。{NC}")
print(f"{BLUE}========================================{NC}\n")
if passed < total:
print("💡 修复建议:")
print(" 1. 运行安装脚本:./install.sh")
print(" 2. 配置 MCP编辑 ~/.claude/config.json")
print(" 3. 认证 NotebookLMnotebooklm login")
print()
sys.exit(0 if passed == total else 1)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,167 @@
#!/bin/bash
# anything-to-notebooklm Skill Installer
# 自动安装所有依赖并配置环境
set -e # 遇到错误立即退出
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_NAME="anything-to-notebooklm"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} 多源内容 → NotebookLM 安装程序${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
# 1. 检查 Python 版本
echo -e "${YELLOW}[1/6] 检查 Python 环境...${NC}"
if ! command -v python3 &> /dev/null; then
echo -e "${RED}❌ 未找到 Python3请先安装 Python 3.9+${NC}"
exit 1
fi
PYTHON_VERSION=$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))')
REQUIRED_VERSION="3.9"
if [ "$(printf '%s\n' "$REQUIRED_VERSION" "$PYTHON_VERSION" | sort -V | head -n1)" != "$REQUIRED_VERSION" ]; then
echo -e "${RED}❌ Python 版本过低(当前 $PYTHON_VERSION,需要 3.9+${NC}"
exit 1
fi
echo -e "${GREEN}✅ Python $PYTHON_VERSION${NC}"
# 2. 检查并克隆 wexin-read-mcp
echo ""
echo -e "${YELLOW}[2/6] 安装 MCP 服务器...${NC}"
MCP_DIR="$SKILL_DIR/wexin-read-mcp"
if [ -d "$MCP_DIR" ]; then
echo -e "${GREEN}✅ MCP 服务器已存在${NC}"
else
echo "正在克隆 wexin-read-mcp..."
git clone https://github.com/Bwkyd/wexin-read-mcp.git "$MCP_DIR"
echo -e "${GREEN}✅ MCP 服务器克隆完成${NC}"
fi
# 3. 安装 Python 依赖
echo ""
echo -e "${YELLOW}[3/6] 安装 Python 依赖...${NC}"
# 安装 MCP 服务器依赖
if [ -f "$MCP_DIR/requirements.txt" ]; then
echo "安装 MCP 依赖..."
pip3 install -r "$MCP_DIR/requirements.txt" -q
echo -e "${GREEN}✅ MCP 依赖安装完成${NC}"
fi
# 安装 Skill 依赖(包括 markitdown
if [ -f "$SKILL_DIR/requirements.txt" ]; then
echo "安装 Skill 依赖(包括 markitdown 文件转换工具)..."
pip3 install -r "$SKILL_DIR/requirements.txt" -q
echo -e "${GREEN}✅ Skill 依赖安装完成${NC}"
echo -e "${GREEN}✅ markitdown 已安装(支持 15+ 文件格式转换)${NC}"
fi
# 4. 安装 Playwright 浏览器
echo ""
echo -e "${YELLOW}[4/6] 安装 Playwright 浏览器...${NC}"
echo "这可能需要几分钟,请耐心等待..."
if python3 -c "from playwright.sync_api import sync_playwright" 2>/dev/null; then
playwright install chromium
echo -e "${GREEN}✅ Playwright 浏览器安装完成${NC}"
else
echo -e "${RED}❌ Playwright 导入失败,请检查安装${NC}"
exit 1
fi
# 5. 检查并安装 notebooklm
echo ""
echo -e "${YELLOW}[5/6] 检查 NotebookLM CLI...${NC}"
if command -v notebooklm &> /dev/null; then
NOTEBOOKLM_VERSION=$(notebooklm --version 2>/dev/null || echo "unknown")
echo -e "${GREEN}✅ NotebookLM CLI 已安装 ($NOTEBOOKLM_VERSION)${NC}"
else
echo "正在安装 notebooklm-py..."
pip3 install git+https://github.com/teng-lin/notebooklm-py.git -q
if command -v notebooklm &> /dev/null; then
echo -e "${GREEN}✅ NotebookLM CLI 安装完成${NC}"
else
echo -e "${RED}❌ NotebookLM CLI 安装失败${NC}"
echo "请手动安装pip3 install git+https://github.com/teng-lin/notebooklm-py.git"
exit 1
fi
fi
# 6. 配置指导
echo ""
echo -e "${YELLOW}[6/6] 配置指导${NC}"
echo ""
CLAUDE_CONFIG="$HOME/.claude/config.json"
CONFIG_SNIPPET=" \"weixin-reader\": {
\"command\": \"python\",
\"args\": [
\"$MCP_DIR/src/server.py\"
]
}"
echo -e "${BLUE}📝 下一步:配置 MCP 服务器${NC}"
echo ""
echo "请编辑 $CLAUDE_CONFIG"
echo ""
echo "在 \"mcpServers\" 中添加:"
echo -e "${GREEN}$CONFIG_SNIPPET${NC}"
echo ""
echo "完整配置示例:"
echo -e "${GREEN}{
\"primaryApiKey\": \"any\",
\"mcpServers\": {
$CONFIG_SNIPPET
}
}${NC}"
echo ""
# 检查是否已配置
if [ -f "$CLAUDE_CONFIG" ]; then
if grep -q "weixin-reader" "$CLAUDE_CONFIG"; then
echo -e "${GREEN}✅ 检测到已有 weixin-reader 配置${NC}"
else
echo -e "${YELLOW}⚠️ 未检测到 weixin-reader 配置,请手动添加${NC}"
fi
else
echo -e "${YELLOW}⚠️ 未找到 Claude 配置文件,请手动创建${NC}"
fi
echo ""
echo -e "${BLUE}🔐 NotebookLM 认证${NC}"
echo ""
echo "首次使用前,请运行:"
echo -e "${GREEN} notebooklm login${NC}"
echo -e "${GREEN} notebooklm list # 验证认证成功${NC}"
echo ""
# 最终检查
echo ""
echo -e "${BLUE}========================================${NC}"
echo -e "${GREEN}✅ 安装完成!${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
echo "📦 安装位置:$SKILL_DIR"
echo ""
echo "⚠️ 重要提醒:"
echo " 1. 配置 MCP 服务器后需要重启 Claude Code"
echo " 2. 首次使用前运行 notebooklm login"
echo ""
echo "🚀 使用示例:"
echo " 把这篇文章生成播客 https://mp.weixin.qq.com/s/xxx"
echo ""

View File

@@ -0,0 +1,71 @@
#!/bin/bash
# 打包 anything-to-notebooklm skill 用于分享
# 生成一个不包含大文件的精简版 tar.gz
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_NAME="anything-to-notebooklm"
OUTPUT_DIR="${1:-$HOME/Desktop}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT_FILE="$OUTPUT_DIR/${SKILL_NAME}_${TIMESTAMP}.tar.gz"
# 颜色
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m'
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} 打包 ${SKILL_NAME} Skill${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
# 要打包的文件列表
FILES=(
"SKILL.md"
"README.md"
"install.sh"
"check_env.py"
"requirements.txt"
".gitignore"
)
# 创建临时目录
TEMP_DIR=$(mktemp -d)
TEMP_SKILL="$TEMP_DIR/$SKILL_NAME"
mkdir -p "$TEMP_SKILL"
echo "📦 正在打包文件..."
# 复制文件
for file in "${FILES[@]}"; do
if [ -f "$SKILL_DIR/$file" ]; then
cp "$SKILL_DIR/$file" "$TEMP_SKILL/"
echo "$file"
fi
done
# 创建 tar.gz
cd "$TEMP_DIR"
tar -czf "$OUTPUT_FILE" "$SKILL_NAME"
# 清理
rm -rf "$TEMP_DIR"
# 显示结果
FILE_SIZE=$(du -h "$OUTPUT_FILE" | cut -f1)
echo ""
echo -e "${GREEN}✅ 打包完成!${NC}"
echo ""
echo "📦 文件:$OUTPUT_FILE"
echo "📊 大小:$FILE_SIZE"
echo ""
echo "📤 分享说明:"
echo " 用户收到文件后,执行:"
echo " cd ~/.claude/skills/"
echo " tar -xzf ${SKILL_NAME}_${TIMESTAMP}.tar.gz"
echo " cd ${SKILL_NAME}"
echo " ./install.sh"
echo ""
echo "💡 注意wexin-read-mcp 会在安装时自动克隆,无需打包"
echo ""

View File

@@ -0,0 +1,11 @@
# Core MCP dependencies
fastmcp>=0.1.0
playwright>=1.40.0
beautifulsoup4>=4.12.0
lxml>=4.9.0
# File format conversion
markitdown[all]>=0.0.1
# NotebookLM (will be installed from PyPI if available, or from git)
# notebooklm-py