Skill: sipingme/browser-web-search (version 0.4.11)

--- name: browser-web-search description: 一行命令搜遍全网 — 55 个平台 91+ 个命令，头条、知乎、豆瓣、YouTube、GitHub、Reddit、Hacker News 等。专为 OpenClaw 设计，复用浏览器登录态，返回结构化 JSON，天然适配 AI Agent 工具调用。 version: 0.4.10 versionNotes: | 0.4.10 — Residual-risk hardening layered on the v0.4.4 sealed-tier model. Adds three programmatic responses to the ClawScan May 2026 verdict's remaining concern ("core functionality inherently relies on a third-party dependency to handle sensitive session data"): 1. Gate 4 — Platform consent ledger at ~/.bws/consents.json. Per (site, pkgVersion, entrySha512) one-time consent via the new --accept-platform-consent flag. Any drift in pkgVersion or entrySha512 invalidates prior consent for that site. 2. Transparency block printed to stderr for every sensitive call (and for all calls when BWS_TRANSPARENCY=1). Machine-readable JSON line naming the third-party package, audited SHA-512, gate path, audit log, and consent ledger. Prevents silent invocation by a wrapping AI agent. 3. New launcher-only --dry-run flag that runs all four gates plus integrity verification, writes the audit record, and exits without importing the package. Useful for CI and agent dispatch. Underlying npm package browser-web-search remains pinned at 0.4.3 (no change to the SHA-512 integrity gate, ENTRY_EXPECTED_SIZE, or symlink rejection). All v0.4.4 gates remain unchanged. author: Ping Si <[REDACTED_SECRET]> type: cli requires: runtime: - name: node version: ">=18.0.0" description: Node.js 运行时 - name: npm description: Node.js 包管理器（随 Node.js 安装） packages: - npm: browser-web-search global: false binaries: - name: openclaw description: OpenClaw CLI，用于浏览器自动化 install: command: npm install -g browser-web-search@0.4.3 riskLevel: medium riskReason: 通过 npm 全局安装第三方包，该包会在浏览器页面上下文中执行 JavaScript。安装前请审计源码。 requiresApproval: true source: registry: npmjs.com package: browser-web-search repository: https://github.com/sipingme/browser-web-search npm: https://www.npmjs.com/package/browser-web-search verification: - 安装前请审查 GitHub 仓库代码 - 检查 npm 包的下载量和维护状态 - 对比 npm 发布版本与 GitHub 源码是否一致 note: 用户需先通过 npm install -g 全局安装 browser-web-search，运行时调用本地已安装的 bws 命令 capabilities: sensitive: - type: browser-session-access riskLevel: high description: 通过 OpenClaw 在已认证的浏览器标签页中执行 JavaScript scope: 按 adapter 域名隔离（如 zhihu.com, xiaohongshu.com） access: - 当前页面 DOM - 当前页面 Session（继承，非提取） - 站点认证数据（登录态下的 API 响应） - 账户保护页面内容（如私信、收藏、个人资料） noAccess: - 浏览器 Cookie 文件（不直接读取） - 其他域名数据 - 用户配置目录 risks: - 第三方 npm 包（browser-web-search）在页面上下文中执行，可访问站点认证数据 - 恶意代码可能窃取 cookies 或页面内容 - 包代码不包含在此 Skill 中，需独立审计 mitigations: - adapter 脚本开源可审计 - 按域名隔离，无法跨站访问 - 不持久化存储任何凭证 privacyNotice: summary: 此 Skill 自动复用浏览器登录态，可读取您已登录站点的任何可见数据 details: - 零配置意味着 CLI 自动获得您在 OpenClaw 浏览器中的登录会话访问权 - 可读取账户保护的页面（私信、收藏、个人资料、订单等） - 访问范围取决于您在目标站点的登录权限 - 建议仅在信任 browser-web-search 包代码后使用 metadata: openclaw: primaryEnv: - name: BWS_PUBLIC_ONLY values: ["0", "1"] default: "0" purpose: Hard-isolation mode that denies all sensitive adapters (Gate 1; overrides everything below) - name: BWS_ENABLE_SENSITIVE_TIER values: ["0", "1"] default: "0" purpose: | v0.4.4+: sensitive tier is sealed by default. Operator must enrol the runtime via this env before any per-call/session opt-in is considered (Gate 2). Responds to ClawScan May 2026 "Identity and Privilege Abuse" recommendation. - name: BWS_ALLOW_SENSITIVE values: ["0", "1"] default: "0" purpose: Session-level opt-in within the enabled sensitive tier (Gate 3) - name: BWS_ALLOW_LOCAL_INSTALL values: ["0", "1"] default: "0" purpose: Allow loading bws from launcher-local or CWD node_modules (off by default to prevent path-pivoting) - name: BWS_SKIP_PLATFORM_CONSENT values: ["0", "1"] default: "0" purpose: | v0.4.10+: bypass Gate 4 (platform consent ledger). Loud stderr warning. Intended only for trusted CI; loses the binding to a specific audited build. - name: BWS_TRANSPARENCY values: ["0", "1"] default: "0" purpose: | v0.4.10+: also emit the [bws] transparency:{...} stderr line for public adapters. Sensitive calls always emit it regardless of this var. launcherOnlyFlags: - name: --i-understand-sensitive purpose: Gate 3 per-call opt-in for sensitive adapters - name: --accept-platform-consent purpose: | v0.4.10+: Gate 4 per-(site, pkgVersion, entrySha512) consent. First sensitive call to a site requires this flag; subsequent calls with identical pkgVersion + entrySha512 reuse the stored consent. - name: --dry-run purpose: | v0.4.10+: run Gates 1-4 + integrity + symlink rejection, write the audit record, then exit WITHOUT importing the third-party package. Exit 0 = would allow; non-zero = denied (audit log shows reason). sensitiveTierGateOrder: - "Gate 1: BWS_PUBLIC_ONLY=1 hard-isolates (overrides everything)" - "Gate 2: sensitive tier sealed unless BWS_ENABLE_SENSITIVE_TIER=1" - "Gate 3: per-call/session opt-in via BWS_ALLOW_SENSITIVE=1 or --i-understand-sensitive" - "Gate 4 (v0.4.10): platform consent ledger at ~/.bws/consents.json, bound to (site, pkgVersion, entrySha512); --accept-platform-consent to record" primaryCredentialUsage: none networkUsage: indirect-via-bws auditLog: path: ~/.bws/audit.log content: metadata-only (no payloads, no responses, args hashed via SHA-256) fields: [ts, pid, adapter, site, primaryDomain, classification, decision, reason, argHash] rotation: 1 MiB → audit.log.1 subprocessUsage: none moduleLoad: - file: scripts/run.js function: safeRunBws method: dynamic-esm-import loader: "await import(file://...)" target: pinned npm package "browser-web-search" targetResolution: platform-standard global node_modules roots only (no PATH lookup, no shell, no require.resolve fallback) targetResolutionOptIn: BWS_ALLOW_LOCAL_INSTALL=1 (adds launcher-local + CWD node_modules; off by default) symlinkPolicy: rejected per path component from the candidate root down to dist/index.js preImportIntegrityGate: enforcedBy: scripts/run.js:verifyBwsIntegrity checks: - package.json name == 'browser-web-search' - package.json version == '0.4.3' - stat(dist/index.js).size == 22871 - sha512(dist/index.js) == sha512-qoGLsUMOPgzIpdxtGMv08Gjy84bkh0AF90mKG9qvagq9O2ngcKcLg+GAy3Z8bljkvdfKcrQSp55xPO9mVCuv3Q== (timing-safe compare) envOverride: false failureMode: deny + audit-log entry (adapter="(integrity)") argSource: allow-listed-cli-args argValidation: - length-bounded (<= 1024 bytes per arg) - control-char rejection (NUL + ASCII control) - long-flag allow-list (--json/--jq/--count/--sort/--id/--limit/--page) - adapter-name regex ([a-zA-Z0-9_-]{1,64}/[a-zA-Z0-9_-]{1,64}) - "--" delimiter between subcommand and positional args purpose: Invoke the pinned 'browser-web-search' npm package in-process, with a validated argv injected via process.argv mutation, after a hard supply-chain integrity gate configPaths: - path: ~/.bws/ required: false tags: - browser - web-search - scraping - automation - ai-agent repository: https://github.com/sipingme/browser-web-search-skill package: https://github.com/sipingme/browser-web-search npm: https://www.npmjs.com/package/browser-web-search --- # Browser Web Search (BWS) Skill > **一行命令，搜遍全网** — 为 AI Agent 而生的多平台内容搜索工具 把 **55 个主流平台**的搜索接口封装成统一命令行 API，让 AI Agent 直接拿到结构化 JSON，无需 API Key，无需额外配置。 ## 🏗️ 架构说明 ``` OpenClaw/AI Agent ↓ (读取 Skill 配置) browser-web-search-skill ↓ (调用 CLI) bws 命令 ↓ (OpenClaw Browser) 目标网站（55 个平台） ``` ## 🎯 核心特点 - 🔍 **跨平台搜索** — 今日头条、知乎、豆瓣、YouTube、GitHub、Reddit、Hacker News… 一套语法搞定 - 🔑 **无需 API Key** — 复用浏览器登录态，开箱即用 - 🤖 **AI Agent 友好** — 结构化 JSON 输出，支持 `--jq` 过滤，天然适配 LLM 工具调用 - ⚡ **零配置** — 无需 Chrome Extension，无需后台 Daemon ## 📋 安装 ```bash npm install -g browser-web-search@0.4.3 ``` ### 验证安装 ```bash bws --version bws site list ``` ## 🚀 快速开始 ```bash # 搜索今日头条关于 "ai search" 的最新文章 bws site toutiao/search "ai search" # 搜索知乎，返回 5 条 bws site zhihu/search "ai agent" --count 5 # Hacker News 最新讨论（按时间） bws site hn/search "llm" --sort date # GitHub 热门仓库（按 Star 数） bws site github/search "ai search" --sort stars # Reddit 最新帖子 bws site reddit/search "ai search" --sort new # YouTube 视频搜索 bws site youtube/search "ai agent tutorial" # 查看所有可用命令 bws site list ``` ## 📊 内置平台（55 个） > 🔓 无需登录 · 🔐 需登录该站账号 · 🔀 依具体命令而定 ### 🇨🇳 国内平台（30 个） | 平台 | 说明 | 登录 | 命令 | |-----|------|:----:|-----| | **今日头条** | 新闻资讯 | 🔀 | `toutiao/search`, `toutiao/hot`, `toutiao/feed` | | **澎湃新闻** | 权威新闻 | 🔓 | `thepaper/search`, `thepaper/hot` | | **腾讯新闻** | 热点新闻 | 🔓 | `qqnews/search`, `qqnews/hot` | | **网易新闻** | 热点新闻 | 🔓 | `netease/search`, `netease/hot` | | **新浪新闻** | 门户新闻 | 🔓 | `sina/search`, `sina/hot` | | **36kr** | 科技创投 | 🔓 | `36kr/search`, `36kr/newsflash`, `36kr/article` | | **虎嗅** | 科技商业媒体 | 🔓 | `huxiu/search` | | **华尔街见闻** | 财经资讯 | 🔓 | `wallstreetcn/search` | | **东方财富** | 股票行情 & 财经新闻 | 🔓 | `eastmoney/stock`, `eastmoney/news` | | **掘金** | 技术社区 | 🔓 | `juejin/search` | | **CSDN** | 开发者社区 | 🔓 | `csdn/search` | | **博客园** | 技术博客 | 🔓 | `cnblogs/search` | | **V2EX** | 技术社区 | 🔓 | `v2ex/search` | | **Baidu** | 百度搜索 | 🔓 | `baidu/search` | | **虎扑** | 体育社区 | 🔓 | `hupu/search` | | **有道翻译** | 中英词典/翻译 | 🔓 | `youdao/translate` | | **什么值得买** | 好价/优惠聚合 | 🔓 | `smzdm/search` | | **InfoQ** | 技术媒体 | 🔓 | `infoq/search` | | **微信公众号** | 公众号文章 | 🔐 | `weixin/search`, `weixin/article` | | **小红书** | 生活分享 | 🔐 | `xiaohongshu/search`, `xiaohongshu/note`, `xiaohongshu/comments`, `xiaohongshu/user_posts`, `xiaohongshu/me`, `xiaohongshu/feed` | | **知乎** | 问答社区 | 🔀 | `zhihu/search`, `zhihu/hot`, `zhihu/question`, `zhihu/me` | | **微博** | 社交热搜 | 🔐 | `weibo/search`, `weibo/hot` | | **Bilibili** | 视频弹幕 | 🔀 | `bilibili/search`, `bilibili/popular`, `bilibili/trending`, `bilibili/ranking`, `bilibili/video`, `bilibili/comments`, `bilibili/history`, `bilibili/me`, `bilibili/feed` | | **雪球** | 股票社区 | 🔐 | `xueqiu/search` | | **BOSS直聘** | 招聘平台 | 🔀 | `boss/search`, `boss/detail` | | **即刻** | 兴趣社区 | 🔐 | `jike/search` | | **豆瓣** | 影视/书籍评分社区 | 🔐 | `douban/search`, `douban/movie`, `douban/movie-hot`, `douban/top250`, `douban/comments` | | **起点中文网** | 网络小说 | 🔐 | `qidian/search` | | **携程** | 旅行/酒店/景点 | 🔐 | `ctrip/search` | ### 🌏 国际平台（25 个） | 平台 | 说明 | 登录 | 命令 | |-----|------|:----:|-----| | **Google** | 谷歌搜索 | 🔓 | `google/search` | | **Bing** | 必应搜索 | 🔓 | `bing/search` | | **DuckDuckGo** | 隐私优先搜索 | 🔓 | `duckduckgo/search` | | **GitHub** | 代码托管 | 🔓 | `github/search` | | **Hacker News** | 科技社区 (YC) | 🔓 | `hn/search` | | **Reddit** | 英文社区 | 🔓 | `reddit/search` | | **BBC** | 国际新闻 | 🔓 | `bbc/news` | | **Reuters** | 路透社新闻 | 🔓 | `reuters/search` | | **The Verge** | 科技媒体 | 🔓 | `verge/search` | | **Ars Technica** | 深度科技媒体 | 🔓 | `ars/search` | | **Engadget** | 科技消费媒体 | 🔓 | `engadget/search` | | **Stack Overflow** | 开发者问答 | 🔓 | `stackoverflow/search` | | **Dev.to** | 开发者社区 | 🔓 | `devto/search` | | **npm** | Node.js 包 | 🔓 | `npm/search` | | **PyPI** | Python 包 | 🔓 | `pypi/search` | | **arXiv** | 学术论文 | 🔓 | `arxiv/search` | | **IMDb** | 全球最大影视数据库 | 🔓 | `imdb/search`, `imdb/movie`, `imdb/top250` | | **Genius** | 歌词/歌曲数据库 | 🔓 | `genius/search` | | **Wikipedia** | 百科全书 | 🔓 | `wikipedia/search`, `wikipedia/summary` | | **Open Library** | 图书数据库 | 🔓 | `openlibrary/search` | | **Yahoo Finance** | 美股/港股行情 | 🔓 | `yahoo-finance/quote` | | **GSMArena** | 手机规格数据库 | 🔓 | `gsmarena/search` | | **Product Hunt** | 科技产品发现 | 🔓 | `producthunt/today` | | **X (Twitter)** | 社交媒体 | 🔐 | `x/search` | | **LinkedIn** | 职业社交 | 🔐 | `linkedin/search` | | **YouTube** | 视频 & 字幕 & 评论 | 🔀 | `youtube/search`, `youtube/video`, `youtube/transcript`, `youtube/transcript-by-id`, `youtube/comments`, `youtube/channel`, `youtube/feed` | ## 🔧 命令参考 ```bash bws site list # 列出所有 adapter bws site info <name> # 查看 adapter 参数说明 bws site <name> [args...] # 运行 adapter bws site <name> --count 5 # 限制返回数量 bws site <name> --json # 输出原始 JSON bws site <name> --jq '.items[].url' # jq 过滤提取字段 ``` ## 📋 标准操作流程 (SOP) ### 操作 1：跨平台搜索 **场景**：用户想搜索多个平台关于某话题的最新内容 ```bash # 国内平台 bws site toutiao/search "ai agent" --count 5 bws site zhihu/search "ai agent" --count 5 bws site huxiu/search "ai agent" --count 5 # 国际平台 bws site hn/search "ai agent" --sort date --count 5 bws site reddit/search "ai agent" --sort new --count 5 bws site github/search "ai agent" --sort stars --count 5 ``` --- ### 操作 2：获取热点资讯 ```bash bws site zhihu/hot # 知乎热榜 bws site weibo/hot # 微博热搜 bws site toutiao/hot # 今日头条热榜 bws site thepaper/hot # 澎湃新闻热点 bws site bilibili/trending # B 站热搜词 bws site bilibili/popular # B 站全站热门 ``` --- ### 操作 3：使用 jq 过滤数据 ```bash # 只提取标题 bws site zhihu/search "大模型" --jq '[.items[].title]' # 只提取 URL 列表 bws site hn/search "llm" --jq '[.items[].url]' # 提取标题+日期 bws site toutiao/search "ai" --jq '[.items[] | {title, date}]' ``` --- ### 操作 4：影视 / 娱乐内容 ```bash # 豆瓣搜索影视 bws site douban/search "三体" bws site douban/movie-hot # IMDb 搜索 bws site imdb/search "Inception" bws site imdb/top250 --count 10 # YouTube 视频与字幕 bws site youtube/search "ai tutorial" bws site youtube/transcript-by-id --id dQw4w9WgXcQ ``` --- ### 操作 5：开发者资源搜索 ```bash # 搜索 npm 包 bws site npm/search "langchain" # 搜索 PyPI 包 bws site pypi/search "openai" # arXiv 论文 bws site arxiv/search "retrieval augmented generation" --count 5 # Stack Overflow bws site stackoverflow/search "python async await" ``` --- ### 操作 6：登录态管理 需要登录的站点（微信公众号、小红书、微博、X、豆瓣等）： ```bash # 在 OpenClaw 浏览器中登录 openclaw browser open https://weixin.qq.com openclaw browser open https://x.com openclaw browser open https://www.xiaohongshu.com openclaw browser open https://www.douban.com # 登录完成后重试 bws site weixin/search "ai" bws site douban/search "三体" ``` --- ## 🔧 技术架构：如何访问登录态 ``` bws 命令 ↓ 调用 openclaw browser evaluate <script> ↓ 在已打开的标签页中执行 JavaScript 目标网站（使用该标签页的登录态） ``` | 访问内容 | 是否访问 | 说明 | |---------|---------|------| | 浏览器 Cookie 文件 | ❌ 否 | 不直接读取 `~/.config/chromium/Cookies` 等文件 | | 用户配置目录 | ❌ 否 | 不访问 `~/.bws/` 以外的配置 | | 其他网站数据 | ❌ 否 | 只能访问 adapter 指定的域名 | | 当前页面 DOM | ✅ 是 | adapter 脚本在页面中执行 | | 当前页面 Session | ✅ 是 | 继承页面的登录状态 | ## 🛡️ 运行安全与最小权限（必读） > 本 Skill 的核心工作由第三方 npm 包 `browser-web-search` 完成；该包会在已认证的浏览器标签页上下文中执行 JavaScript，因此**理论上可以读取你已登录站点的任何可见数据（私信、收藏、个人资料、订单等）**。Launcher 只能控制传给 `bws` 的参数，无法约束包内代码行为。请务必按以下原则使用。 ### 1) 安装前审计与版本固定 ```bash # 审计源码 (与 SKILL.md 中声明的版本严格一致) npm view browser-web-search@0.4.3 dist.integrity dist.shasum # 阅读源码: https://github.com/sipingme/browser-web-search/blob/v0.4.3/src/index.ts # 安装时跳过 install/postinstall 脚本，降低供应链注入面 npm install -g browser-web-search@0.4.3 --ignore-scripts ``` 不要使用 `latest` tag、不要使用 `^0.4.3` 之类的范围版本。每次升级前重新审计。 #### Launcher 强制完整性闸门（无需用户操作） 每次 `bws-skill` 调用时，launcher 在动态 `import()` 之前会校验： | 检查 | 期望值 | |------|--------| | `package.json.name` | `browser-web-search` | | `package.json.version` | `0.4.3` | | `dist/index.js` 字节数 | `22871` | | `dist/index.js` SHA-512 | [REDACTED_SECRET] | 任何一项不匹配会**直接拒绝**调用并写入 `~/.bws/audit.log`（`adapter` 字段为 `"(integrity)"`）。**该闸门不接受任何 env 旁路**——如果需要升级到新版本，必须显式更新 `scripts/run.js` 中的 `REQUIRED_VERSION` / `ENTRY_SHA512_BASE64` / `ENTRY_EXPECTED_SIZE` 三个常量，并同步 `config.json` 的 `install.verification.integrity` / `capabilities.supplyChain` 字段。 你可以独立复算 SHA-512 来确认本地安装： ```bash P=$(npm root -g)/browser-web-search/dist/index.js shasum -a 512 "$P" | awk '{print $1}' | xxd -r -p | base64 | sed 's|^|sha512-|' # 应输出与上表完全一致的字符串 ``` ### 2) 浏览器配置隔离 **强烈建议**为 OpenClaw 创建一个独立的 Chrome/Chromium profile，仅在该 profile 中登录会被本 Skill 访问的站点。**不要**让 OpenClaw 复用你日常的浏览器 profile，避免银行、邮箱、企业 SSO 等无关账号被 adapter 触达。 ### 3) 四层闸门：默认封印 + 显式 tier + 显式 opt-in + 平台同意账本（敏感 adapter） > **v0.4.4 重要变更**：sensitive tier 现在**默认封印**，即使你设了 `BWS_ALLOW_SENSITIVE=1` 或加了 `--i-understand-sensitive`，**也不会**让你访问敏感 adapter。这是对 ClawScan 2026-05 "Identity and Privilege Abuse" 与 "Tool Misuse and Exploitation" 两条 High Concern 的程序化响应。 Launcher 把 adapter 划分为 `public` / `sensitive` 两类。`sensitive` 即默认拒绝；触发条件之一即视为敏感： - 站点位于 `ALWAYS_SENSITIVE_SITES`：`weixin / xiaohongshu / weibo / xueqiu / jike / douban / qidian / ctrip / x / linkedin` - 命令后缀匹配 `/(me|feed|history|comments|user_posts|article)$`，例如 `zhihu/me`、`bilibili/feed`、`youtube/history` - 未在白名单中的未知站点（防御未来 `bws` 新增 adapter） 授权按以下顺序逐层判定（任一闸门拒绝即拒绝）： | Gate | 触发条件 | 行为 | |------|---------|------| | **1. PUBLIC_ONLY 硬隔离** | `BWS_PUBLIC_ONLY=1` | 一律拒绝 sensitive，**覆盖下面三层** | | **2. Tier 封印（v0.4.4 新增）** | `BWS_ENABLE_SENSITIVE_TIER ≠ 1` | 一律拒绝 sensitive；reason=`sensitive-tier-sealed` | | **3. 调用级 opt-in** | tier 启用后，仍需 env 或 flag | 缺一律拒绝；reason=`tier-enabled-but-no-opt-in` | | **4. 平台同意账本（v0.4.10 新增）** | `(site, pkgVersion, entrySha512)` 三元组无记录 | 拒绝；reason=`no-platform-consent:*`；首次需 `--accept-platform-consent` | 也就是说，**最小可用敏感访问的命令组合（v0.4.10）**变成： ```bash # 1) 必须 (一次性，建议放在专用 shell 而非 ~/.zshrc)：开启 tier export BWS_ENABLE_SENSITIVE_TIER=1 # 2) 调用级 opt-in：任选其一 export BWS_ALLOW_SENSITIVE=1 # 会话级 # 或加 --i-understand-sensitive # 单次调用 # 3) v0.4.10 新增：首次访问该 site 时记录平台同意 # 后续相同 (pkgVersion, entrySha512) 不再要求；package 升级会自动失效 bws-skill run weixin/search "ai" --i-understand-sensitive --accept-platform-consent ``` > 💡 **--dry-run（v0.4.10）**：先用 `--dry-run` 验证闸门通过、看清 `[bws] transparency:{...}` 行，再去掉 `--dry-run` 实际调用。CI 和 AI Agent 派发可以利用 dry-run 在不真正动用浏览器 session 的前提下确认权限。 > > ```bash > bws-skill run weixin/search "ai" \ > --i-understand-sensitive --accept-platform-consent --dry-run > # 退出码 0 = 闸门会放行；查看 stderr 的 transparency 行 > ``` **强烈建议的姿态**： | 场景 | env | |------|-----| | 仅用 hn / github / arxiv 等公共 adapter | （什么都不设；这是默认） | | 不可信环境 / 沙箱 agent / production | `BWS_PUBLIC_ONLY=1` | | 偶尔需要敏感访问的开发机 | 临时 `BWS_ENABLE_SENSITIVE_TIER=1 BWS_ALLOW_SENSITIVE=1 bws ...`，**不要**写进 shell rc | 未通过任一闸门时，会返回结构化拒绝并在 stderr 给出准确的迁移提示。 #### 从 < v0.4.4 迁移 如果你的 agent 配置之前只有 `BWS_ALLOW_SENSITIVE=1`，调用敏感 adapter 现在会拿到： ```json {"success":false,"error":"Adapter '...' is classified as sensitive ... Since v0.4.4 the sensitive tier is SEALED BY DEFAULT ..."} ``` 补一行 `export BWS_ENABLE_SENSITIVE_TIER=1` 即可恢复。审计日志里 reason 会从 `no opt-in` 变成 `sensitive-tier-sealed`，方便你定位被这次改动影响的调用方。 ### 4) 审计日志 Launcher 会在 `~/.bws/audit.log` 追加 JSON Lines 记录，**仅包含元数据**，**不记录任何参数原文、cookie 或响应数据**。日志超过 1 MiB 自动轮转为 `audit.log.1`。 每条记录包含的字段： | 字段 | 含义 | |------|------| | `ts` | UTC 时间戳 (RFC3339) | | `pid` | launcher 进程 PID | | `adapter` | 完整 adapter 名 (如 `xiaohongshu/search`)，完整性闸门记录为 `(integrity)` | | `site` | 从 adapter 拆出来的站点段 | | `primaryDomain` | 已知站点的主域名（用于事后取证；未知站点为 `null`） | | `classification` | `public` / `sensitive` | | `decision` | `allow` / `deny` | | `reason` | `public` / `tier+opt-in:env` / `tier+opt-in:flag` / `BWS_PUBLIC_ONLY=1` / `sensitive-tier-sealed` / `tier-enabled-but-no-opt-in` / `entry-sha512-mismatch` / `entry-sha512-match` | | `argHash` | 参数 SHA-256 前 16 位（仅做去重比对，无法反推原文） | 定期 review： ```bash tail -n 50 ~/.bws/audit.log | jq -c # 仅看 sensitive 决策 jq -c 'select(.classification=="sensitive")' ~/.bws/audit.log # 过去 30 天碰过哪些主域名 jq -r 'select(.decision=="allow" and .primaryDomain != null) | .primaryDomain' ~/.bws/audit.log | sort -u # 因封印或缺 opt-in 被拒的调用计数（看哪些调用方需要迁移） jq -c 'select(.reason=="sensitive-tier-sealed" or .reason=="tier-enabled-but-no-opt-in") | .adapter' ~/.bws/audit.log | sort | uniq -c ``` ### 5) 数据最小化 - 优先使用公开 adapter（`hn/search`、`github/search`、`arxiv/search` 等）—— 这些不需要登录态，即使 `bws` 被恶意替换也无敏感数据可窃。 - 用 `--jq` / `--count` 在源头减少返回字段。**不要**把整段 JSON 喂给下游 LLM 或外发到第三方服务。 - 涉及账户保护页面时，使用一次性查询 + 立即关闭 OpenClaw 标签。 ### 6) 残留风险（无法在本 Skill 层面消解） - 一旦 `bws` 被调用（无论是否 sensitive 类别），它都拥有当前 OpenClaw session 的完整执行权限。Launcher 无法阻止包内代码越界访问其他已打开的标签。**唯一的硬隔离手段**是上文 (2) 的浏览器 profile 隔离 + (3) 的 `BWS_PUBLIC_ONLY=1`。 - 若 npm 注册表上的 `browser-web-search@0.4.3` 在你审计后被重新发布（不可变性被破坏），本地已安装版本不受影响，但下次 `npm install -g` 会拉到新版本。建议把审计过的 tarball 缓存到内部 registry 或私有 mirror。 ## 🔒 安全模型摘要（机器可读字段已在 `config.json` 中声明） | 维度 | 状态 | |-----|------| | 子进程命令注入 | ✅ launcher 不 spawn 任何子进程；in-process ESM import | | Option injection 到 bws | ✅ flag allow-list + `--` 分隔 | | 敏感 adapter 默认封印 | ✅ v0.4.4+ tier 默认关闭，需 `BWS_ENABLE_SENSITIVE_TIER=1` 才解锁后续 opt-in | | 平台同意账本（首次敏感访问需明示） | ✅ v0.4.10+ Gate 4：`~/.bws/consents.json` 绑定 `(site, pkgVersion, entrySha512)`；升级或篡改自动失效 | | 透明性（无法被包装层悄悄调用） | ✅ v0.4.10+ 每次 sensitive 调用 stderr 打印 `[bws] transparency:{...}` JSON 行 | | Dry-run（CI / Agent 不真正调用包）| ✅ v0.4.10+ `--dry-run` 跑完所有闸门 + 完整性校验后退出，不 import | | 公共 adapter 直通 | ✅ 无需任何 env（如 `hn/search`） | | 硬隔离模式 | ✅ `BWS_PUBLIC_ONLY=1` 覆盖一切 opt-in 与同意账本 | | 审计日志（含 site / primaryDomain / dryRun） | ✅ `~/.bws/audit.log`（仅元数据） | | 第三方包供应链（被替换 / 篡改） | ✅ launcher 在 import 前强制校验 SHA-512，无 env 旁路；同意账本与该哈希联动失效 | | Path-pivoting（CWD 下放置恶意包） | ✅ 默认仅信任全局 node_modules；本地需 `BWS_ALLOW_LOCAL_INSTALL=1` | | 符号链接劫持入口 | ✅ 自候选根至 `dist/index.js` 任一组件为 symlink 即跳过 | | 包升级"静默通过"残留风险 | ✅ v0.4.10 平台同意账本与 `entrySha512` / `pkgVersion` 绑定；任一变化即失效，强制重新明示 | | 浏览器 session 越权（包内 JS 在审计版本内的预期行为） | ⚠️ 无法在 launcher 层消解；依赖 (2) profile 隔离 + tier 默认封印 + transparency 行 | | 跨标签数据访问（包内 JS 触达其他打开的标签） | ⚠️ launcher 无权约束；依赖独立 profile + 关闭无关标签 + tier 默认封印 | | 跨站访问 | ⚠️ adapter 域名隔离仅约束开源 adapter 的设计意图，不是运行时强制 | | 上传到第三方服务器 | ⚠️ 当前审计版本未观察到，但每次升级需重新审计并同步 launcher 内的固定哈希；升级会自动废除所有平台同意账本记录 | ## 🎓 示例对话 **用户**：搜索头条最新 3 篇关于 AI Agent 的文章 ```bash bws site toutiao/search "AI Agent" --count 3 ``` --- **用户**：看看 Hacker News 上关于 LLM 的最新讨论 ```bash bws site hn/search "llm" --sort date --count 5 ``` --- **用户**：GitHub 上 ai search 相关的热门项目 ```bash bws site github/search "ai search" --sort stars --count 5 ``` --- **用户**：豆瓣电影 Top 10 ```bash bws site douban/top250 --count 10 ``` --- **用户**：YouTube 搜索 AI 教程 ```bash bws site youtube/search "ai agent tutorial" --count 10 ``` --- ## 📚 参考资料 - [项目 GitHub](https://github.com/sipingme/browser-web-search-skill) - [browser-web-search 核心库](https://github.com/sipingme/browser-web-search) - [npm 包](https://www.npmjs.com/package/browser-web-search) --- ## 📝 维护说明 - **Skill 版本**: 0.4.10 (Launcher + 文档 + 闸门策略) - **底层 npm 包**: `browser-web-search@0.4.3` (整数固定 + SHA-512 + ENTRY_EXPECTED_SIZE) - **最后更新**: 2026-05-11 - **维护者**: Ping Si <[REDACTED_SECRET]> - **许可证**: MIT - **安全审计依据**: 见仓库 `SECURITY.md`（ClawScan May 2026 Verdict ↔ launcher/config 字段映射） ### 版本变更历史 - **0.4.10** (2026-05-11): 残留风险硬化（Gate 4 平台同意账本 + transparency 行 + `--dry-run`）；对 ClawScan May 2026 "suspicious classification due to inherent third-party session capability" 的直接程序化响应。**npm 固定包未变（仍 0.4.3）。** - **0.4.4** (2026-05-07): Sensitive tier 默认封印；SHA-512 完整性闸门（无 env 旁路）；symlink 拒绝；CWD/launcher-local 默认禁用；对 ClawScan May 2026 "Identity and Privilege Abuse" + "Tool Misuse and Exploitation" 的程序化响应。 - **0.4.3** (2026-04-29): 扩展至 55 平台 91+ 命令。 --- ## ✅ 首次成功检查清单 - [ ] 安装工具（必须精确版本 + 跳过脚本）：`npm install -g browser-web-search@0.4.3 --ignore-scripts` - [ ] 验证 SHA-512 一致：`P=$(npm root -g)/browser-web-search/dist/index.js && shasum -a 512 "$P"` - [ ] 查看命令：`bws-skill list`（或直接 `bws site list`） - [ ] 测试**公共** adapter（无需任何 env）：`bws-skill run hn/search "llm" --count 3` - [ ] 看到 JSON 输出，并阅读 stderr 是否出现 `[bws] transparency:{...}`（公共 adapter 默认不出，除非 `BWS_TRANSPARENCY=1`） - [ ] **可选**：使用 `--dry-run` 测试敏感 adapter 闸门组合，不真正调用包 ```bash BWS_ENABLE_SENSITIVE_TIER=1 BWS_ALLOW_SENSITIVE=1 \ bws-skill run zhihu/me --dry-run --accept-platform-consent ```


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)