Skip to main content

browser-guide

Best practices for using the managed browser — handling login walls, CAPTCHAs, lazy-loaded content, paywalls, and tab cleanup. Target=camoufox 主力路径。

Informações da origem

Repositório
TeamWiseFlow/xiaobei
Última atividade na origem
13 de setembro de 2026 às 14:56
Idioma detectado do SKILL.md
Vários idiomas
Estrelas
8.574
Forks
1.455

Opções de instalação

Por padrão, está selecionado o prompt que primeiro revisa a origem. Você pode mudar para um comando direto ou baixar uma cópia local.

Revise os arquivos de origem

Leia o SKILL.md e os arquivos complementares exibidos pelo SkillsMP antes de decidir se vai instalar.

Exibindo SKILL.md

SKILL.md
Instruções da origem · Visualização somente leitura
name
browser-guide
description
Best practices for using the managed browser — handling login walls, CAPTCHAs, lazy-loaded content, paywalls, and tab cleanup. Target=camoufox 主力路径。
metadata
{"openclaw":{"emoji":"🌐"}}
# Browser Best Practices Follow these rules whenever you drive a browser against web pages. ## 0. 浏览器后端选择(先读这一节) 本 skill 默认主力路径是 **`target=camoufox`**——即全局可用的 `camoufox-cli` 命令。**下方所有操作命令、示例、selector 都只针对 `target=camoufox`** 写。 如果你当前是 **`target=host`**(existing-session 真机 Chrome + chrome-mcp relay)或 **`target=node`**(remote-cdp 远端 Chrome): - **只按本 skill 列出的「流程 / 步骤 / 提示事项」执行**——不要照搬下面的 `camoufox-cli ...` 命令、`snapshot` ref、`eval` 入参等具体操作和示例。 - 浏览器操作走你当前后端自带的浏览器工具语义(host: chrome-mcp relay;node: remote-cdp + playwright-core),按各后端自身约定调用即可。 - 何时有头 / 何时无头、登录流程顺序、CAPTCHA 处理原则、lazy-load 滚动节奏、paywall 等用户交互约定是**后端无关**的,照本 skill 执行。 ### 0.1 camoufox-cli 基本用法 ``` camoufox-cli --session <name> [--persistent] [--headed] [--json] <command> [args...] ``` - **`--session <name>`**:会话隔离单元,同名 session 共享一个 profile 目录。**涉及登录的平台用一个且只用一个持久化 session 名**。 - **`--persistent`**:冻结指纹到 `~/.camoufox-cli/profiles/<name>/camoufox-cli.json`(首次生成后冻结)。持久化平台 session 必带;临时性 session(新闻等不登录站点)**不带**——走默认临时 profile,每次随机指纹,关闭自清。 - **`--headed`**:有头模式。**需要用户配合过验证码、收短信的,或者填表场景,必须 `--headed`**。例外:**微信公众号 wx_mp 与微信视频号 wechat-channel** 可无头截图二维码发用户远程扫码(按各自专家包约定:截 QR PNG 发用户聊天窗口 → 用户手机扫码 → 轮询 URL 确认登录就位);无头下二维码渲染失败(等 10s 仍无 QR img、截图空白或「加载失败」)才 teardown 换 `--headed` 弹窗兜底。**微博 / 闲鱼等扫码登录页维持必须 `--headed`** 弹窗让用户在浏览器里手动扫码。其他场景,包括探活,都可以使用默认的无头模式。 - **`--viewport <WxH>`**:固定窗口尺寸,如 `1920x1080`。camoufox 默认按指纹给**移动端窗口比例**,导致有头登录时二维码看不全;`--headed` 兜底扫码登录(微博 / 闲鱼等)或窗口内容看不全时加 `--viewport 1920x1080` 强制桌面比例。业务无头操作无需此 flag。 - **`--json`**:命令输出走 JSON 信封(`{ok, ...}` / `{error, ...}`),agent 解析稳定,推荐常带。 - 命令集(含 `upload` / `identity export`): `open / back / forward / reload / url / title / close / snapshot / click / fill / type / select / check / hover / press / text / eval / screenshot / pdf / scroll / wait / tabs / switch / close-tab / sessions / cookies / install / upload / identity` **fail-first 队列**:同一 session 已有命令在跑时,新命令**直接 fail**,返回文本: ``` session <name> 正忙,请等待当前操作完成后再试 ``` 读到这条 fail 文本说明有其他进程在使用同名session,你应该等待一段时间后再重试,卡死用 `camoufox-cli close --all` 兜底 teardown。 ### 0.2 snapshot ref 优先 camoufox-cli 的 `snapshot` 返回带 ref 的语义快照(`@e1` `@e2` …),后续 `click` / `fill` / `type` / `upload` / `hover` / `press` 全部**优先传 ref**,不要自己 hack CSS selector。找不到元素时**先 snapshot 看真实 DOM 结构**再决定 selector 改写,不要盲试。 ### 0.3 用后即关(critical — 机器会被撑死) 每个 `camoufox-cli --session <s> open` 都会拉起一个独立 daemon + 完整 Firefox 实例(每个 200-400MB + 若干 content 进程)。**不关就一直在**,一次任务里开几十个 session 又不 close,很容易造成系统内存耗尽而发生严重的后果。 铁律: - **临时性 session(搜索 / 抓取 / 不登录站点)**:用完**立即** `camoufox-cli --session <s> --json close`。哪怕后面还要搜,也先 close 再开下一个,或干脆**复用同一个 session 名**(不要每次 `search-$(date +%s)` 起新名)——同名 session 复用同一个 daemon,不堆积。 - **持久化 session(登录态平台)**:登录/取数结束后也 close。登录态存在 profile 目录里(`~/.camoufox-cli/profiles/<name>/`),**daemon 退出不丢登录**,下次 `open` 自动加载。持久化 ≠ 一直开着。 - **批量收尾**:一个任务结束前,`camoufox-cli --json close --all` 兜底清掉所有自己开的 session。 - **不要**每条搜索一个唯一 session 名还不 close。这是已确认的死机模式。 > 源头已有兜底:全局并发 daemon 上限 6(超了驱逐最老的)。但 skill 侧仍必须自觉 close——兜底是最后防线,不是不关的理由。 --- ## 1. Login Prompts When a page shows a login wall, first identify which login mechanism is offered, then follow the matching procedure below. **General constraint: retry at most 2 times per login attempt — frequent retries risk account suspension.** ### 1-A. Browser saved credentials 1. Check whether the login form has auto-filled credentials from saved passwords. If so, use them. 2. On failure, continue to 1-B / 1-C / 1-D as appropriate. ### 1-B. QR Code login When the login page shows a QR code (WeChat Official Account backend, WeChat Channels, Xiaohongshu creator centre, X/Twitter, etc.): 1. `camoufox-cli --session <s> --json screenshot /tmp/qr-<platform>.png` 截下 QR 图(或 `snapshot` 拿到 QR 元素 ref 后用 `eval` 取其 `src`/`data URI`)。 2. Send the QR code image to the user via message — send the image itself, not the local file path. 3. Notify the user: > "**[平台名称]** 登录已失效(或首次使用),请用 **[平台]** APP 扫描以下二维码登录。扫码并在手机上点击确认后,回复"已扫码"。" 4. **Stop and wait** for the user to reply "已扫码"、"好了"、"扫完了" or any equivalent confirmation before continuing. 5. While waiting, poll the page every **3 seconds** (`snapshot` 看 URL 是否跳走 / QR 元素是否消失 / dashboard 是否出现). Auto-detected → resume immediately without waiting for user reply. 6. If no scan within **3 minutes** and no reply arrives, send: _"扫码超时,将继续处理当前可访问的内容。"_ and proceed. > **显式有头/无头模式场景规则**:只有以下场景需要显式指定 `camoufox-cli` 的有头/无头参数: > 1. **login-manager 登录**(douyin / kuaishou / bilibili / xhs-publish / xhs-browse 5 平台)——强制 `--headed`,用户在浏览器手动扫码/短信/账号密码 > 2. **需要用户手动过验证**(captcha / 滑块 / 短信)——`--headed`,用户才能在浏览器里手动操作 > 3. **web-form-fill 表单填报**——强制 `--headed`,便于用户时刻观察填报情况、可随时介入纠正 > > 其他场景默认走 camoufox 持久化 session,**不显式指定有头/无头**——camoufox-cli 默认行为即可。 ### 1-C. SMS verification login When the login page asks for a phone number and SMS verification code: 1. Ask the user for the registered phone number for this platform: > "**[平台名称]** 需要手机验证码登录,请告知您在该平台注册的手机号。" 2. Once received, enter the phone number and trigger the SMS code request. Attempt at most **2 times** if the first trigger fails. 3. Ask the user for the verification code: > "短信验证码已发送,请将收到的验证码回复给我。" 4. Enter the code and complete login. If login fails, inform the user and proceed with accessible content — **do not retry a third time**. ### 1-D. Username / password login When only a username + password form is available: 1. Check for browser-saved credentials first (see 1-A). 2. If none, ask the user for their preference: > "**[平台名称]** 需要账号密码登录,浏览器中未找到预存密码。请选择:① 您自行在浏览器中登录后告知我,② 告知用户名和密码由我代为登录。" 3. If the user chooses ②, receive the credentials and attempt login. Retry at most **2 times** on failure. 4. If login fails after 2 attempts, inform the user and continue with accessible content. ### 1-E. Fallback — login not possible If login cannot be completed for any reason (timeout, user unavailable, repeated failures): - **Do NOT stop or abort the task.** - Continue with whatever content is accessible in the non-logged-in state. - At the end, include a note in the result: _"注:[平台名称] 未能完成登录,以下内容来自未登录状态,可能不完整。"_ --- ## 2. Simple Verification / CAPTCHA When a page shows a one-click verification challenge (e.g., a button labelled "去验证", "Verify", "I'm not a robot", or a simple checkbox): 1. Try clicking the verification button/checkbox directly(`camoufox-cli --session <s> --json click <ref 或 selector>`). 2. Wait a few seconds for the page to refresh. 3. `snapshot` 检查正常内容是否已加载. 4. If the page now shows the expected content, continue your task. --- ## 3. Complex Verification Fallback If the simple click in Step 2 above **fails** — the page still shows a challenge, the challenge is a puzzle/slider/image-selection CAPTCHA, or an error occurs: 1. **Do NOT retry blindly.** Stop attempting automated verification. 2. Send a message to the user: _"xx 页面有验证码,我无法解决,请在浏览器中完成,完成后请通知我。"_(xx 为页面标题). > 涉及登录的 session 必须是 **有头模式**,用户才能在浏览器里手动过验证。无头跑出来的 session 遇验证码先 teardown 再换有头重开。 3. Wait for the user to confirm. 4. If no response arrives within **5 minutes**, continue with whatever content is accessible. --- ## 4. Lazy-Loaded Content When a page uses lazy loading (infinite scroll, "load more" sections, content that appears only after scrolling): 1. Before scrolling, assess whether the not-yet-loaded content is **relevant** to the current task. 2. If relevant, simulate human-like scrolling: `camoufox-cli --session <s> --json scroll down` 增量滚动,pause briefly between scrolls to allow content to load, then `snapshot` capture new content. 3. Repeat until the needed content is visible or no more new content loads. 4. Do NOT scroll too fast, do it as a human would. After 7 times of scrolling, you should stop this turn. 5. If not relevant, skip scrolling and work with what is already loaded. --- ## 5. 页面内 JS 执行(`eval` / `act kind="evaluate"`) camoufox-cli 的 `eval` 在页面上下文跑一段 JS 并回结果。**入参必须是一个单一表达式**,不是语句块。`const`/`let`/`var` 声明、分号、`for`/`if` 语句、`function` 声明都会触发 `Invalid evaluate function` 错误。 **Wrong**(语句块 — 会失败): ```js const items = document.querySelectorAll('.msg'); let found = false; for (const item of items) { if (item.textContent.includes('target')) { found = true; break; } } found ? 'ok' : 'no'; ``` **Correct**(IIFE 包裹): ```js (function() { var items = document.querySelectorAll('.msg'); for (var i = 0; i < items.length; i++) { if (items[i].textContent.indexOf('target') > -1) { return items[i].innerText; } } return 'not found'; })() ``` **Correct**(纯表达式,简单查询): ```js document.querySelector('.reply-btn') ? 'found' : 'not found' ``` Rules: - Always wrap multi-step logic in an IIFE: `(function(){ ... })()` - 只需要点击的 DOM 查询,优先 `click <ref>` 而非 `eval` - 读文本优先 `snapshot` 而非 `eval` - Never use `const`/`let`/`var` declarations or `;` at the top level of `fn` --- ## 6. Paywall / Subscription Walls When a page indicates that content is behind a paywall or requires a specific subscription (e.g., "Subscribe to continue reading", "Continue reading with a WSJ subscription", premium-only banners): 1. Send a message to the user describing the situation: _"xx 页面需要订阅,请在浏览器中登录有效账号或者完成付费,完成后请通知我。"_(xx 为页面标题). 2. Wait for the user to confirm. 3. If no response arrives within **5 minutes**, continue with whatever content is accessible (summary, headline, or any visible excerpt).
Ver no GitHub