全部技能 / 内容创作 / notebooklm-skill
内容创作 · PleasePrompto/notebooklm-skill

notebooklm-skill

Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automation, library management, persistent auth. Drastically reduced hallucinations through document-only responses.

风险提醒:红色 · 谨慎使用AI 侦查报告
作者 PleasePromptoGitHub PleasePrompto/notebooklm-skill ↗Stars 7772许可 MIT(仓库根 LICENSE:L1 'MIT License'、L3 'Copyright (c) 2025 Please Prompto!')commit c80722d3f2
agent 宿主通常会约束 skill 执行权限;风险提醒为 AI 侦查观点,不构成质量或安全保证。第三方 skill 仅作拆解与展示,安装使用风险自负,版权归原作者。

1实现原理 · 为什么它能做到

用 patchright(Playwright 的反检测分支)启动**真实 Chrome 的持久化用户目录**,而不是临时浏览器实例——这是它能在多次调用间保持『已登录』的基础。

scripts/browser_utils.py
channel="chrome", # Use real Chrome
注:同一次调用传入 user_data_dir=user_data_dir、ignore_default_args=["--enable-automation"]、user_agent=USER_AGENT、args=BROWSER_ARGS;profile 目录为 <skill>/data/browser_state/browser_profile(config.py 的 BROWSER_PROFILE_DIR)。

认证阶段打开可见浏览器等人工登录,然后把 cookies + localStorage 落盘成 state.json——整条链路的凭证就是这份文件,不是 API key。

scripts/auth_manager.py
context.storage_state(path=str(self.state_file))
注:state_file = <skill>/data/browser_state/state.json(config.py:13);登录等待靠 URL 正则 + 10 分钟超时(LOGIN_TIMEOUT_MINUTES = 10)。

运行时把 state.json 里的 cookies 手工注入浏览器上下文,用来绕过 Playwright『session cookie 不写入 user_data_dir』的已知缺陷。

scripts/browser_utils.py
context.add_cookies(state['cookies'])
注:launch_persistent_context 内部固定调用 _inject_cookies;读取失败只打印告警不中断。AUTHENTICATION.md 的代码示例里把这一步标注为 `# ← Workaround for session cookies!`。

每次提问都是『一问一浏览器』:新建页面 → 打开用户给的 notebook URL → DNS 级白名单等待(只允许回到 notebooklm.google.com 域,用于确认没被踢到登录页)。

scripts/ask_question.py
page.goto(notebook_url, wait_until="domcontentloaded")
注:紧接 page.wait_for_url(re.compile(r"^https://notebooklm\.google\.com/"), timeout=10000);SKILL.md 与 README 都自述 'Each question opens a fresh browser session',超时上限 120s(QUERY_TIMEOUT_SECONDS = 120)。

问题文本用『人化输入』逐字符敲进 textarea,选择器三级回退(含德语 aria-label),输入框定位失败则整条链路失败。

scripts/config.py
"textarea.query-box-input", # Primary
注:回退项为 'textarea[aria-label="Feld für Anfragen"]'(德语文案)与 'textarea[aria-label="Input for queries"]'(英文);实际提交是键盘 Enter。

取答案靠轮询稳定性判定:等 `div.thinking-message` 消失,取响应容器最后一个元素的文本,需连续多次相同才认为回答结束。

scripts/ask_question.py
thinking_element = page.query_selector('div.thinking-message')
注:响应容器选择器为 `.to-user-container .message-text-content`(config.py:25),取 elements[-1].inner_text().strip() 后要求 stable_count >= 3 且未超过 120s deadline。

脚本在答案文本后强制拼接一段面向 Claude 的祈使句再返回 stdout,形成『必须继续追问』的闭环。

scripts/ask_question.py
return answer + FOLLOW_UP_REMINDER
注:FOLLOW_UP_REMINDER 自述来源是改自 MCP server 的 stateless 版本;SKILL.md 的 Follow-Up Mechanism 章节进一步规定 Claude 必须 STOP / ANALYZE / IDENTIFY GAPS / ASK FOLLOW-UP。

run.py 是官方唯一推荐入口:缺 .venv 时先用系统 Python 跑 setup_environment.py 自举,再用 venv 解释器执行目标脚本。

scripts/run.py
result = subprocess.run([sys.executable, str(setup_script)])
注:随后 cmd = [str(venv_python), str(script_path)] + script_args 并 subprocess.run(cmd);setup_environment.py 内执行 `pip install -r requirements.txt` 与 `python -m patchright install chrome`。

notebook 库是纯本地 JSON 元数据(url/name/description/topics/use_count),没有向量库或内容缓存——『接地』实际发生在 Google 侧,不在本地。

scripts/notebook_manager.py
self.library_file = self.data_dir / "library.json"
注:data_dir 由 Path(__file__).parent.parent / 'data' 推导;_save_library 用 json.dump(data, f, indent=2) 落盘。

