首页 / 全部技能 / 内容创作 / baoyu-danger-gemini-web
内容创作 · JimLiu/baoyu-skills

baoyu-danger-gemini-web

Generates images and text via reverse-engineered Gemini Web API. Supports text generation, image generation from prompts, reference images for vision input, and multi-turn conversations. Use when other skills need image generation backend, or when user requests "generate image with Gemini", "Gemini text generation", or needs vision-capable AI generation.

L5 严管 · 隔离环境与严格审计V2 已复核逆向接口条款/合规凭据/登录态执行命令联网读写文件Dual-pass Audit
Author JimLiuGitHub JimLiu/baoyu-skills ↗Stars 25926License MIT(仓库根 LICENSE,Copyright (c) 2026 Jim Liu;GitHub API license.spdx_id=MIT)Commit 1567581c26
管控等级描述 skill 的能力与建议配套的管控措施,不代表质量或安全认证,也不表示可用或不可用。是否使用由用户和管理者决定。不同 agent 宿主对权限的约束各不相同,请勿假定宿主一定会提供安全兜底。第三方 skill 版权归原作者,使用风险由使用者自行承担。

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

实现基础是一份手写的 Gemini Web 客户端(TypeScript 移植自开源 gemini_webapi),把网页端私有接口当 SDK 用——这就是它能在没有官方 API Key 的情况下出文本与图片的原因。

skills/baoyu-danger-gemini-web/SKILL.md
| `scripts/gemini-webapi/*` | TypeScript port of `gemini_webapi` (GeminiClient, types, utils) |
脚本目录 513 行 CLI(main.ts)+ 约 2100 行库代码(client/constants/types/utils),是 baoyu 仓库里代码量最大的 skill。

端点集中在 constants.ts:INIT 取页面令牌、GENERATE 走 StreamGenerate 私有接口、ROTATE_COOKIES 轮换会话 cookie、UPLOAD 传参考图、BATCH_EXEC 走 batchexecute。

skills/baoyu-danger-gemini-web/scripts/gemini-webapi/constants.ts
'https://gemini.google.com/_/BardChatUi/data/assistant.lamda.BardFrontendService/StreamGenerate',
同一文件还固化了三个模型的 x-goog-ext-525001261-jspb 头部指纹(含 magic 字符串 9d8ca3786ebdfbea 等),等于把网页版的模型选择参数抄了下来。

认证第一步是抓网页里的 SNlM0e 访问令牌:GET gemini.google.com/app,用正则从 HTML 中提取,随后所有生成请求都带上它。

