From 83167e47a6736c9dcd6e3388df89a199e610af09 Mon Sep 17 00:00:00 2001 From: Liang Jiaqing Date: Wed, 25 Feb 2026 08:47:02 +0800 Subject: [PATCH] refactor: remove detect_newtab, use session dict diff for new tab detection --- TMWebDriver.py | 12 +++++------- assets/ljq_web_driver.user.js | 26 +------------------------- memory/tmwebdriver_sop.md | 6 ++++++ simphtml.py | 20 +++++++++----------- 4 files changed, 21 insertions(+), 43 deletions(-) diff --git a/TMWebDriver.py b/TMWebDriver.py index 7957e06..86a2b0b 100644 --- a/TMWebDriver.py +++ b/TMWebDriver.py @@ -93,9 +93,8 @@ class TMWebDriver: session_id = data.get('sessionId') code = data.get('code') timeout = float(data.get('timeout', 10.0)) - detect_newtab = data.get('detect_newtab', False) try: - result = self.execute_js(code, timeout=timeout, session_id=session_id, detect_newtab=detect_newtab) + result = self.execute_js(code, timeout=timeout, session_id=session_id) print('[remote result]', (str(code)[:50] + ' RESULT:' +str(result)[:50]).replace('\n', ' ')) return json.dumps({'r': result}, ensure_ascii=False) except Exception as e: @@ -168,13 +167,12 @@ class TMWebDriver: session.mark_disconnected() break - def execute_js(self, code, timeout=15, session_id=None, detect_newtab=False) -> Any: + def execute_js(self, code, timeout=15, session_id=None) -> Any: if session_id is None: session_id = self.default_session_id if self.is_remote: print('remote_execute_js') response = self._remote_cmd({"cmd": "execute_js", "sessionId": session_id, - "code": code, "timeout": str(timeout), - "detect_newtab": detect_newtab}).get('r', {}) + "code": code, "timeout": str(timeout)}).get('r', {}) if response.get('error'): raise Exception(response['error']) return response @@ -194,7 +192,7 @@ class TMWebDriver: tp = session.type assert tp in ['ws', 'http'], f"Unsupported session type: {tp}" exec_id = str(uuid.uuid4()) - payload = json.dumps({'id': exec_id, 'code': code, 'detect_newtab': detect_newtab}) + payload = json.dumps({'id': exec_id, 'code': code}) if tp == 'ws': session.ws_client.send_message(payload) elif tp == 'http': session.http_queue.put(payload) @@ -265,7 +263,7 @@ class TMWebDriver: def jump(self, url, timeout=10): self.execute_js(f"window.location.href='{url}'", timeout=timeout) def newtab(self, url=None): if url is None: url = "http://www.baidu.com/robots.txt" - return self.execute_js(f'GM_openInTab("{url}");', detect_newtab=True) + return self.execute_js(f'GM_openInTab("{url}");') if __name__ == "__main__": driver = TMWebDriver(host='localhost', port=18765) \ No newline at end of file diff --git a/assets/ljq_web_driver.user.js b/assets/ljq_web_driver.user.js index 70d1ce0..dda7886 100644 --- a/assets/ljq_web_driver.user.js +++ b/assets/ljq_web_driver.user.js @@ -57,14 +57,6 @@ console.log(log_prefix + `使用现有会话ID: ${sid}`); } - try { - GM_setValue('new_tab_report', { - url: window.location.href, - sessionId: sid, - ts: Date.now() - }); - } catch (e) {} - // 保存会话ID GM_setValue('sid', sid); @@ -374,33 +366,17 @@ try { let data = JSON.parse(e.data); ws.send(JSON.stringify({type: 'ack',id: data.id})); - let startTime = Date.now(); - let newTabs = []; - let checkNewTab = data.detect_newtab === true; - GM_setValue('new_tab_report', null); const response = executeCode(data); if (response.error) { handleError(data.id, response.error, '执行代码'); } else { - if (checkNewTab) { - for (let i = 0; i < 10; i++) { - await new Promise(r => setTimeout(r, 150)); - let latestReport = GM_getValue('new_tab_report'); - if (latestReport && latestReport.ts >= startTime) { - console.log(`%c[Detected] 轮询第 ${i+1} 次抓到新标签!`, "color: green"); - newTabs.push(latestReport); - break; - } - } - } updateStatus('ok'); ws.send(JSON.stringify({ type: 'result', id: data.id, sessionId: sid, - result: response.result, - newTabs: newTabs + result: response.result })); } } catch (parseError) { diff --git a/memory/tmwebdriver_sop.md b/memory/tmwebdriver_sop.md index 13e3f0f..2dfe868 100644 --- a/memory/tmwebdriver_sop.md +++ b/memory/tmwebdriver_sop.md @@ -36,6 +36,12 @@ fetch('PDF_URL').then(r=>r.blob()).then(b=>{ ``` 注意:需同源或CORS允许,跨域先导航到目标域再执行 +## Chrome后台标签节流 +- 后台标签中`setTimeout`被Chrome intensive throttling延迟到≥1min/次 +- TM脚本中detect_newtab的轮询(`setTimeout 150ms × 10`)会超时 +- 已修复:移除TM脚本内轮询,改由Python侧`get_session_dict()`前后对比检测新标签 +- 同理:TM脚本中任何后台逻辑都应避免依赖setTimeout轮询 + ## Cookie提取(含HttpOnly) 前提:需先安装`assets/cookie_grabber/`扩展 机制:注入`id="__ljqcg__"`的div→扩展检测后自动将完整cookie写回该元素textContent(含HttpOnly) \ No newline at end of file diff --git a/simphtml.py b/simphtml.py index 0129c0b..24cee2d 100644 --- a/simphtml.py +++ b/simphtml.py @@ -862,13 +862,12 @@ def get_html(driver, cutlist=False, maxchars=28000, instruction="", extra_js="") def execute_js_rich(script, driver): try: last_html = get_html(driver, cutlist=False, extra_js=temp_monitor_js) except: last_html = None - result = None; error_msg = None; newTabs = []; reloaded = False + result = None; error_msg = None; reloaded = False before_sids = set(driver.get_session_dict().keys()) try: print(f"Executing: {script[:250]} ...") - response = driver.execute_js(script, detect_newtab=True) + response = driver.execute_js(script) result = response.get('data') or response.get('result') - newTabs = response.get('newTabs', []) if response.get('closed', 0) == 1: reloaded = True time.sleep(2) except Exception as e: @@ -879,16 +878,15 @@ def execute_js_rich(script, driver): rr = { "status": "failed" if error_msg else "success", "js_return": result, - "environment": {"newTabs": newTabs, "reloaded": reloaded}, + "environment": {"reloaded": reloaded}, "tab_id": driver.default_session_id } - if reloaded and len(newTabs) == 0: - after = driver.get_session_dict() - new_sids = {k: v for k, v in after.items() if k not in before_sids} - if new_sids: - newTabs = [{'id': k, 'url': v} for k, v in new_sids.items()] - rr['environment']['newTabs'] = newTabs - rr['suggestion'] = "页面已刷新,以上新标签页在执行期间连接。" + after = driver.get_session_dict() + new_sids = {k: v for k, v in after.items() if k not in before_sids} + if new_sids: + newTabs = [{'id': k, 'url': v} for k, v in new_sids.items()] + rr['environment']['newTabs'] = newTabs + rr['suggestion'] = "页面已刷新,以上新标签页在执行期间连接。" if error_msg: rr['error'] = error_msg if not reloaded: try: rr['transients'] = get_temp_texts(driver)