如何用几句话让 openclaw “变成百度搜索”
效果
在不改任何上层 prompt、不写一行「百度适配插件」的情况下,让 openclaw 以为自己还在调用 Brave Search,实际底层悄悄走百度。
核心思路(一句话)
用一个本地 Flask 服务伪装 Brave Search 接口 → openclaw 仍然调用
web_search(brave)→ 实际走百度。
整件事分三块
整个操作流程可以清晰地拆解为三个核心环节:
首先,是搭建一个基于 Flask 和 baidusearch 的“假冒” Brave 搜索 API 服务。这个服务接口要长得和正版一模一样。
接着,修改 openclaw 内部 Brave 搜索的端点配置,并绕开它对 API Key 的强制校验。这一步是关键,相当于给系统“换了个心脏”却不让它察觉。
最后,重启 gateway 服务,验证搜索结果是否成功切换为百度提供。走完这三步,就能实现神不知鬼不觉的“偷梁换柱”。
操作过程
总结来说,整个过程并不复杂,甚至可以直接让 openclaw 自己执行配置命令。等它配置完成后,我们只需要重启 gateway 服务,就能立刻验证效果。
服务重启完成后,新的搜索功能基本就能正常使用了。
这里还有个有趣的玩法:可以让 openclaw 把刚才我们做的所有操作总结出来,甚至发篇博客。下面你看到的这些详细内容,就都是它自己梳理生成的:
0. 环境说明
系统:Ubuntu Jammy(云服务器)
Node:/root/.nvm/versions/node/v22.22.0
openclaw:openclaw-cn@0.1.4(全局安装)
动手前,先确认一下环境,确保路径正确:
which openclaw-cn # /root/.nvm/versions/node/v22.22.0/bin/openclaw-cn
npm list -g openclaw-cn # /root/.nvm/versions/node/v22.22.0/lib # └── openclaw-cn@0.1.4
记住这个全局安装路径,后面我们要修改的源码文件,都在它的
dist目录里。
1. 用 Flask + baidusearch 伪装一个 Brave Search API
1.1 安装 Python 依赖
这步是准备“造假”工具。选个合适的目录,比如 /root/openclaw,然后安装必要的Python包:
cd /root/openclaw # 任意目录
python3 -m pip install --upgrade pip
python3 -m pip install --user flask baidusearch
安装完成后,可以用个简单命令测试一下,确保两个库都能正常导入:
python3 -c "import flask, baidusearch; print('flask ok, baidusearch ok')"
1.2 写代理服务代码
接下来是核心:编写伪装成 Brave API 的 Flask 服务代码。建议创建以下路径来管理:
/root/openclaw/baidu-brave-proxy/app.py
把下面的代码复制进去:
from flask import Flask, request, jsonify, Response
from baidusearch.baidusearch import search
import json
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
@app.route('/brave-search', methods=['GET'])
def brave_search():
query = request.args.get('q')
count = request.args.get('count', 10, type=int)
if not query:
return jsonify({"error": "缺少必要的参数: query", "code": 400}), 400
try:
results = search(query, num_results=count, debug=0)
formatted_results = []
for result in results:
abstract = result.get("abstract", "")
if abstract:
abstract = abstract.translate(str.maketrans('', '', ' \r '))
formatted_results.append({
"title": result.get("title", ""),
"url": result.get("url", ""),
"description": abstract,
"age": result.get("rank", ""),
})
final_result = {"web": {"results": formatted_results}}
return Response(
json.dumps(final_result, ensure_ascii=False),
mimetype='application/json; charset=utf-8',
)
except Exception as e:
logger.error(f"Brave搜索过程中发生错误: {str(e)}")
return jsonify({"error": f"Brave搜索过程中发生错误: {str(e)}", "code": 500}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=25000, debug=True)
关键点
这个伪装服务的精妙之处就在于几个细节:
路由路径:设定为 /brave-search,这是接口的入口。
参数名:完全模仿 Brave 的风格,使用 q 代表查询词,count 控制返回数量。
返回结构:严格按照 openclaw 的预期,构造 {"web": {"results": [...]}} 这样的 JSON 结构。
字段:包含 title, url, description, age,一个都不能少。
可以说,整个服务就是照着 openclaw 对 Brave 返回格式的“期望清单”来量身定做的。
1.3 启动 Flask 并自测
代码写好了,现在启动服务看看效果:
python3 baidu-brave-proxy/app.py
服务跑起来后,新开一个终端窗口,用 curl 命令测试一下:
curl -v “http://127.0.0.1:25000/brave-search?q=openclaw&count=1”
如果一切顺利,你会看到类似下面的返回:
{
“web”: {
“results”: [
{
“title”: “...”,
“url”: “http://www.baidu.com/link?...”,
“description”: “...”,
“age”: 1
}
]
}
}
看到这个,就说明整条链路已经彻底打通了:
用户查询 → 百度搜索引擎 → baidusearch 库抓取 → Flask 服务转换 → 输出 Brave 风格的 JSON 结果。 伪装工作的前半部分,至此大功告成。
2. 修改 openclaw 的 web_search
光有伪装 API 还不行,得让 openclaw 主动来找它。接下来,我们要修改 openclaw 内部的搜索模块,让它“指鹿为马”。
找到这个关键文件:
/root/.nvm/versions/node/v22.22.0/lib/node_modules/openclaw-cn/dist/agents/tools/web-search.js
2.1 把 Brave endpoint 改成本地 Flask
打开文件,找到定义 Brave 搜索端点的那行代码。原来是这样的:
const BRAVE_SEARCH_ENDPOINT = “https://api.search.brave.com/res/v1/web/search”;
现在,把它指向我们刚刚搭建的本地 Flask 服务:
const BRAVE_SEARCH_ENDPOINT = “http://localhost:25000/brave-search”;
如果你的 Flask 服务跑在另一台机器上,比如内网 IP 是 10.0.0.12,那就改成:
const BRAVE_SEARCH_ENDPOINT = “http://10.0.0.12:25000/brave-search”;
修改后的效果是:
openclaw 的 web_search 工具仍然会按照 Brave 的格式组装参数并发起请求,但这些请求会全部打到你的本地 Flask 服务上,而不是真正的 Brave 官方 API。
2.2 去掉 Brave API Key 强制依赖
Brave 官方 API 是需要密钥的,但我们的假服务不需要。所以还得修改密钥检查逻辑,绕过这个校验。
找到原文件中解析 API Key 的函数,通常是这样的:
function resolveSearchApiKey(search) {
const fromConfig = search && “apiKey” in search && typeof search.apiKey === “string” ? search.apiKey.trim() : “”;
const fromEnv = (process.env.BRAVE_API_KEY ?? “”).trim();
return fromConfig || fromEnv || undefined;
}
把这个函数整个替换掉,直接让它返回一个虚拟的密钥字符串:
function resolveSearchApiKey(search) {
return “dummy_baidu_proxy_key”;
}
这样一来,就实现了两个关键效果:
首先,系统不会再因为缺少 BRAVE_API_KEY 而抛出 missing_brave_api_key 错误。
其次,虽然请求头里还是会带一个密钥(就是我们设置的 dummy key),但我们的 Flask 服务会完全忽略它,请求照样正常处理。
3. 重启 gateway
代码改完了,必须重启服务才能生效。执行这条命令:
openclaw-cn gateway restart
如果你是用 systemd 管理的服务,也可以用这个命令:
systemctl --user restart openclaw-gateway.service
4. 验证效果
最后一步,验收成果。对 openclaw 发送一个搜索指令试试:
你帮我检索一下今天的前三条新闻
仔细看它的返回。如果看到的结果结构里,provider 字段显示的还是 “brave”,但点开的实际链接却来自 www.baidu.com,类似下面这样:
{
“provider”: “brave”,
“results”: [
{
“title”: “...”,
“url”: “http://www.baidu.com/link?...”,
“siteName”: “www.baidu.com”
}
]
}
那么,恭喜你!
这标志着“狸猫换太子”的计划已经圆满成功。openclaw 依然坚信自己在使用 Brave 搜索,但实际上,背后辛勤工作的,已经是我们熟悉的百度了。




