chore: 添加 .gitignore 并更新依赖与文档配置

This commit is contained in:
WJZ_P
2026-03-15 23:46:55 +08:00
parent f4beac1db2
commit b8649e5699
10 changed files with 2453 additions and 316 deletions

View File

@@ -12,7 +12,8 @@ description: 通过 Gemini 官网gemini.google.com执行问答与生图操
3. 文本问答任务(如"问问Gemini xxx")走 Gemini 文本提问链路。
4. 默认模型:可用列表中最强模型,优先 `Gemini 3.1 Pro`
5. 执行生图后先向用户回报"正在绘图中",完成后回传图片。
6. **禁止使用浏览器截图screenshot获取生成图片**。默认通过 `extractImageBase64()` 从已渲染的 DOM 直接提取图片 Base64 数据,解码后保存到本地再发送给用户;仅当用户明确要求高清/原图时,才调用 `downloadLatestImage()` 走原图下载流程。
6. **禁止使用浏览器截图screenshot获取生成图片**。默认通过 `ops.extractImageBase64()` 从已渲染的 DOM 直接提取图片 Base64 数据,解码后保存到本地再发送给用户;仅当用户明确要求高清/原图时,才调用 `ops.downloadLatestImage()` 走原图下载流程。
7. **只调封装好的方法,禁止自己写 `page.evaluate()`**。所有操作通过 `ops.xxx`(高层业务)或 `operator.xxx`(底层原子)完成。底层已全部走 CDP 协议,无需关心实现细节。直接写 evaluate 既浪费 token 又容易出错。
## 任务分流
@@ -32,7 +33,7 @@ Gemini 页面的操作按钮(`.send-button-container` 内)通过 `aria-label
| 发送 / Send | `ready` | 输入框有内容,可发送 |
| 停止 / Stop | `loading` | 已发送,正在生成回答 |
可通过 `GeminiOps.getStatus()` 获取当前状态,通过 `GeminiOps.pollStatus()` 分段轮询等待生成完毕。
可通过 `ops.getStatus()` 获取当前状态,通过 `ops.pollStatus()` 分段轮询等待生成完毕。
### A. 文本问答
1. 打开 `https://gemini.google.com`
@@ -50,25 +51,24 @@ Gemini 页面的操作按钮(`.send-button-container` 内)通过 `aria-label
4. 将用户提示词原样输入。
5. 发送后立即通知用户:正在绘图中。
6. **分段轮询等待**(见下方"CDP 保活轮询策略",生图超时上限 120s
7. 结果出现后,调用 `GeminiOps.getLatestImage()` 获取最新生成的图片Gemini 一次只生成一张):
- 返回 `{ok, src, alt, width, height, hasDownloadBtn, debug}`
7. 结果出现后,调用 `ops.getLatestImage()` 获取最新生成的图片Gemini 一次只生成一张):
- 返回 `{ok, src, alt, width, height, hasDownloadBtn}`
- 定位依据:`<img class="image loaded">` — 只有同时具有 `image``loaded` 两个 class 的才是已渲染完成的生成图片DOM 中取最后一个即为最新。
- `src``https://lh3.googleusercontent.com/...` 格式的原图 URL。
-`ok === false`,等几秒再调一次;连续两次失败则做 snapshot 排查页面状态。
- **默认**:调用 `GeminiOps.extractImageBase64()` 从 DOM 直接提取图片 Base64Canvas 优先,跨域污染时 fallback 到 fetch解码后保存为本地文件发送给用户。注意该函数返回 PromiseCDP 调用时需设置 `awaitPromise:true`
- **高清**:仅当用户明确要求高清/原图时,才调用 `GeminiOps.downloadLatestImage()` 走原图下载按钮流程。
-`ok === false`,等几秒再调一次;连续两次失败则做 screenshot 排查页面状态。
- **默认**:调用 `ops.extractImageBase64()` 从 DOM 直接提取图片 Base64Canvas 优先,跨域污染时 fallback 到 fetch解码后保存为本地文件发送给用户。
- **高清**:仅当用户明确要求高清/原图时,才调用 `ops.downloadLatestImage()` 走原图下载按钮流程。
- 下载按钮定位:从 `img` 向上找到 `.image-container` 容器,容器内的 `mat-icon[fonticon="download"]` 即为下载原图按钮。
- ⚠️ **严禁使用浏览器截图screenshot代替保存图片**
8. 将保存到本地的图片文件发送给用户。
9. **将每步操作返回的 `debug` 日志一并回传给用户**,方便排查定位失败和优化策略。所有函数(`probe``click``fillPrompt``pollStatus``getLatestImage``extractImageBase64``downloadLatestImage`)的返回值都包含 `debug` 字段。
## CDP 保活轮询策略
> **核心原则**绝不在页面内做长时间 Promise 等待。每次 `evaluate` 必须毫秒级返回,由调用端控制循环
> **核心原则**通过 `ops.pollStatus()` 分段轮询,不要试图一次性长时间等待结果
生图/问答发送后,按以下方式等待结果:
1. 每隔 **8~10 秒**调用一次 `GeminiOps.pollStatus()`
1. 每隔 **8~10 秒**调用一次 `ops.pollStatus()`
2. 该函数立即返回 `{status, label, pageVisible, ts}`
3. 调用端根据 `status` 判断:
- `loading` → 继续等待,累计已耗时。
@@ -86,8 +86,8 @@ Gemini 页面的操作按钮(`.send-button-container` 内)通过 `aria-label
## 低 token 优先策略
- 优先使用 `scripts/gemini_ui_shortcuts.js` 的快捷选择器
- evaluate 批量动作,再 snapshot 精准兜底。
- **只调封装好的 `ops.xxx` / `operator.xxx` 方法**,不要自己拼 `page.evaluate()` 代码——既省 token 又不容易出错
-调方法执行动作,再用 `operator.screenshot()` 精准兜底排查
- 避免高频全量快照。
## 参考