From c6319594c70b69e6a53e023611a40057fb56ad52 Mon Sep 17 00:00:00 2001 From: Liang Jiaqing Date: Sun, 19 Apr 2026 11:16:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=85=E7=90=86SOP:=20web=5Fsetup=E5=8E=BBTM?= =?UTF-8?q?=E6=96=B9=E6=A1=88,=20tmwebdriver=E6=8E=92=E6=9F=A5=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- llmcore.py | 2 +- memory/tmwebdriver_sop.md | 17 ++++---- memory/web_setup_sop.md | 84 ++++++--------------------------------- 3 files changed, 21 insertions(+), 82 deletions(-) diff --git a/llmcore.py b/llmcore.py index 5461a02..a8887fb 100644 --- a/llmcore.py +++ b/llmcore.py @@ -530,7 +530,7 @@ class NativeClaudeSession(BaseSession): beta_parts.insert(1, "context-1m-2025-08-07"); model = model.replace("[1m]", "").replace("[1M]", "") headers = {"Content-Type": "application/json", "anthropic-version": "2023-06-01", "anthropic-beta": ",".join(beta_parts), "anthropic-dangerous-direct-browser-access": "true", - "user-agent": "claude-cli/2.1.90 (external, cli)", "x-app": "cli"} + "user-agent": "claude-cli/2.1.114 (external, cli)", "x-app": "cli"} if self.api_key.startswith("sk-ant-"): headers["x-api-key"] = self.api_key else: headers["authorization"] = f"Bearer {self.api_key}" payload = {"model": model, "messages": messages, "max_tokens": self.max_tokens, "stream": self.stream} diff --git a/memory/tmwebdriver_sop.md b/memory/tmwebdriver_sop.md index 2fb3e6a..d758893 100644 --- a/memory/tmwebdriver_sop.md +++ b/memory/tmwebdriver_sop.md @@ -1,9 +1,8 @@ # TMWebDriver SOP -- 禁止import,直接用web_scan/web_execute_js工具。本文件只记录特性和坑。 -- 底层:`../TMWebDriver.py`通过Chrome扩展(非Tampermonkey)接管用户浏览器(保留登录态/Cookie) +- 直接用web_scan/web_execute_js工具。本文件只记录特性和坑。 +- 底层:`../TMWebDriver.py`通过Chrome扩展接管用户浏览器(保留登录态/Cookie) - 非Selenium/Playwright,保留用户浏览器登录态 -- ⚠扩展更新后旧tab的content script不重载→需刷新页面 ## 通用特性 - ⚠web_execute_js里使用`await`时需**显式`return`**才能拿到返回值(底层async包裹,不写return则返回null) @@ -112,11 +111,11 @@ web_execute_js script='{"cmd": "batch", "commands": [...]}' - simphtml调试必须通过`code_run`注入JS到真实浏览器(Python端无法模拟DOM) - `d=TMWebDriver()`, `d.set_session('url_pattern')`, `d.execute_js(code)` → 返回`{'data': value}` - simphtml:`str(simphtml.optimize_html_for_tokens(html))` — 返回BS4 Tag需str() -- ⚠**DOMRect坑(hasOverlap)**:某些上下文`rect.x/y`为undefined(只有left/top),导致NaN→误判重叠。兼容:`rect.x ?? rect.left` ## 连不上排查 -web_scan失败时按序排查: -①扩展没装?→检查Chrome扩展列表(chrome://extensions)是否有TMWebDriver扩展 - 没找到→走web_setup_sop;找到→确认已启用 -②浏览器没开?→检查①对应的浏览器进程是否在跑(tasklist/ps),没有则启动并打开正常URL(⚠about:blank等内部页不加载扩展) -③WS后台挂了?→socket.connect_ex(('127.0.0.1',18766))非0即dead→手动`from TMWebDriver import TMWebDriver; TMWebDriver()`起master +web_scan失败时按序排查(自动检测优先,用户参与放最后): +①浏览器没开?→检查浏览器进程是否在跑(tasklist/ps),没有则启动并打开正常URL(⚠about:blank等内部页不加载扩展) +②WS后台挂了?→本机18766端口没监听即dead→手动后台`from TMWebDriver import TMWebDriver; TMWebDriver()`起master +③扩展没装?→读Chrome用户目录下`Secure Preferences`→`extensions.settings`中找`path`含`tmwd_cdp_bridge`的条目 + 找到→扩展已装,排查其他原因;没找到→走web_setup_sop +④以上都正常仍连不上→请求用户协助 diff --git a/memory/web_setup_sop.md b/memory/web_setup_sop.md index 7cc9e3f..b829a60 100644 --- a/memory/web_setup_sop.md +++ b/memory/web_setup_sop.md @@ -1,7 +1,5 @@ # Web 工具链初始化执行 SOP -⚠ **当前只需安装 `assets/tmwd_cdp_bridge` Chrome 扩展即可,Tampermonkey 方案将在未来移除。** - 若 web_scan 和 web_execute_js 已测试可用,无需执行此 SOP。 仅供初始安装时,code_run 可用但 web 工具尚未配置的场景。 @@ -9,77 +7,19 @@ 在仅具备系统级权限(code_run)时,建立 Web 交互能力(web_scan / web_execute_js)。 ## 前置:检测浏览器 -```python -import shutil, subprocess -browser = "chrome" if shutil.which("chrome") else "msedge" # Edge内置必存在,Chrome可选 -``` -## 阶段一:安装 Tampermonkey (手动) -**状态**: 尚未实现自动化,需用户手动操作。 -1. 用 `start` 打开扩展商店页面(自动适配浏览器): - - Chrome: `start "" "https://chromewebstore.google.com/detail/篡改猴测试版/gcalenpjmijncebpfijmoaglllgpjagf"` - - Edge: `start "" "https://microsoftedge.microsoft.com/addons/detail/tampermonkey/iikmkjmpaadaobahmlepeloendndfphd"` -2. 提示用户点击"安装"并确认。 +## 安装 tmwd_cdp_bridge 扩展 +扩展路径: `../assets/tmwd_cdp_bridge/`(MV3 Chrome 扩展,含 CDP debugger + scripting + cookie 能力) -## 阶段 1.5:开启「允许运行用户脚本」 -**前置**:TM 已安装,但 Chrome 可能默认未开启此权限。 -需打开 TM 的扩展详情页,手动开启相关开关。 +### 自动打开扩展管理页 +`chrome://extensions` 无法通过命令行或 JS 打开,需用剪贴板+地址栏方案 -### 自动打开详情页 -1. 从文件系统读取 TM 扩展 ID: - ```python - import os, json, glob - ext_dir = os.path.expandvars(r'%LOCALAPPDATA%\Google\Chrome\User Data\Default\Extensions') - for eid in os.listdir(ext_dir): - for ver in glob.glob(os.path.join(ext_dir, eid, '*')): - mf = os.path.join(ver, 'manifest.json') - if os.path.isfile(mf): - with open(mf, encoding='utf-8') as f: - m = json.load(f) - if 'tampermonkey' in m.get('name','').lower() or 'tampermonkey' in m.get('description','').lower(): - tm_id = eid; break - ``` -2. 导航到 `chrome://extensions/?id={tm_id}`: - - ⚠️ `chrome://` 协议无法通过命令行参数或 JS(`window.open`) 打开 - - ✅ 用 ljqCtrl(需先打开一个 Chrome 窗口并置顶)或剪贴板+地址栏方案: - ```python - # 剪贴板方案:写入URL → Ctrl+L → Ctrl+V → Enter - import win32clipboard - win32clipboard.OpenClipboard(); win32clipboard.EmptyClipboard() - win32clipboard.SetClipboardText(f'chrome://extensions/?id={tm_id}') - win32clipboard.CloseClipboard() - # 然后用 ljqCtrl 或 SendKeys 发送 Ctrl+L, Ctrl+V, Enter - ``` -3. 提示用户在详情页中开启「允许运行用户脚本」开关。 +### 安装步骤(chrome扩展页难以自动化) +1. 打开扩展管理页,开启「开发者模式」 +2. 点击「加载已解压的扩展程序」,选择 `assets/tmwd_cdp_bridge/` 目录,或让用户直接拖入 +3. 显示“错误”不用管,一般只是因为还没连上GA -## 阶段 1.6:配置 Tampermonkey CSP 设置 -**目的**:移除网站 CSP 头,使 web_execute_js 能在所有页面正常注入执行。 -**路径**:TM 管理面板 → 设置 → 配置模式选「高级」→ 修改内容安全策略(CSP)头信息 → 选「全部移除」→ **点保存按钮** -- ⚠️ 高级设置不会自动保存,必须手动点页面底部的「保存」按钮,否则配置不生效 - -## 阶段二:安装 ljq_web_driver.user.js -**脚本路径**: `../assets/ljq_web_driver.user.js` - -### 方案A(自动化,优先) -本地 HTTP 服务器 + TM 中间页,用 `start` 命令打开: -1. Python 启动 `http.server` 托管脚本(Content-Type: text/javascript) - - ⚠️ 必须用 `Popen(..., stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)` 丢弃输出 - - ❌ 禁用 `stdout=PIPE` 或 `stderr=PIPE`,会导致缓冲区满后服务器阻塞返回空响应 - - Windows 可加 `creationflags=subprocess.CREATE_NO_WINDOW` 避免弹窗 -2. `start "" "https://www.tampermonkey.net/script_installation.php#url=http://127.0.0.1:{port}/ljq_web_driver.user.js"` - - ⚠️ 以上步骤均须用 `Popen` 非阻塞执行,禁止 `subprocess.run`(会等待进程结束) - - 服务器需持续运行直到用户完成安装,用 `Popen` 启动后立即返回继续执行 -3. TM 秒弹安装确认,用户点"安装"即可 - -### 方案B(手动 fallback) -若方案A失败,用剪贴板: -1. 读取脚本内容 → `pyperclip.copy()` -2. 通知用户在 TM 中【新建脚本 → 全选 → 粘贴 → 保存】 - -## 阶段三:验证 -调用 `web_scan` 或注入 JS 心跳检测,确认脚本已生效。 - -## 避坑 (Chromium untrusted 拦截) -- ❌ 直接导航到 `localhost/.user.js` → Chromium 弹 untrusted 拦截 + "另存为",延迟约1分钟 -- ✅ 必须用 `start` 命令(系统级)打开 TM 中间页 URL → 秒弹安装,无拦截 -- 此问题 Chrome 和 Edge 均存在(Chromium 内核通病) \ No newline at end of file +## 验证 +⚠ web_scan 显示「没有可用标签页」不一定是扩展没装好,可能是浏览器未打开或只有 blank 页。 +此时禁止乱试,先用 `start "" "https://www.baidu.com"` 打开一个正常页面,再 `web_scan` 确认。 +若仍不可用,无法自动探测默认浏览器是哪个、插件装在了哪个浏览器、或是否已安装——此时请求用户协助。 \ No newline at end of file