butelo/foxtwin
GitHub: butelo/foxtwin
foxtwin 让 Node 开发者复用 Firefox 登录态,在无需 API 密钥的情况下通过命令行直接调用 Gemini 网页版的文本、图像与 PDF 功能。
Stars: 0 | Forks: 0
# foxtwin
**foxtwin** 使用您的 Firefox 会话 cookies,在 Node 中与 Gemini Web 应用进行通信 —— 无需 API key,无需 Chrome,零外部依赖(仅使用 Node 内置模块)。
它的名字向 **fox**(Firefox)和 **twins**(Gemini)致敬,且未使用任何相关商标。它对 Web 应用的内部 API 进行了逆向工程:从 Firefox 的明文 `cookies.sqlite` 中读取您已登录的 cookies,然后向 Web UI 使用的同一个 `StreamGenerate` endpoint 发送 POST 请求。
## 环境要求
- **Node 22+**(使用内置的 `node:sqlite`)。
- 已安装 **Firefox**,并且在您使用的配置文件中已登录 `gemini.google.com`。
## 使用方法
```
# 文本
node cli.mjs "Explain closures in JavaScript"
# 选择一个 model
node cli.mjs --model gemini-3.5-flash "draft a haiku"
# 使用特定的 Firefox container(例如你的 Pro/Advanced 账户)
node cli.mjs --container 2 "Say OK."
# 生成图像(写入一个文件)— 需要 Pro/Advanced 账户 container
node cli.mjs --container 2 --generate-image out.jpg --aspect 1:1 "a cute robot holding a banana"
# 编辑图像
node cli.mjs --edit-image in.png --output out.jpg "add sunglasses"
# 附加 PDF 并进行提问 — 需要 Pro/Advanced 账户 container
node cli.mjs --container 2 --file document.pdf "summarize this"
```
## 选项
| 标志 | 描述 |
|---|---|
| `--model ` | `gemini-3.1-pro`(默认),`gemini-3.5-flash`,`gemini-3.1-flash-lite`,`gemini-3-deep-think` |
| `--profile ` | Firefox 配置文件目录或名称(否则将自动检测) |
| `--container ` | Firefox Multi-Account Container 的 `userContextId`(例如 `2`) |
| `--generate-image ` | 将生成的图像写入此路径 |
| `--edit-image ` | 输入要编辑的图像 |
| `--output ` | 编辑后图像的输出路径 |
| `--aspect ` | 宽高比提示,例如 `1:1` |
| `--show-thoughts` | 在输出中包含模型的思考过程 |
| `--file ` | 附加文件(可重复使用) |
环境变量后备:`GEMINI_MODEL`、`FIREFOX_PROFILE`、`FIREFOX_CONTAINER`。
## Firefox 容器
如果您将 Google 会话保留在 Firefox 的 **Multi-Account Container** 中(如果您区分个人/工作帐户,这很常见),请传入 `--container ` 以便读取正确会话的 cookies。您的 Pro/Advanced Gemini 帐户通常是支持图像生成的那个帐户 —— 请将 `--container` 指向它。
该工具会自动检测您的 `*.default-release` 配置文件;使用 `--profile` 指定特定的配置文件。
## 支持功能
| 功能 | 状态 |
|---|---|
| 文本聊天 | ✅ |
| 图像生成 (`--generate-image`) | ✅(Pro 容器) |
| 图像编辑 (`--edit-image`) | ✅(Pro 容器) |
| **PDF 附件 + 问答** (`--file doc.pdf`) | ✅(Pro 容器) |
| 图像附件 + 分析 (`--file photo.jpg`) | ❌(流式传输限制 —— 见注意事项) |
文件**分析**(PDF、图像)需要 **Pro/Advanced 帐户容器**;免费/默认容器对于附件会返回错误 `1100`。PDF 分析可以端到端运行。目前图像文件分析会失败,因为 Gemini 会通过一个长时间保持的连接来流式传输该响应,而 Node 的 `fetch` 会提前将其终止(实时 Web UI 会接收完整流)。PDF 会在单个批次中完成并成功返回。
## 工作原理
1. **Cookies** — 将 Firefox 的 `cookies.sqlite` 复制到临时目录(Firefox 持有 WAL 锁),通过 `node:sqlite` 读取 `google.com` 的认证 cookies。
2. **Bootstrap** — `GET /app` 抓取嵌入在 HTML 中的会话 token(`SNlM0e`、`cfb2h`、`FdrFJe`)。
3. **Generate** — 使用稀疏的 `f.req` payload、模型选择器 header 和 `rt=c` 流式传输,向 `POST StreamGenerate` 发送请求。
4. **Parse** — 解码 Google 的长度前缀帧,并提取候选文本 / 思考过程 / 图像 URL。
5. **Images** — 通过经过身份验证的 `gg-dl` 重定向下载生成的图像。
## 文件
- `src/firefoxCookies.mjs` — Firefox cookie 提取
- `src/gemini.mjs` — Gemini Web 客户端(请求 + 解析 + 图像下载)
- `cli.mjs` — 命令行运行器
## 注意事项
- 这是一个非官方的逆向工程客户端。Google 可以随时更改内部 API;模型哈希(`src/gemini.mjs`)可能需要更新。
- 图像生成和文件分析需要 Gemini **Pro/Advanced** 帐户 —— 请使用在 Web UI 中具有这些功能的容器的会话。
- **图像文件分析**(`--file photo.jpg "describe this"`)尚不支持:Gemini 会通过一个长连接流式传输该响应,而 Node 内置的 `fetch`(undici)会在答复帧到达之前将其关闭。维护的 Python 参考实现(`HanaokaYuzu/Gemini-API`)通过 `curl_cffi` 的 TLS 模拟解决了这个问题。PDF 分析不受影响(它在一个批处理响应中完成)。
- 附件通过 Google 的可恢复上传协议(`push.clients6.google.com/upload/`,两步启动 → 完成)进行上传。
## ⚠️ 免责声明
**本项目由 AI 编码代理生成,未经人类审查或验证。** 按“原样”提供,不提供任何保证。代码对一个非官方的、未公开文档记录的内部 API 进行了逆向工程,该 API 随时可能更改,并且它会处理您真实的 Google 会话 cookies。**使用风险自负** —— 在运行前请审查代码,不要暴露您的 cookies,也不要将其用于任何重要事项。
## 致谢
本项目受到 **[Oracle](https://github.com/steipete/oracle)** 的启发并衍生自该项目。该项目由 [Peter Steinberger](https://github.com/steipete)(@steipete)开发,开创了本工具所移植的 Gemini Web(cookie)客户端的先河。现代的请求/响应结构参考了 [HanaokaYuzu/Gemini-API](https://github.com/HanaokaYuzu/Gemini-API)。有关完整的归属说明,请参阅 [`NOTICE`](./NOTICE)。这两个上游项目均基于 MIT 许可协议。
## 许可协议
MIT —— 详见 [`LICENSE`](./LICENSE)。
标签:API, GNU通用公共许可证, MITM代理, Node.js, 云资产清单, 人工智能, 数字取证, 文档结构分析, 浏览器集成, 用户模式Hook绕过, 自动化脚本, 自定义脚本, 逆向工程