From a6b137478ccc2725559c2b60bd19a4ae4a27e739 Mon Sep 17 00:00:00 2001 From: knowen <1369727119@qq.com> Date: Thu, 19 Mar 2026 22:02:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(gemini-ops):=20=E6=96=B0=E5=A2=9E=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=8A=B6=E6=80=81=E6=A3=80=E6=9F=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E6=A3=80=E6=B5=8B=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=B7=B2=E7=99=BB=E5=BD=95=20Google=20=E8=B4=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gemini-ops.js | 24 ++++++++++++++++++++++++ src/mcp-server.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/gemini-ops.js b/src/gemini-ops.js index a3e8513..57045c5 100644 --- a/src/gemini-ops.js +++ b/src/gemini-ops.js @@ -921,4 +921,28 @@ function isImageLoaded(op) { }); } +/** + * 检查是否已登录 Google 账号 + * + * 判断依据:顶部导航栏 div.boqOnegoogleliteOgbOneGoogleBar 的 innerText + * 包含"登录"或"sign in"(不区分大小写)则视为未登录 + * + * @param {ReturnType} op + * @returns {Promise<{ok: boolean, loggedIn: boolean, barText?: string, error?: string}>} + */ +function isLoggedIn(op) { + return op.query(() => { + const bar = document.querySelector('div.boqOnegoogleliteOgbOneGoogleBar'); + if (!bar) { + return { ok: false, loggedIn: false, error: 'login_bar_not_found' }; + } + + const text = (bar.innerText || '').trim(); + const lower = text.toLowerCase(); + const notLoggedIn = lower.includes('登录') || lower.includes('sign in'); + + return { ok: true, loggedIn: !notLoggedIn, barText: text }; + }); +} + diff --git a/src/mcp-server.js b/src/mcp-server.js index 7b28681..d8a70c2 100644 --- a/src/mcp-server.js +++ b/src/mcp-server.js @@ -374,6 +374,34 @@ server.registerTool( } ); +// ─── 登录状态检查 ─── + +server.registerTool( + "gemini_check_login", + { + description: "检查当前 Gemini 页面是否已登录 Google 账号", + inputSchema: {}, + }, + async () => { + try { + const { ops } = await createGeminiSession(); + const result = await ops.checkLogin(); + disconnect(); + + if (!result.ok) { + return { content: [{ type: "text", text: `检测失败: ${result.error}` }], isError: true }; + } + + const status = result.loggedIn ? "已登录" : "未登录"; + return { + content: [{ type: "text", text: `${status}(导航栏文本: "${result.barText}")` }], + }; + } catch (err) { + return { content: [{ type: "text", text: `执行崩溃: ${err.message}` }], isError: true }; + } + } +); + // ─── 页面状态 & 恢复 ─── server.registerTool(