1仕組みと動作原理
実装の基礎は独自に移植されたGemini Webクライアントです。オープンソースのgemini_webapiをファイル単位でTypeScript(client/types/utils)へ移植しており、公式APIキーなしでテキストや画像を生成できます。
| `scripts/gemini-webapi/*` | TypeScript port of `gemini_webapi` (GeminiClient, types, utils) |
エンドポイントはconstants.tsに集約されています。INITでページトークンを取得、StreamGenerateでプライベートストリーミングインターフェースを利用、ROTATE_COOKIESでセッションCookieをローテーション、UPLOADで参照画像を送信、BATCH_EXECでbatchexecuteを実行します。
'https://gemini.google.com/_/BardChatUi/data/assistant.lamda.BardFrontendService/StreamGenerate',
認証の最初のステップはアクセストークンの取得です。init時に既存のCookieを用いてget_access_tokenを呼び出し、有効なトークンが取得できない場合はエラーをスローします。すべての生成リクエストにはこのトークンが必要です。
const [token, valid] = await get_access_token(this.cookies, this.proxy, vb);
認証情報の取得元はブラウザのセッションCookieです。load-browser-cookiesがローカルのデバッグポート(/json/version、デフォルトは127.0.0.1)を検出し、必要に応じてブラウザプロセスをspawnして実際のログイン状態を読み取ります。
const res = await fetch_with_timeout(`http://127.0.0.1:${port}/json/version`, { timeout_ms: 5_000 });
Cookieとローテーション結果はローカルファイルに永続化されます。cookie-fileによりJSONとしてディスクに書き込まれ、rotate-1psidtsによりリフレッシュされた1PSIDTSがファイルにキャッシュされます。
await writeFile(p, JSON.stringify(payload, null, 2), 'utf8');
画像処理機能はtypes/image.tsに実装されています。リモート画像をダウンロードしてディスクに書き込み(writeFile(dest, buf))、参照画像はupload-fileを通じてcontent-pushアップロードチャネル経由で処理されます。
await writeFile(dest, buf);
マルチターン会話はサーバー側のセッションではなく、Geminiのチャットメタデータをローカルのsessions/<id>.jsonに保存し、--sessionIdにより同一メタデータを再利用して対話を継続します。
Session files stored in data directory under `sessions/<id>.json`.
リバースエンジニアリングの利用には「事前同意」が明示的に要求されます。初回実行時には同意ファイル(acceptedかつdisclaimerVersion 1.0)の検証が必須であり、拒否された場合は終了します。
1. Check if consent file exists with `accepted: true` and `disclaimerVersion: "1.0"`
リクエスト層にはリトライデコレータrunningが備わっています。クライアント未初期化時は自動でinitを実行し、APIErrorが発生してリトライ回数が残っている場合は1秒スリープした後に再試行します。
if (e instanceof APIError && r > 0) {
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| network | gemini.google.com(INIT 页面取令牌 + StreamGenerate 私有生成接口 + batchexecute) |
| network | accounts.google.com(RotateCookies 轮换会话 cookie) |
| network | content-push.googleapis.com(参考图上传) |
| network | lh3.googleusercontent.com(返回图像资源 gg-dl) |
| cli | bun / npx(以 npx -y bun 直接运行脚本,无运行时抽象) |
| cli | 本机 Chrome/Chromium/Edge 可执行文件(按需 spawn 以读取会话 cookie) |
4推奨統制措置と判定根拠
- SKILL.md / 脚本: 未公開またはリバースエンジニアリングされたプライベートAPIの呼び出し / クライアント識別情報の偽装
- SKILL.md / 脚本参数: 自動検出の回避、ホストサンドボックスの無効化、またはSSL証明書検証のスキップを含む
- SKILL.md / 会话存储: ブラウザのユーザーログイン状態およびセッションCookieの読み取りまたは再利用
- 本地凭据 / 浏览器配置: ユーザーログインCookie/セッション/キーチェーンの読み取り: ブラウザのセッションCookie: __Secure-1PSID / __Secure-1PSIDTSなど(ローカルのcookies.json、またはローカルのChrome経由)
- scripts/: ローカルスクリプトまたはコマンドの実行: scripts/main.ts(npx -y bunにより実行。必要に応じてローカルブラウザを検出・spawnしてCookieを読み取り)
- 网络端点: 外部ネットワークアクセスの宣言: https://gemini.google.com/app(INITによるページトークン取得)
- 本地工作目录: ファイルの読み書きおよび成果物の出力: cookies.json(認証情報の永続化: セッションCookieの書き込み)
5二重目の独立検証
- [ok] 逆向 API 而非官方 API(red 主因之一) — constants.ts 直指 gemini.google.com 的 StreamGenerate 私有路径;SKILL.md/description 自述 reverse-engineered,并设 consent 门禁。
- [ok] 读取浏览器会话 cookie(red 主因之二) — load-browser-cookies.ts 探测 127.0.0.1 调试端口并按需 spawn 浏览器;SKILL.md 自述 First run opens browser for Google auth。
- [ok] 凭据落盘 — cookie-file.ts 的 writeFile(p, JSON.stringify(payload, null, 2)) 与 rotate-1psidts.ts 的 writeFile(cachePath, v) 两处写盘,路径由 paths.ts 解析。
- [ok] 无 TLS 降级 / 无 stealth 伪装 / 无任意代码执行 — 相关行为在 bundle 正文与 §3 风险扫描中均零命中;调度只有 init 重试与 sleep。
- [ok] consent 门禁存在但为“软门禁” — SKILL.md 要求先建 consent.json 再使用;但脚本自身不校验该文件,属文档级约束,已写入 risks。
- [ok] 功能声明与实现相符 — 文本/图像/vision/多轮四项在 SKILL.md Options 与 main.ts/client.ts 均有对应实现,未见夸大。
6結論
a98a97c1f7c81879…