[ PROMPT_NODE_26008 ]
Notebooklm 认证
[ SKILL_DOCUMENTATION ]
# 身份验证架构
## 概述
此技能使用一种**混合身份验证方法**,结合了两种方案的优点:
1. **持久化浏览器配置文件** (`user_data_dir`):用于一致的浏览器指纹识别
2. **手动 Cookie 注入**:从 `state.json` 注入以实现可靠的会话 Cookie 持久化
## 为什么采用这种方法?
### 问题所在
Playwright/Patchright 存在一个已知 Bug ([#36139](https://github.com/microsoft/playwright/issues/36139)),即在使用 `launch_persistent_context()` 和 `user_data_dir` 时,**会话 Cookie**(没有 `Expires` 属性的 Cookie)无法正确持久化。
**会发生什么:**
- ✅ 持久化 Cookie(带有 `Expires` 日期)→ 正确保存到浏览器配置文件
- ❌ 会话 Cookie(没有 `Expires`)→ **浏览器重启后丢失**
**影响:**
- 部分 Google 身份验证 Cookie 是会话 Cookie
- 用户会遇到随机的身份验证失败
- “在我机器上能运行”综合症(取决于 Google 使用了哪些 Cookie)
### TypeScript 与 Python 的对比
MCP 服务器 (TypeScript) 可以通过将 `storage_state` 作为参数传递来绕过此问题:
typescript
// TypeScript - 有效!
const context = await chromium.launchPersistentContext(userDataDir, {
storageState: "state.json", // ← 加载包括会话 Cookie 在内的所有 Cookie
channel: "chrome"
});
但 **Python 的 Playwright API 不支持此功能** ([#14949](https://github.com/microsoft/playwright/issues/14949)):
python
# Python - 不支持!
context = playwright.chromium.launch_persistent_context(
user_data_dir=profile_dir,
storage_state="state.json", # ← Python 中没有此参数!
channel="chrome"
)
## 我们的解决方案:混合方法
我们使用**两阶段身份验证系统**:
### 第一阶段:设置 (`auth_manager.py setup`)
1. 使用 `user_data_dir` 启动持久化上下文
2. 用户手动登录
3. **将状态保存到两个地方:**
- 浏览器配置文件目录(自动,用于指纹 + 持久化 Cookie)
- `state.json` 文件(显式保存,用于会话 Cookie)
python
context = playwright.chromium.launch_persistent_context(
user_data_dir="browser_profile/",
channel="chrome"
)
# 用户登录...
context.storage_state(path="state.json") # 保存所有 Cookie
### 第二阶段:运行时 (`ask_question.py`)
1. 使用 `user_data_dir` 启动持久化上下文(加载指纹 + 持久化 Cookie)
2. **手动注入 Cookie** 从 `state.json`(添加会话 Cookie)
python
# 第一步:使用浏览器配置文件启动
conte