1实现原理 · 为什么它能做到
本体是「巨型 SKILL.md 路由表 + 少量自有脚本 + 大量外部 CLI/MCP」的组合:SKILL.md 用输入特征表把 15+ 类内容源映射到不同的取内容通道,再把统一的上传/生成委托给 notebooklm CLI。
| `https://mp.weixin.qq.com/s/` | 微信公众号 | MCP 工具抓取 |
自带 CLI(main.py)的覆盖面远小于 SKILL.md 宣称:代码只处理 epub / document / podcast / x_twitter / url 五类,其余类型直接报「不支持的输入类型」。
不支持的输入类型: {input_type}
播客/B站转写走 Get笔记(得到)三套 API:OpenAPI 建链接笔记 → 轮询任务进度(最多 40×30s)→ Web API 取全文,最后落 TXT。
for i in range(40):
X/Twitter 与付费墙网页靠 fetch_url.sh 的级联:先用第三方代理服务(r.jina.ai、defuddle.md)换 Markdown,失败再伪装 Googlebot/Bingbot UA 与 X-Forwarded-For、Referer、AMP、JSON-LD,最后 archive.today / Google Cache / npx agent-fetch。
# 1a. r.jina.ai — wide coverage, preserves image links, often bypasses paywalls
抓到的内容统一交给外部 notebooklm CLI(notebooklm-py)完成上传与生成,本仓不实现 NotebookLM 协议。
['notebooklm', 'create', title],
深度分析模式是固定模板的三轮递进提问(4+5+3=12 问,或 SKILL.md 里写的 10 问),逐问调 notebooklm ask、每次间隔 1.5 秒,结果落 /tmp/*_analysis.json。
- 第一轮(4题):建立整体认知框架
可选产物「飞书文档」不是自己调 API,而是委托外部 lark-cli:把问答格式化成 Markdown 后执行 lark-cli docs +create。
['lark-cli', 'docs', '+create', '--title', title, '--markdown', markdown_content],
微信公众号抓取依赖另一个仓库的 MCP 服务器(Playwright 浏览器模拟),install.sh 会在 skill 目录内 git clone 它,并要求用户手改 Claude 配置。
git clone https://github.com/Bwkyd/wexin-read-mcp.git "$MCP_DIR"
另附一个与本 Skill 主流程无直接耦合的飞书读 MCP 子包(FastMCP + Playwright),提供 read_feishu_doc / get_doc_info 两个工具。
mcp = FastMCP("feishu-reader")
YouTube 被列为「最重要」的特殊规则:直接传 URL 给 NotebookLM,禁止任何本地字幕下载/转写手段。
- **禁止**使用 yt-dlp、yt-search-download、whisper、浏览器自动化等手段下载字幕
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | notebooklm(notebooklm-py CLI) |
| cli | python3 ≥ 3.9 |
| cli | git |
| cli | curl |
| cli | markitdown(Microsoft) |
| cli | lark-cli(飞书文档 CLI) |
| cli | npx(agent-fetch 兜底) |
| api | Get笔记 / 得到(笔记与转写) |
| api | NotebookLM(Google) |
| network | 第三方抓取代理/存档 |
| network | 被绕过站点(付费墙/社交) |
| network | 飞书(读取:Playwright 浏览器抓文档;写入:lark-cli) |
| network | 微信公众号(经外部 MCP) |
| package | Python 依赖(MCP 与转换链) |
| package | pip 直装 git 源 |
4风险提醒 风险提醒:红色 · 谨慎使用
- 付费墙绕过与浏览器模拟是核心能力,属访问控制规避 — fetch_url.sh 伪装搜索引擎 UA/XFF/Referer、走 AMP 与 archive.today;微信/飞书用 Playwright 无头浏览器(--no-sandbox)绕过反爬与登录墙。法律/ToS 风险由使用者承担,README 只写『仅限个人学习研究』。
- 凭证面分散且含 token 文件写回 — GETNOTE_API_KEY/GETNOTE_CLIENT_ID 来自环境变量,~/.claude/skills/getnote/tokens.json 会被读取并在刷新后覆写;任何继承同一环境的子进程都能拿到这些值。
- 被抓 URL 会被交给第三方代理 — r.jina.ai、defuddle.md、archive.today 都会收到完整目标 URL(乃至页面内容),对敏感或内网可达链接是信息外泄面。
- 供应链与自检盲区 — install.sh 用 pip 从 git+github 直装 notebooklm-py、npx 首次运行会拉 agent-fetch、并从第三方仓库克隆 MCP;自带的 feishu-read-mcp 因缺少 Optional 导入实际无法启动,而 check_env.py 检查的是另一个不存在的目录,自检给不出可信结论。
- 文档与实现多处漂移,误导使用与排障 — 内容源编号重复、深度分析问题数 10/12 不一、6 级级联有 2 级不可达、仓库结构图列出不存在目录——按文档排障会走进死路。
- 内容正文原样进上下文,无来源可信度分级 — 抓回的网页/推文/转录文本直接交给模型(含后续上传 NotebookLM),页面内的指令性文本构成 prompt injection 面,SKILL.md 未给防护约定。
5第二遍独立确认
- [ok] skill.path 定位与 commit 一致性 — 单 skill 仓库,SKILL.md 在仓库根,故 path='.';工作副本 HEAD cea6ceee8cdcd01a573af5ae75c2d3cffc20650b,任务表 pin cea6ceee8cdc,PINS-b2.json 记 {dir: qiaomu-anything-to-notebooklm, commit: cea6ceee8cdc}。
- [discrepancy] SKILL.md 宣称的内容源 vs main.py 实际覆盖 — SKILL.md/README 宣称 15+ 类源;main.py 的 main() 只有 epub/document/podcast/x_twitter/url 五个分支,其余(微信、图片、音频、Office、ZIP、搜索)不在本仓代码内,靠外部 MCP 与宿主工具完成。「不支持的输入类型」是代码里的真实兜底分支。
- [discrepancy] README 结构图与实际文件树 — README 项目结构图与 SKILL.md 前置条件都列 wexin-read-mcp/(并给出 <skill>/wexin-read-mcp/src/server.py 的配置路径),但本 pin 仓库内不存在该目录(ls 报 No such file or directory),只有名称不同的 feishu-read-mcp/。该目录只在用户执行 install.sh 后由 git clone 产生;check_env.py 也检查这个不存在的路径。
- [discrepancy] fetch_url.sh 的『6 层级联』是否真的可走完 — 第 4 级 archive.today 之后为无条件 `exit 75`(脚本在这里结束进程),Level 5(Google Cache)与 Level 6(agent-fetch)在代码上不可达;README 的『6 层级联』流程图因此比实际执行多两级。exit 75 的设计意图是让调用方去浏览器解 CAPTCHA 后重试,属有意为之,但副作用未在文档说明。
- [discrepancy] feishu-read-mcp/src/server.py 是否可运行 — 该文件使用 `cookies_str: Optional[str] = None` 标注,但全文只 import sys / pathlib.Path / fastmcp / logging,没有 from typing import Optional——注解在函数定义时求值,导入即 NameError。本仓不含该服务器的测试,check_env.py 也不检查它(只查 wexin-read-mcp)。
- [ok] 『13 项环境检查』是否属实 — check_env.py 累加结果共 13 项:Python 版本 1 + 核心模块 5(fastmcp/playwright/bs4/lxml/markitdown)+ Playwright 导入 1 + notebooklm/markitdown/git 三个 CLI 3 + MCP 文件 1 + MCP 配置 1 + NotebookLM 认证 1;与 README 的『13 项环境检查』一致。
- [discrepancy] 深度分析问题数(SKILL.md 10 问 vs main.py / README 12 问) — SKILL.md 意图映射表写「自动生成10个问题并递归提问」、Step 4 的示例 JSON 也写 total_questions: 10;而 main.py 的模板是 4+5+3=12 问,README 场景 3 同样写「生成 12 个问题」(Step 4 另一处又是 10 问)。同一文档内自相矛盾。
- [discrepancy] SKILL.md 章节编号连续性与内容重复 — 『支持的内容源』下出现两个 5(付费墙、YouTube)、两个 4(Office 文档、播客/音频平台)、两个 5(播客/音频平台、电子书与文档),编号重复且与 README 的 15+ 计数对不上;YouTube 与付费墙内容还被重复叙述一次(含一段孤立的绕过策略 5 条列表挂在 YouTube 规则下)。
6结论
8f32da1fd86d07e0…cea6ceee8c