From 13d2deef92ff515620eae34c62383ae30785354a Mon Sep 17 00:00:00 2001 From: foxhui Date: Thu, 11 Dec 2025 19:20:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=97=B6=E5=8F=AF=E8=83=BD=E4=BC=9A=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/backend/adapter/gemini_biz.js | 19 ++++++++++++++++++- lib/backend/adapter/zai_is.js | 22 +++++++++++++++++++--- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/lib/backend/adapter/gemini_biz.js b/lib/backend/adapter/gemini_biz.js index 8cccf6c..e9e9cdf 100644 --- a/lib/backend/adapter/gemini_biz.js +++ b/lib/backend/adapter/gemini_biz.js @@ -104,12 +104,29 @@ async function waitForInputWithAccountChooser(page, options = {}) { // 轮询等待输入框,同时处理账户选择 const startTime = Date.now(); while (Date.now() - startTime < timeout) { + // 如果正在处理跳转,暂停检测输入框 + if (isHandlingAuth) { + await sleep(500, 1000); + continue; + } + if (await handleAccountChooser(page)) { // 处理了账户选择,重置等待 continue; } - const inputHandle = await page.$(INPUT_SELECTOR); + let inputHandle = null; + try { + inputHandle = await page.$(INPUT_SELECTOR); + } catch (e) { + // 忽略执行上下文销毁错误 + if (e.message.includes('Execution context was destroyed')) { + inputHandle = null; + } else { + throw e; + } + } + if (inputHandle) break; await sleep(1000, 1500); diff --git a/lib/backend/adapter/zai_is.js b/lib/backend/adapter/zai_is.js index 04c17ae..56fcad8 100644 --- a/lib/backend/adapter/zai_is.js +++ b/lib/backend/adapter/zai_is.js @@ -21,14 +21,13 @@ const INPUT_SELECTOR = '.tiptap.ProseMirror'; // 入口 URL const TARGET_URL = 'https://zai.is/'; -// 防止重复处理登录的锁 -let isHandlingAuth = false; /** * 处理 Discord OAuth2 登录流程 * @param {import('playwright-core').Page} page * @returns {Promise} 是否处理了登录 */ +let isHandlingAuth = false; async function handleDiscordAuth(page) { // 防止重复处理 if (isHandlingAuth) return false; @@ -126,11 +125,28 @@ async function waitForInputWithAuth(page, options = {}) { // 轮询等待输入框,同时处理登录 const startTime = Date.now(); while (Date.now() - startTime < timeout) { + // 如果正在处理登录,暂停检测输入框,避免冲突 + if (isHandlingAuth) { + await sleep(500, 1000); + continue; + } + if (await handleDiscordAuth(page)) { continue; } - const inputHandle = await page.$(INPUT_SELECTOR); + let inputHandle = null; + try { + inputHandle = await page.$(INPUT_SELECTOR); + } catch (e) { + // 忽略执行上下文销毁错误 (通常发生在页面刷新/跳转时) + if (e.message.includes('Execution context was destroyed')) { + inputHandle = null; + } else { + throw e; + } + } + if (inputHandle) break; await sleep(1000, 1500);