skills/baoyu-danger-gemini-web/scripts/gemini-webapi/utils/get-access-token.ts
const m = text.match(/\"SNlM0e\":\"(.*?)\"/);
令牌值即 this.access_token,配合 cookie 头一起发;找不到就抛 'Missing SNlM0e in response'。

凭据来源是浏览器会话 cookie(__Secure-1PSID / __Secure-1PSIDTS):先读本地 cookie 文件,失败则通过 CDP 连浏览器读 cookie,且默认会复用已运行的本地 Chrome 调试会话。

skills/baoyu-danger-gemini-web/scripts/gemini-webapi/utils/load-browser-cookies.ts
const existingCookies = hasExplicitProfile ? null : await fetch_cookies_from_existing_chrome(30_000, verbose);
SKILL.md 也自述这一点:无显式 profile 时可能复用“已运行的本地 Chrome/Chromium 调试会话”;读取后会把过滤出的 cookie 落盘(write_cookie_file(..., 'cdp-existing'))。

Cookie 与令牌被持久化:cookies.json 存 __Secure-1PSID/1PSIDTS 等,且后台定时任务用 RotateCookies 刷新 1PSIDTS 并再次落盘。

skills/baoyu-danger-gemini-web/scripts/gemini-webapi/client.ts
this.cookies['__Secure-1PSIDTS'] = newTs;
刷新循环默认 540 秒一次(refresh_interval),每次刷新后调用 write_cookie_file(..., 'refresh');路径由 paths.ts 的 resolveGeminiWebCookiePath() 决定(默认数据目录下 cookies.json,可用 GEMINI_WEB_COOKIE_PATH 覆盖)。

生成请求是表单 POST:body 里带 at(访问令牌)与 f.req(嵌套 JSON 数组),响应是网页版的流式分段文本,需要自行拆包取正文段。

skills/baoyu-danger-gemini-web/scripts/gemini-webapi/client.ts
const body = new URLSearchParams({ at: this.access_token, 'f.req': f_req }).toString();
解析失败时按错误码分流:1037 用量超限、1050 模型与历史不一致、1052 模型头无效、1060 IP 被临时封禁(提示用代理)。

多轮会话靠把 Gemini 的 chat metadata 存进本地 session 文件实现:--sessionId 复用同一 metadata 继续对话,消息史也写进 JSON。

skills/baoyu-danger-gemini-web/SKILL.md
Session files stored in data directory under `sessions/<id>.json`.
main.ts 会 push user/assistant 两条消息并 saveSession;--list-sessions 按更新时间列最近 100 个(内容取最后一条消息首行)。

逆向使用被显式要求“先同意”:首次使用要写 consent.json(accepted + disclaimerVersion 1.0),拒绝则直接退出。

skills/baoyu-danger-gemini-web/SKILL.md
1. Check if consent file exists with `accepted: true` and `disclaimerVersion: "1.0"`
同意文件落在 ~/Library/Application Support 或 ~/.local/share 下的 baoyu-skills/gemini-web/consent.json(Windows 走 %APPDATA%)。

它同时是图像后端:--image 出图(默认 generated.png)、--reference/--ref 做 vision 输入、--promptfiles 从文件读 prompt,因此被仓库定位为“自身即后端”的例外 skill。

docs/image-generation-tools.md
Skills that **are themselves** image-generation backends — currently `baoyu-image-gen`, `baoyu-image-gen` (deprecated), and `baoyu-danger-gemini-web` — do NOT include a `## Image Generation Tools` section.
图像由 types/image.ts 的 save() 落盘(writeFile(dest, buf));出图走同一条 StreamGenerate 通道,再从响应里解析图像候选并下载。

2核心能力

01文本生成(多模型:gemini-3-pro 默认 / flash / flash-thinking / 3.1-pro-preview)
02图像生成(--image,prompt 来自参数/文件/stdin)
03Vision 输入(--reference/--ref 参考图)
04多轮会话(--sessionId + 本地 session 文件 + --list-sessions)
05Cookie 生命周期自管理(首次浏览器登录、CDP 读取、后台轮换 1PSIDTS、--login 强制刷新)
06代理支持(HTTP_PROXY/HTTPS_PROXY 供受限网络访问 Google)
07同意门禁(consent.json accepted + disclaimerVersion 校验,拒绝即停)
08作为其它 skill 的图像生成后端(被 docs 明列为“自身即后端”例外)

3外部依赖

KindDependency / Endpoint
networkgemini.google.com(INIT 页面 + StreamGenerate 私有接口 + batchexecute)
networkaccounts.google.com(RotateCookies 轮换 1PSIDTS)
networkwww.google.com(基础页/常量)
networkcontent-push.googleapis.com(参考图上传)
packagebaoyu-chrome-cdp ^0.1.1(npm,用于发现/启动/接管 Chrome 调试会话并读 cookie)
clibun / npx(${BUN_X} 运行时)
cli本机 Chrome/Chromium/Edge 可执行文件(CDP 取 cookie;路径可由 GEMINI_WEB_CHROME_PATH 覆盖)

4管控建议与判定依据

建议配套管控措施
面向 Agent
隔离环境,逐次授权
面向管理者
严格授权、全量审计、合规确认
判定依据(文件路径与关键语句摘要)
  • SKILL.md / 脚本: 调用未公开或逆向工程的私有 API / 伪造客户端标识
  • SKILL.md / 脚本参数: 包含绕过自动化检测、关闭宿主沙箱或跳过 SSL 证书校验
  • SKILL.md / 会话存储: 读取或复用浏览器用户登录态与会话 Cookie
  • 本地凭据 / 浏览器配置: 读取用户登录 Cookie/会话/密钥环: 浏览器会话 cookie:__Secure-1PSID / __Secure-1PSIDTS(本地 cookies.json,或经 CDP Netwo
  • scripts/: 执行本地脚本或命令: scripts/main.ts(bun 运行;会按需启动/接管 Chrome 调试会话)
  • 网络端点: 声明外部网络访问: https://gemini.google.com/app(INIT 取 SNlM0e 令牌)
  • 本地工作目录: 文件读写与工件输出: cookies.json(凭据落盘:写入 __Secure-1PSID/1PSIDTS)
审计说明: (属能力/策略级判定,非恶意植入)。(a) 逆向工程私有接口 + 冒充网页客户端:直接调 gemini.google.com 的 StreamGenerate/BardChatUi 私有端点,从页面 HTML 抓 SNlM0e 令牌,并用固定 x-goog-ext-525001261-jspb header 冒充网页端选模型——不是官方 API。(b) 凭证面:读取并使用浏览器会话 cookie __Secure-1PSID / __Secure-1PSIDTS;无显式 profile 时经 CDP 复用“已在运行的本地 Chrome/Chromium 调试会话”(Network.getCookies 抓真实登录态),并把过滤后的 cookie 与后台轮换得到的 1PSIDTS 落盘到 cookies.json / .cached_1psidts_*.txt。(c) 命令面:脚本会启动/接管浏览器进程(baoyu-chrome-cdp),并有自动刷新循环在后台持续请求 accounts.google.com。存在账号被限制风险(README 自述 'Account restrictions possible if API usage detected';代码亦有 IP_TEMPORARILY_BLOCKED 分支)。程度说明:未发现 TLS 校验降级、未发现反自动化探测的伪装手法(无 navigator.webdriver patching / patchright / headless 规避)、不做批量定向采集、无任意代码执行——定级依据是“逆向私有接口 + 私有凭据 + 接管本机浏览器会话”,不是 stealth 手段。

5第二遍独立确认

  • [ok] 逆向 API 而非官方 API(red 主因之一) — constants.ts 直指 gemini.google.com 的 StreamGenerate 私有路径;get-access-token.ts 用正则从页面抓 SNlM0e;SKILL.md/description 自述 reverse-engineered,README 有 Disclaimer 段落。
  • [ok] 读取浏览器 cookie(red 主因之二) — load-browser-cookies.ts 走 CDP(引用 'Network.getCookies')读 cookie;get-access-token.ts 优先本地 cookie 文件,失败回落 CDP;client.ts 在 init/refresh 两处写 cookie 文件。
  • [ok] CDP 复用已运行 Chrome 调试会话 — SKILL.md 原文与 load-browser-cookies.ts 的 fetch_cookies_from_existing_chrome(30_000, ...) 一致;另有 hasExplicitProfile 判断(设了 --profile-dir 或 GEMINI_WEB_CHROME_PROFILE_DIR 才跳过复用)。
  • [ok] token 落盘 — cookie-file.ts write_cookie_file → writeFile(p, JSON.stringify(payload, null, 2));rotate-1psidts.ts 另写 .cached_1psidts_<sid>.txt。paths.ts 默认数据目录可用 GEMINI_WEB_DATA_DIR/GEMINI_WEB_COOKIE_PATH 覆盖。
  • [ok] 无 TLS 降级 / 无 stealth 反检测 / 无任意代码执行 — grep rejectUnauthorized / NODE_TLS / --ignore-certificate 与 webdriver / patchright / blink-features 均零命中;无 eval/new Function/远程脚本加载;Chrome 以本机真实 profile 启动(--remote-debugging-port),未做指纹伪装。
  • [ok] consent 门禁存在但为“软门禁” — SKILL.md 要求先建 consent.json 再使用;但门禁由 agent 按文档执行,脚本自身不校验该文件——属文档级约束,已在 risks 写明。
  • [ok] meta 元数据 — GitHub API:MIT、25926 stars、pushed_at 2026-09-10T15:13:43Z;本地 HEAD 与 pin 1567581c26ec… 一致。

6结论

  • 零官方 key 可用:只需一次浏览器登录,之后靠缓存的会话 cookie 出文本与图像,省去 API 申请与计费。
  • 能力面完整:文本、图像、vision 参考图、多轮会话、四个模型档位、代理出口都在一个 CLI 里。
  • cookie 生命周期自动化:后台轮换 1PSIDTS 并在失败时回落浏览器读取,比手贴 cookie 的方案耐用。
  • 可作为其它 skill 的免费图像后端(仓库文档明列为“自身即后端”的例外)。
  • 有 consent 门禁与失败码提示(用量超限/模型不符/IP 封禁都给了明确文案),知情使用门槛写清楚了。
  • 适合: 适合个人开发者做实验性/低敏感任务:没有官方 API key 时想用 Gemini 出图或问长文本、需要 vision 输入与多轮对话、或作为其它 baoyu skill 的图像后端(需愿意承担账号与稳定性风险)。
    不适合: 不适合企业生产、涉密数据处理、需要稳定 SLA 或合规审计的场景;不适合在主账号上高频使用;不适合无 Chrome/Chromium 且不愿装浏览器依赖的环境。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload baoyu-danger-gemini-web.tar.gz
    sha256: 076923f8aed80181…
    Option B · Copy Guide for Agent
    install.json
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 1567581c26.