notebooklm-py

库

teng-lin/notebooklm-py

Google NotebookLM 的非官方 Python 接口与命令行工具。

项目简介

提供对 NotebookLM 的全面程序化访问,支持批量下载、播客生成和 AI 代理集成。可用于 Python、命令行及 Claude Code 等智能体。

README 预览

# notebooklm-py\n\n  \n\n\n**A Comprehensive NotebookLM Skill & Unofficial Python API.** Full programmatic access to NotebookLM's features—including capabilities the web UI doesn't expose—via Python, CLI, and AI agents like Claude Code, Codex, and OpenClaw.\n\n[](https://pypi.org/project/notebooklm-py/)\n[](https://pypi.org/project/notebooklm-py/)\n[](https://opensource.org/licenses/MIT)\n[](https://github.com/teng-lin/notebooklm-py/actions/workflows/test.yml)\n\n  \n\n\n**Source & Development**: \n\n> **⚠️ Unofficial Library - Use at Your Own Risk**\n>\n> This library uses **undocumented Google APIs** that can change without notice.\n>\n> - **Not affiliated with Google** - This is a community project\n> - **APIs may break** - Google can change internal endpoints anytime\n> - **Rate limits apply** - Heavy usage may be throttled\n>\n> Best for prototypes, research, and personal projects. See [Troubleshooting](docs/troubleshooting.md) for debugging tips.\n\n## What You Can Build\n\n🤖 **AI Agent Tools** - Integrate NotebookLM into Claude Code, Codex, and other LLM agents. Ships with a root [NotebookLM skill](SKILL.md) for GitHub and `npx skills add` discovery, local `notebooklm skill install` support for Claude Code and `.agents` skill directories, and repo-level Codex guidance in [`AGENTS.md`](AGENTS.md).\n\n📚 **Research Automation** - Bulk-import sources (URLs, PDFs, YouTube, Google Drive), run web/Drive research queries with auto-import, and extract insights programmatically. Build repeatable research pipelines.\n\n🎙️ **Content Generation** - Generate Audio Overviews (podcasts), videos, slide decks, quizzes, flashcards, infographics, data tables, mind maps, and study guides. Full control over formats, styles, and output.\n\n📥 **Downloads & Export** - Download all generated artifacts locally (MP3, MP4, PDF, PNG, CSV, JSON, Markdown). Export to Google Docs/Sheets. **Features the web UI doesn't offer**: batch downloads, quiz/flashcard export in multiple formats, mi

常见问题 (5)

故障排除
运行 notebooklm-py 0.8.5 时出现 "ModuleNotFoundError: No module named 'typing_extensions'" 错误,如何修复?

notebooklm-py 0.8.5 在运行时会导入 typing_extensions,但未将其声明为依赖项,因此通过 pipx/uv/mise 进行的全新安装在启动时会崩溃。临时解决方案:将 typing_extensions 安装到同一个隔离环境中,例如 pipx inject notebooklm-py typing_extensions 或 uv pip install --python <notebooklm-py venv>/bin/python typing_extensions。永久修复:升级到包含 PR #2500 的版本,该 PR 将 typing_extensions 声明为无条件依赖项,并添加了针对全新安装的 CI 检查。

来源 Issue #2499
故障排除
如何将重复的循环亲和性代码重构为可重用的Python mixin?

创建一个 LoopBoundPrimitive 基类,其中包含一个 set_bound_loop 方法,用于存储循环,并且仅在循环实际发生变化时触发钩子 _on_loop_rebind(old_loop, new_loop)。子类可以重写该钩子以实现“重绑定时清除”的行为。这将在多个组件中统一管理重复的记录工作。示例:src/notebooklm/_loop_bound.py。

来源 Issue #1332
故障排除
如何修复在 Windows 上进行 notebooklm master-token 登录时调用 context.close() 出现的 TargetClosedError?

在 Windows 上的 notebooklm-py 0.8.5 中,notebooklm login --master-token --browser chrome 能够成功捕获 oauth_token,但 src/notebooklm/_browser/oauth_token.py 中的清理逻辑在 finally 代码块内的 context.close() 处抛出 TargetClosedError(因为 Chrome 已经自行关闭)。该异常从 finally 中逃逸,导致已捕获的 token 被丢弃,master_token.json 从未被写入。临时解决方法:给 oauth_token.py 打补丁,将 page.close()、context.close() 和 browser_obj.close() 分别用 try/except Exception: pass 包裹,然后重新运行登录命令——此时应该会报告 Master-token login OK。永久修复已在 PR #2522 中;待其合并/发布后,请升级 notebooklm-py,而不要继续保留本地补丁。

来源 Issue #2521
故障排除
如何防止 headless 重新认证用过期的 Google SID cookie 覆盖 storage_state.json?

这是因为 Google 现在对 notebook.google.com 的 GET / 请求返回 HTTP 200 的未登录着陆页,而捕获逻辑仅检查浏览器是否位于应用主机上且拥有 URL 作用域的 SID cookie。因此,过期的 SID 会通过验证并覆盖 storage_state.json。

临时解决方法:禁用无头重新认证,使过期的浏览器配置文件无法被捕获:

unset NOTEBOOKLM_HEADLESS_REAUTH
# or
export NOTEBOOKLM_HEADLESS_REAUTH=0

同时确保 allow_headless=False,然后恢复有效的 storage_state.json 或重新进行身份验证。

代码修复:在 src/notebooklm/_browser/browser_capture.py 中,更新 _settle_capture_candidate/_captured_sid_is_usable 附近的无头路径以及 CDP 路径,使其在写入存储之前验证会话活性。可以要求捕获的应用页面上存在 SNlM0e 令牌,或者执行 /login 重定向检查:活跃会话会重定向回应用,而未登录会话会跳转到 accounts.google.com。验证失败时,调用与无 SID 捕获相同的拒绝路径(例如 _refuse_incomplete_capture),并保留现有的身份验证状态。添加一个回归测试,在浏览器上下文中使用无令牌的应用着陆页和过期的 SID。

来源 Issue #2482
故障排除
为什么 notebooklm-py 在查找包含土耳其大写字母 İ 的笔记本标题时会失败?

这是一个已知 bug(影响 main @ 1d8920f、MCP 的 _resolve_by_title 和 _normalize_for_match):str.casefold() 会将 'İ'(U+0130)转换为两个字符,即 'i' + U+0307(组合用上方点),因此像 istanbul 这样的小写查询永远无法匹配折叠后的标题 İstanbul notları,从而抛出 NotebookNotFoundError。临时解决方法:输入标题时使用其原始的精确字符,包括大写的 'İ'(例如,查询 İstanbul 而不是 istanbul)——精确字符查询能够匹配,因为两侧的折叠结果完全相同。永久修复:在规范化过程中去除组合标记,例如在 _normalize_for_match 中使用 unicodedata.normalize('NFKD', s),并在 casefold() 之前/之后移除 unicodedata.combining(c) 为真的字符,这样 'İ' 就会折叠为普通的 'i'。

来源 Issue #2476