2核心能力

01向指定 NotebookLM notebook 提问并取回 Gemini 的回答文本
02Google 登录一次后长期复用(持久化 profile + state.json cookie 注入)
03多 notebook 库管理(增/删/检索/激活/统计,存本机 library.json)
04环境自举:自建 .venv、装依赖、下载 Chrome 二进制
05反检测交互(逐字符输入 + 随机延时 + 关闭自动化特征)
06本机数据清理(可保留 library,且永不删除 .venv)

3外部依赖

类型依赖
networkGoogle NotebookLM 站点(浏览器自动化目标)
network提问页 URL 白名单校验(确认未被重定向去登录)
networkGoogle 账号登录态判定(字符串检测,非主动请求)
packagepatchright(Playwright 反检测分支,浏览器自动化核心)
packagepython-dotenv(声明为依赖,但代码从未使用)
clipip 安装依赖(走默认 PyPI)
cli下载安装 Google Chrome 二进制
cli另一条安装路径装的是 chromium(与上一条不一致)

4风险提醒 风险提醒:红色 · 谨慎使用

风险提醒:红色 · 谨慎使用
  • 凭证以明文文件形态落盘,且是完整 Google 会话 cookie — data/browser_state/state.json 由 `context.storage_state()` 写出,包含 cookies 与 localStorage;运行期又被 add_cookies 读回注入。文件权限依赖本机 umask,无加密、无过期策略;任何能读该目录的进程(含同机其它 agent 会话)都可复用你的 Google 登录态。
  • 刻意规避自动化识别 + 关闭浏览器沙箱 — 启动参数含 `--disable-blink-features=AutomationControlled`(注释直书 Patches navigator.webdriver)与 `--no-sandbox`,依赖为反检测分支 patchright。这既可能违反目标站点的自动化条款,也意味着浏览器进程在没有沙箱隔离的情况下加载不可信网页内容。
  • 首次运行即自动安装与下载(供应链面) — scripts/__init__.py 在导入期执行 `ensure_venv_and_run()`:建 venv、`pip install -q -r requirements.txt`、下载 Chromium;依赖只有版本 pin、无 hash 校验,且 run.py 会以 venv 解释器执行传入的任意脚本路径。
  • 外部网页文本未经边界声明即进入模型上下文 — `return answer + FOLLOW_UP_REMINDER` 把 NotebookLM 页面纯文本原样交给宿主;notebook 内的文档内容(可能来自第三方)因此获得指令级可信度,SKILL.md 的追询机制还会推动模型据此继续行动。
  • 仓库已归档停止维护,且实现与文档多处不符 — README:'This project is no longer maintained … the repository is archived: no updates, bug fixes or support. It may stop working when the upstream services change.';同时 citation-backed 无实现、.env 配置仅有文档、Chrome/Chromium 路径冲突、数据路径文档与实际不一致。
  • 选择器脆弱且含德语回退,NotebookLM 前端一变即全链路失败 — config.py 主选择器为 `textarea.query-box-input`,回退项分别为德语 'Feld für Anfragen' 与英语 'Input for queries' 的 aria-label;响应容器同样硬编码 `.to-user-container .message-text-content`,无版本探测或自愈。
🔴 红色:谨慎使用。按统一分档,本 skill 同时命中三条红色特征且都有源码证据:①反反爬/绕过自动化识别——依赖 patchright(requirements.txt 注释写明 'Core browser automation with anti-detection')并传入 `'--disable-blink-features=AutomationControlled', # Patches navigator.webdriver`,即以掩盖自动化特征为目的启动浏览器;②安全降级——同一 BROWSER_ARGS 里带 `'--no-sandbox'`,在无沙箱状态下运行浏览器;③凭证接触——认证产物是包含 Google 会话 cookie 的 data/browser_state/state.json,运行期由代码主动读回并注入浏览器上下文(.gitignore 自述该目录 'contains auth and personal notebooks')。此外首次运行会在导入期自动建 venv、从 PyPI 装依赖并下载 Chrome 二进制。这些是能力设计使然(要驱动一个只提供网页界面的 Google 产品,只能走浏览器),不是隐藏行为,但用户需明确知晓:登录态被明文落盘、浏览器被刻意伪装成非自动化、沙箱被关闭。

