- name
- browser-web-search
- description
- 一行命令搜遍全网 — 55 个平台 91+ 个命令,头条、知乎、豆瓣、YouTube、GitHub、Reddit、Hacker News 等。专为 OpenClaw 设计,复用浏览器登录态,返回结构化 JSON,天然适配 AI Agent 工具调用。
- version
- 0.4.4
- versionNotes
- |
- author
- Ping Si <sipingme@gmail.com>
- type
- cli
- requires
- runtime
- version
- >=18.0.0
- description
- Node.js 运行时
- description
- Node.js 包管理器(随 Node.js 安装)
- packages
- global
- false
- binaries
- 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
- note
- 用户需先通过 npm install -g 全局安装 browser-web-search,运行时调用本地已安装的 bws 命令
- capabilities
- sensitive
- riskLevel
- high
- description
- 通过 OpenClaw 在已认证的浏览器标签页中执行 JavaScript
- scope
- 按 adapter 域名隔离(如 zhihu.com, xiaohongshu.com)
- access
- noAccess
- risks
- mitigations
- privacyNotice
- summary
- 此 Skill 自动复用浏览器登录态,可读取您已登录站点的任何可见数据
- details
- metadata
- openclaw
- primaryEnv
- values
- ["0", "1"]
- default
- 0
- purpose
- Hard-isolation mode that denies all sensitive adapters (Gate 1; overrides everything below)
- values
- ["0", "1"]
- default
- 0
- purpose
- |
- values
- ["0", "1"]
- default
- 0
- purpose
- Session-level opt-in within the enabled sensitive tier (Gate 3)
- values
- ["0", "1"]
- default
- 0
- purpose
- Allow loading bws from launcher-local or CWD node_modules (off by default to prevent path-pivoting)
- sensitiveTierGateOrder
- 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
- 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
- envOverride
- false
- failureMode
- deny + audit-log entry (adapter="(integrity)")
- argSource
- allow-listed-cli-args
- argValidation
- 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
- required
- false
- tags
- 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
📋 安装
npm install -g browser-web-search@0.4.3验证安装
bws --version
bws site list🚀 快速开始
# 搜索今日头条关于 "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/search | |
| Bing | 必应搜索 | 🔓 | bing/search |
| DuckDuckGo | 隐私优先搜索 | 🔓 | duckduckgo/search |
| GitHub | 代码托管 | 🔓 | github/search |
| Hacker News | 科技社区 (YC) | 🔓 | hn/search |
| 英文社区 | 🔓 | 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/search | |
| YouTube | 视频 & 字幕 & 评论 | 🔀 | youtube/search, youtube/video, youtube/transcript, youtube/transcript-by-id, youtube/comments, youtube/channel, youtube/feed |
🔧 命令参考
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:跨平台搜索
场景:用户想搜索多个平台关于某话题的最新内容
# 国内平台
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:获取热点资讯
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 过滤数据
# 只提取标题
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:影视 / 娱乐内容
# 豆瓣搜索影视
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:开发者资源搜索
# 搜索 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、豆瓣等):
# 在 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) 安装前审计与版本固定
# 审计源码 (与 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 | sha512-qoGLsUMOPgzIpdxtGMv08Gjy84bkh0AF90mKG9qvagq9O2ngcKcLg+GAy3Z8bljkvdfKcrQSp55xPO9mVCuv3Q== |
任何一项不匹配会直接拒绝调用并写入 ~/.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 来确认本地安装:
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 |
也就是说,最小可用敏感访问的命令组合变成:
# 必须 (一次性):开启 tier
export BWS_ENABLE_SENSITIVE_TIER=1
# 然后任选其一:
export BWS_ALLOW_SENSITIVE=1 # 会话级
# 或
bws site weixin/search "ai" --i-understand-sensitive # 单次调用强烈建议的姿态:
| 场景 | 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 现在会拿到:
{"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:
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 -c5) 数据最小化
- 优先使用公开 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 |
| 公共 adapter 直通 | ✅ 无需任何 env(如 hn/search) |
| 硬隔离模式 | ✅ BWS_PUBLIC_ONLY=1 覆盖一切 opt-in |
| 审计日志(含 site / primaryDomain) | ✅ ~/.bws/audit.log(仅元数据) |
| 第三方包供应链(被替换 / 篡改) | ✅ launcher 在 import 前强制校验 SHA-512,无 env 旁路 |
| Path-pivoting(CWD 下放置恶意包) | ✅ 默认仅信任全局 node_modules;本地需 BWS_ALLOW_LOCAL_INSTALL=1 |
| 符号链接劫持入口 | ✅ 自候选根至 dist/index.js 任一组件为 symlink 即跳过 |
| 浏览器 session 越权(包内 JS 在审计版本内的预期行为) | ⚠️ 无法在 launcher 层消解;依赖 (2) profile 隔离 + tier 默认封印 |
| 跨标签数据访问(包内 JS 触达其他打开的标签) | ⚠️ launcher 无权约束;依赖独立 profile + 关闭无关标签 + tier 默认封印 |
| 跨站访问 | ⚠️ adapter 域名隔离仅约束开源 adapter 的设计意图,不是运行时强制 |
| 上传到第三方服务器 | ⚠️ 当前审计版本未观察到,但每次升级需重新审计并同步 launcher 内的固定哈希 |
🎓 示例对话
用户:搜索头条最新 3 篇关于 AI Agent 的文章
bws site toutiao/search "AI Agent" --count 3用户:看看 Hacker News 上关于 LLM 的最新讨论
bws site hn/search "llm" --sort date --count 5用户:GitHub 上 ai search 相关的热门项目
bws site github/search "ai search" --sort stars --count 5用户:豆瓣电影 Top 10
bws site douban/top250 --count 10用户:YouTube 搜索 AI 教程
bws site youtube/search "ai agent tutorial" --count 10📚 参考资料
📝 维护说明
- 版本: 0.4.3
- 最后更新: 2026-04-29
- 维护者: Ping Si <sipingme@gmail.com>
- 许可证: MIT
✅ 首次成功检查清单
- [ ] 安装工具:
npm install -g browser-web-search@0.4.3 - [ ] 验证版本:
bws --version - [ ] 查看命令:
bws site list - [ ] 测试搜索:
bws site zhihu/search "ai" --count 3 - [ ] 看到 JSON 输出