内容
# notebooklm-go
一款非官方的Go客户端,用于 [Google NotebookLM](https://notebooklm.google.com/)。
> **免责声明:** 该项目使用未公开的Google API,可能会在未通知的情况下发生变化。请仅用于原型设计、研究和个人项目,而不是生产系统。
## 功能
* **笔记本管理** — 列出、创建、重命名、删除、描述
* **来源管理** — 添加URL、YouTube视频、PDF、文本、Google Drive文件
* **工件生成** — 音频概述、视频概述、报告、测验、闪存卡、信息图表、幻灯片、数据表、思维导图
* **聊天** — 提问并获取引用,配置角色和响应样式
* **共享** — 公共/私有链接,用户级权限
* **研究** — 快速深入的网络研究,支持来源导入
* **设置** — 输出语言配置
***
## 安装
### 先决条件
* Go 1.22+
* 具有访问 [notebooklm.google.com](https://notebooklm.google.com/) 权限的Google账户
### 安装CLI
```bash
go install github.com/saeedata/notebooklm-go/cmd/notebooklm@latest
```
或者克隆并手动构建:
```bash
git clone https://github.com/saeedata/notebooklm-go
cd notebooklm-go
go build -o notebooklm ./cmd/notebooklm/
```
### 作为Go库使用
```bash
go get github.com/saeedata/notebooklm-go
```
***
## 身份验证
身份验证需要从浏览器导出Google会话cookie。有两种方法:
### 方法1:Playwright存储状态(推荐)
1. 安装Node.js和Playwright:
```bash
npm install -g playwright
playwright install chromium
```
1. 在登录到NotebookLM后导出会话:
```bash
npx playwright codegen --save-storage ~/.notebooklm/storage_state.json https://notebooklm.google.com/
```
登录时浏览器打开,然后关闭。cookie会自动保存。
1. 验证:
```bash
notebooklm notebook list
```
### 方法2:环境变量(CI/CD友好)
设置`NOTEBOOKLM_AUTH_JSON`为存储状态JSON的内容 - 不需要文件:
```bash
export NOTEBOOKLM_AUTH_JSON='{"cookies":[{"name":"SID","value":"...","domain":".google.com",...}]}'
notebooklm notebook list
```
### 自定义存储路径
```bash
notebooklm --storage /path/to/storage_state.json notebook list
```
***
## CLI用法
### 笔记本
```bash
# 列出所有笔记本
notebooklm notebook list
# 创建笔记本
notebooklm notebook create "我的研究"
# 获取笔记本详情
notebooklm notebook get <notebook-id>
# 重命名
notebooklm notebook rename <notebook-id> "更好的标题"
# 删除
notebooklm notebook delete <notebook-id>
# AI生成的摘要 + 建议的主题
notebooklm notebook describe <notebook-id>
```
### 来源
```bash
# 列出笔记本中的来源
notebooklm source list -n <notebook-id>
# 添加网页URL
notebooklm source add-url -n <notebook-id> https://example.com
# 添加YouTube视频
notebooklm source add-url -n <notebook-id> https://youtu.be/dQw4w9WgXcQ
# 添加粘贴文本
notebooklm source add-text -n <notebook-id> "我的标题" "内容如下..."
# 上传文件(PDF,TXT,MD,DOCX)
notebooklm source add-file -n <notebook-id> ./paper.pdf
# 删除来源
notebooklm source delete -n <notebook-id> <source-id>
```
### 工件(音频,视频,报告等)
```bash
# 列出工件
notebooklm artifact list -n <notebook-id>
# 生成音频概述(Deep Dive播客格式)
notebooklm artifact audio -n <notebook-id>
# 生成并等待完成,然后下载
notebooklm artifact audio -n <notebook-id> --wait --output podcast.mp4
# 自定义指令和语言
notebooklm artifact audio -n <notebook-id> \
--instructions "关注实用应用" \
--language es \
--wait --output podcast_es.mp4
# 下载已完成的工件
notebooklm artifact download -n <notebook-id> <artifact-id> ./output.mp4
# 删除工件
notebooklm artifact delete -n <notebook-id> <artifact-id>
```
### 聊天
```bash
# 提问
notebooklm chat ask -n <notebook-id> "关键主题是什么?"
# 提问时仅使用特定来源
notebooklm chat ask -n <notebook-id> \
--source <source-id-1> --source <source-id-2> \
"总结这两篇论文"
# 输出为JSON(包括引用)
notebooklm chat ask -n <notebook-id> --json "主要论点是什么?"
```
### 设置
```bash
# 获取当前设置
notebooklm settings get
# 设置输出语言(BCP 47代码)
notebooklm settings set-language es
notebooklm settings set-language ja
```
### 全局标志
```bash
--json # 输出所有结果为格式化JSON
--storage PATH # 自定义storage_state.json路径
```
***
## Go库用法
### 快速入门
```go
package main
import (
"context"
"fmt"
"log"
notebooklm "github.com/saeedata/notebooklm-go"
)
func main() {
ctx := context.Background()
// 从存储状态创建客户端
client, err := notebooklm.NewClientFromStorage(ctx, "")
if err != nil {
log.Fatal(err)
}
// 创建笔记本
nb, err := client.Notebooks.Create(ctx, "我的研究")
if err != nil {
log.Fatal(err)
}
fmt.Printf("已创建:%s (%s)\n", nb.Title, nb.ID)
// 添加来源
src, err := client.Sources.AddURL(ctx, nb.ID, "https://example.com/paper.pdf")
if err != nil {
log.Fatal(err)
}
// 等待来源完成处理
_, err = client.Sources.WaitUntilReady(ctx, nb.ID, src.ID, 2*time.Minute)
if err != nil {
log.Fatal(err)
}
// 提问
result, err := client.Chat.Ask(ctx, nb.ID, "这是什么?", notebooklm.AskOptions{})
if err != nil {
log.Fatal(err)
}
fmt.Println(result.Answer)
// 生成音频概述并下载
status, err := client.Artifacts.GenerateAudio(ctx, nb.ID, notebooklm.GenerateAudioOptions{
Language: "en",
})
if err != nil {
log.Fatal(err)
}
status, err = client.Artifacts.WaitForCompletion(ctx, nb.ID, status.TaskID, 10*time.Minute)
if err != nil {
log.Fatal(err)
}
client.Artifacts.Download(ctx, nb.ID, status.TaskID, "podcast.mp4")
}
```
***
## 与Nym集成
[Nym](https://github.com/saeedata/nym) 是一个基于Go的AI代理平台。将`notebooklm-go`添加为内置工具,以便任何代理都可以与NotebookLM交互。
### 1. 添加依赖
在`nym/go.mod`中:
```bash
cd /path/to/nym
go get github.com/saeedata/notebooklm-go
```
### 2. 创建Nym工具包装器
在Nym仓库中创建`internal/tools/notebooklm.go`:
```go
package tools
import (
"context"
"encoding/json"
"fmt"
notebooklm "github.com/saeedata/notebooklm-go"
)
func init() {
Register(Tool{
Name: "notebooklm_ask",
Description: "向NotebookLM笔记本提问并获取带有来源引用的答案。",
Parameters: map[string]any{
"type": "object",
"properties": map[string]any{
"notebook_id": map[string]any{"type": "string", "description": "NotebookLM笔记本ID"},
"question": map[string]any{"type": "string", "description": "问题"},
},
"required": []string{"notebook_id", "question"},
},
Execute: func(ctx context.Context, args map[string]any) (string, error) {
client, err := notebooklm.NewClientFromStorage(ctx, "")
if err != nil {
return "", err
}
notebookID, _ := args["notebook_id"].(string)
question, _ := args["question"].(string)
result, err := client.Chat.Ask(ctx, notebookID, question, notebooklm.AskOptions{})
if err != nil {
return "", err
}
return result.Answer, nil
},
})
// ...
}
```
### 3. 设置身份验证
```bash
export NOTEBOOKLM_AUTH_JSON="$(cat ~/.notebooklm/storage_state.json)"
```
或在Nym的`.env` / 配置文件中配置。
***
## 与Claude Code集成
将`notebooklm-go`添加为Claude Code技能,以便代理在编码会话期间使用它。
### 1. 构建和安装CLI
```bash
cd notebooklm-go
go build -o notebooklm ./cmd/notebooklm/
sudo mv notebooklm /usr/local/bin/
```
### 2. 创建Claude Code技能
创建`~/.claude/skills/notebooklm.md`:
```markdown
# NotebookLM技能
您可以通过`notebooklm` CLI访问Google NotebookLM。
## 可用命令
### 笔记本
- `notebooklm notebook list` — 列出所有笔记本
- `notebooklm notebook create "<title>"` — 创建笔记本
- `notebooklm notebook describe <id>` — AI摘要 + 建议主题
### 来源
- `notebooklm source add-url -n <id> <url>` — 添加URL/YouTube来源
- `notebooklm source add-text -n <id> "<title>" "<content>"` — 添加文本
- `notebooklm source add-file -n <id> <path>` — 上传PDF/MD/DOCX
### 聊天
- `notebooklm chat ask -n <id> "<question>"` — 向笔记本提问
### 工件
- `notebooklm artifact audio -n <id> --wait --output out.mp4` — 生成音频播客
## 身份验证
需要`NOTEBOOKLM_AUTH_JSON`环境变量或`~/.notebooklm/storage_state.json`。
## 示例工作流程
1. 为当前任务创建笔记本
2. 添加相关文档URL作为来源
3. 提问以获取基于来源的答案
4. 生成异步审查的音频摘要
```
### 3. 在Claude Code会话中使用
```text
/notebooklm
```
或直接使用它 - Claude Code将通过bash直接调用`notebooklm` CLI。
***
## 与MCP(模型上下文协议)集成
将NotebookLM公开为MCP工具,任何MCP兼容的客户端(Claude Desktop,Cursor等)都可以使用。
### MCP服务器实现
```go
// cmd/mcp-server/main.go
package main
import (
"context"
notebooklm "github.com/saeedata/notebooklm-go"
// 使用您喜欢的MCP服务器库
)
// 注册工具:notebooklm_ask,notebooklm_create_notebook,
```
### Claude Desktop配置(`~/Library/Application Support/Claude/claude_desktop_config.json`)
```json
{
"mcpServers": {
"notebooklm": {
"command": "/usr/local/bin/notebooklm-mcp",
"env": {
"NOTEBOOKLM_AUTH_JSON": "<your-storage-state-json>"
}
}
}
}
```
***
## 环境变量
| 变量 | 描述 |
| ---------------------- | -------------------------------------------------------------- |
| `NOTEBOOKLM_AUTH_JSON` | Playwright存储状态JSON(内联,无需文件) |
| `NOTEBOOKLM_HOME` | 覆盖默认存储目录(默认:`~/.notebooklm/`) |
***
## API参考
### 客户端创建
```go
// 从存储文件(默认:~/.notebooklm/storage_state.json)
client, err := notebooklm.NewClientFromStorage(ctx, "")
// 从显式路径
client, err := notebooklm.NewClientFromStorage(ctx, "/path/to/storage_state.json")
// 从预加载的身份验证令牌
auth, err := notebooklm.NewAuthTokensFromStorage(ctx, "")
client := notebooklm.NewClient(auth)
```
### 子客户端
| 客户端 | 方法 |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `client.Notebooks` | `List`,`Create`,`Get`,`Rename`,`Delete`,`GetDescription`,`GetMetadata`,`RemoveFromRecent` |
| `client.Sources` | `List`,`Get`,`AddURL`,`AddText`,`AddFile`,`AddDrive`,`Delete`,`Rename`,`Refresh`,`WaitUntilReady` |
| `client.Artifacts` | `List`,`Get`,`Delete`,`Rename`,`GenerateAudio`,`GenerateVideo`,`GenerateReport`,`GenerateQuiz`,`GenerateInfographic`,`GenerateSlideDeck`,`GenerateDataTable`,`WaitForCompletion`,`Download` |
| `client.Chat` | `Ask`,`Configure`,`SetMode`,`GetConversationTurns`,`GetLastConversationID` |
| `client.Sharing` | `GetStatus`,`SetPublic`,`SetViewLevel`,`AddUser`,`UpdateUser`,`RemoveUser` |
| `client.Notes` | `List`,`Create`,`Update`,`Delete`,`ListMindMaps`,`GenerateMindMap` |
| `client.Research` | `StartFast`,`StartDeep`,`Poll`,`Import`,`WaitForCompletion` |
| `client.Settings` | `Get`,`SetOutputLanguage` |
***
## 许可证
MIT - 请参阅 [LICENSE](LICENSE)。
不隶属于Google或获得Google的认可。
⠀
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器