5第二遍独立确认

  • [ok] skill.path = '.'(根级 SKILL.md) — 重读 SKILL.md L1-4 确认 frontmatter 位于仓库根文件;glob 根 *.json 无命中(无 plugin.json / marketplace.json),故技能入口就是仓库根。
  • [ok] official_desc 逐字 — 重读 SKILL.md L2-4:name: notebooklm、description 为单行完整句,与 README L15 的同一句(README 用连字符 'Drastically reduced hallucinations - answers only from your uploaded documents.')措辞略异,已按 frontmatter 原文收录。
  • [ok] 混合认证机制(persistent profile + state.json 注入) — 重读 browser_utils.py(launch_persistent_context 与 `context.add_cookies(state['cookies'])`)与 auth_manager.py(`context.storage_state(path=str(self.state_file))`),行号与首遍一致;AUTHENTICATION.md 的说明标注的脚本行号与实码相差数行(文档漂移),机制描述本身正确。
  • [ok] 安全结论:反检测与沙箱关闭 — 重读 config.py 的 BROWSER_ARGS 列表:`'--disable-blink-features=AutomationControlled', # Patches navigator.webdriver` 与 `'--no-sandbox',` 逐字确认;重读 requirements.txt 首段注释确认 'anti-detection' 表述与 patchright pin。三条红色判据均在源码可定位。
  • [ok] 安全结论:凭证读取范围 — 独立重扫 os.environ|getenv|API_KEY|token|keychain|.env|ssh|credentials:scripts 下零命中(唯二 token 字样在 requirements.txt 与文档中的 python-dotenv)。凭证只有 state.json 里的 Google cookie,路径由 config.py 常量推导,无 ~/.claude 硬编码。
  • [ok] 安全结论:网络外发范围 — 重扫 requests|urllib|socket|http.client 于 scripts:零命中;网络只经浏览器(notebooklm.google.com / accounts.google.com)、pip(PyPI)与 patchright 下载 Chrome(域名不可定位,已记入 unlocated)。
  • [ok] 安全结论:写盘与删除边界 — 重读 auth_manager、notebook_manager、cleanup_manager、__init__ 的写路径:state.json / auth_info.json / library.json / .venv,全部位于 <skill>/data 与 <skill>/.venv;删除限定在 data/ 且显式排除 .venv(`Virtual environment (.venv) is never deleted`)。
  • [discrepancy] 宣称 vs 实际:citation-backed — 脚本内无任何 citation/来源条目的解析代码,唯一取数路径是响应容器最后一元素的 inner_text;README L65 与 SKILL.md 的 citation 表述实际描述的是 NotebookLM/Gemini 侧行为,本 skill 只做纯文本透传,不能保证引用随答案回到模型上下文。

6结论

  • 把『用网页版产品做接地问答』这件事做成了可复用命令行流水线,问答、库管理、认证、环境自举、清理都有独立可执行入口
  • 认证体验做到了『登录一次长期可用』,且把已知的 Playwright cookie 缺陷显式绕过并写进文档
  • 答案来源被限定在用户自己的文档集合,确实能压低幻觉——这是它相对通用联网检索的核心卖点
  • 本机数据边界清楚:写入集中在 data/ 与 .venv,清理工具显式排除 .venv,且删除需要 --confirm 与交互确认
  • 适合:适合已经在用 Google NotebookLM 管理资料、希望在自己的 coding agent 会话里直接向 notebook 提问(要求答案只来自自身上传文档)的个人研究者与内容工作者;也适合研究『浏览器自动化 + 持久登录』这套模式的开发者作为参考实现(认证、cookie 注入、答案轮询稳定性判定都有清晰可读的代码)。使用前提是接受把 Google 登录态落盘在本机、并自行承担网页自动化带来的账号风险。
    不适合:不适合对账号安全敏感或处于受管环境的场景——它会让浏览器进入反检测模式、关闭沙箱,并在磁盘留存完整会话 cookie。不适合需要稳定长期运行的流水线:仓库已归档、选择器硬编码、上游页面一改就可能整体失效。不适合需要审计留痕或可复现引用的场景(citation 只在文档层面宣称,脚本不解析来源)。不适合期望『本地 RAG』的用户:接地发生在 Google 侧,本机只存 notebook 元数据,没有内容索引或向量库。
    安装 agent 直装可复制
    ① 本站镜像 更新 2026-09-15
    方式 A · 人下载镜像包下载 notebooklm-skill.tar.gz
    sha256: edda31a0efaa9b1c…
    方式 B · JSON 格式安装指南,复制给 agent
    安装指南
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② 上游 GitHub · 原始来源
    能访问 GitHub?直接去上游安装(实时版,可能已更新)GitHub 原始 ↗
    本页镜像锁定 commit c80722d3f2;上游为实时仓库。
    来源信息 GitHub 原始
    作者 / 仓库PleasePrompto / PleasePrompto/notebooklm-skill
    Stars7772
    最近推送2026-09-10
    本 skill commitc80722d3f2
    许可MIT(仓库根 LICENSE:L1 'MIT License'、L3 'Copyright (c) 2025 Please Prompto!')
    本站信息
    收录日期2026-09-06
    分类内容创作
    侦查报告AI 侦查 · 2 遍 · 2026-09-06
    本站镜像与 GitHub 原始是不同来源:本站锁定 commit 快照经 /r2 分发;GitHub 为实时上游,内容可能已更新。
    同分类邻近