养“马”系列:一行命令搞定全网搜索!Hermes 从此告别 API 依赖

一、为什么我们需要自己做搜索?
上一篇文章我们实现了在纯 Linux 字符界面跑通 OpenCLI,让 Hermes 摆脱了桌面环境的束缚。但很多朋友反馈,Hermes 自带的搜索功能依然有很多痛点:
要么需要付费 API,token 成本高;要么不稳定,经常被反爬拦截;要么返回结果不完整,无法获取深层内容。
真正的 AI 信息获取,应该是浏览器能看到什么,AI 就能拿到什么。
而 OpenCLI 的 browser 功能,给了我们一个完美的解决方案。它可以完全模拟人类的浏览器行为,打开网页、输入文字、点击按钮、提取内容,不需要任何第三方 API,所有数据都在你的掌控之中。
今天我们就用 OpenCLI 打造一个纯原生的 Bing 搜索技能,让 Hermes 从此拥有自主可控的全网搜索能力。
二、前置准备:OpenCLI 环境
如果你还没有部署 OpenCLI 纯终端环境,请先参考上一篇文章:
养 “马” 系列:无需桌面!Linux 字符界面跑通 OpenCLI,Hermes 自由上网
部署完成后,我们先看一下 opencli browser 的核心命令:
hyl@hyl:~$ opencli browser -h
Usage: opencli browser [options] [command]
Browser control — navigate, click, type, extract, wait (no LLM needed)
Commands:
open [options] Open URL in automation window
click [options] Click element
type [options] Click element, then type text
wait [options] [value] Wait for selector, text, time
eval [options] Execute JS in page context
extract [options] Extract page content as markdown
close Close the automation window这些命令就是我们实现自动化搜索的全部武器。
三、从零打造 Bing 自动化搜索脚本
我们的目标是:一行命令,自动完成 Bing 搜索、翻页、提取所有结果链接、下载网页内容并保存到本地。
经过多次踩坑和优化,最终的脚本解决了所有常见问题:
-
✅ 模拟人工操作,规避反爬检测
-
✅ 自动修复带前缀的非法链接
-
✅ 按日期归档结果,方便清理
-
✅ 自动去重,不重复下载
-
✅ 当天多次搜索自动追加索引
3.1 最终可运行脚本
#!/bin/bash
# ==============================================
# OpenCLI Skill: Bing 搜索(智能追加·自动去重·终极完美版)
# 调用: ./bing_search_skill.sh "关键词" 页数
# 示例: ./bing_search_skill.sh "恒瑞医药" 10
# 新增:当天多次搜索自动追加索引,自动去重,不覆盖
# ==============================================
# ===================== 【暴力修复】awk 分割提取纯 URL =====================
clean_url() {
local raw="$1"
# 核心:用 awk -F 'http' 暴力分割,只取 http 以后的部分
echo "$raw" | awk -F 'http' '{if (NF>1) print "http" $2}' | head -n 1
}
# ===================== 参数校验 =====================
if [ $# -ne 2 ]; then
echo "❌ 用法: $0 \"搜索关键词\" 翻页数量"
exit 1
fi
SEARCH_KEY="$1"
TOTAL_PAGES="$2"
# 获取当前日期
CURRENT_DATE=$(date +%Y-%m-%d)
RESULT_DIR="./bing_search_result/${CURRENT_DATE}"
if ! [[ "$TOTAL_PAGES" =~ ^[0-9]+$ ]]; then
echo "❌ 页数必须是数字"
exit 1
fi
# 初始化
mkdir -p "${RESULT_DIR}/pages"
INDEX_FILE="${RESULT_DIR}/00_搜索索引.txt"
# ✅ 核心修改:如果索引文件不存在才创建,存在则追加
[ ! -f "$INDEX_FILE" ] && > "$INDEX_FILE"
# ✅ 核心新增:读取已下载的 URL 列表,用于去重
declare -A DOWNLOADED_URLS
if [ -f "$INDEX_FILE" ]; then
while IFS= read -r line; do
if [[ "$line" == "链接: "* ]]; then
url="${line
#链接
: }"
DOWNLOADED_URLS["$url"]=1
fi
done < "$INDEX_FILE"
fi
RESULT_LIST=()
PAGE_ID=1
echo "================================================"
echo "✅ 启动 Bing 搜索"
echo "🔍 关键词: $SEARCH_KEY"
echo "📄 翻页: $TOTAL_PAGES 页"
echo "📅 日期目录: $CURRENT_DATE"
echo "📋 已下载: ${
#DOWNLOADED
_URLS[@]} 个链接"
echo "================================================"
# 1. 打开首页
echo -e "
[1/3] 打开 Bing"
opencli browser open "https://www.bing.com"
opencli browser wait selector "
#sb
_form_q"
sleep 2
# 2. 搜索
echo -e "
[2/3] 执行搜索"
opencli browser type "
#sb
_form_q" "$SEARCH_KEY"
sleep 1
opencli browser click "
#search
_icon"
sleep 3
# 3. 翻页抓取
echo -e "
[3/3] 抓取链接"
for ((page=1; page<=TOTAL_PAGES; page++)); do
echo -e "
===== 第 $page 页 ====="
opencli browser wait selector ".b_algo"
sleep 2
PAGE_DATA=$(opencli browser eval "JSON.stringify(Array.from(document.querySelectorAll('.b_algo h2 a')).map(a => ({title: a.innerText.trim(), url: a.href.trim()})));")
while IFS= read -r line; do
title=$(echo "$line" | jq -r '.title')
raw_url=$(echo "$line" | jq -r '.url')
# 核心:awk 暴力分割提取
url=$(clean_url "$raw_url")
# 严格校验 + 去重
if [[ "$url" == http* ]] && [ -z "${DOWNLOADED_URLS["$url"]}" ]; then
# ✅ 制表符分隔
RESULT_LIST+=("${title}"$'\t'"${url}")
[ "$raw_url" != "$url" ] && echo "🔧 已修复: $url"
[ "$raw_url" == "$url" ] && echo "✅ 正常: $title"
elif [ -n "${DOWNLOADED_URLS["$url"]}" ]; then
echo "⏭️ 已下载,跳过: $url"
else
echo "⚠️ 跳过: $raw_url"
fi
done < <(echo "$PAGE_DATA" | jq -c '.[]' 2>/dev/null)
# 翻页
[ $page -lt $TOTAL_PAGES ] && {
opencli browser click ".sb_pagN"
sleep 3
}
done
# 4. 批量保存(使用原生 opencli web read)
echo -e "
================================================"
echo "开始保存(新增:${
#RESULT
_LIST[@]})"
echo "================================================"
for item in "${RESULT_LIST[@]}"; do
# ✅ 制表符分割
title="${item%%$'\t'*}"
url="${item#*$'\t'}"
echo -e "
----------------------------------------"
echo "序号: $PAGE_ID"
echo "标题: $title"
echo "✅ 纯链接: $url"
# ✅ 核心:使用原生 opencli web read 保存网页
opencli web read \
--url "$url" \
--output "$RESULT_DIR/pages" \
--wait 3 \
--download-images false
# ✅ 核心修改:追加索引,不覆盖
echo "【$PAGE_ID】$title" >> "$INDEX_FILE"
echo "链接: $url" >> "$INDEX_FILE"
echo "----------------------------------------" >> "$INDEX_FILE"
echo >> "$INDEX_FILE"
PAGE_ID=$((PAGE_ID+1))
done
echo -e "
🎉 全部完成!无任何异常!"
echo "✅ 结果目录: $RESULT_DIR"
echo "📅 日期归档: $CURRENT_DATE"
echo "📋 本次新增: ${
#RESULT
_LIST[@]} 个"
echo "💡 提示:可直接删除旧日期目录进行清理"3.2 脚本使用方法
-
保存脚本为
bing_search_skill.sh -
赋予执行权限:
chmod +x bing_search_skill.sh- 运行搜索(关键词+页数):
./bing_search_skill.sh "股票分析skill" 103.3 运行结果
脚本会自动生成按日期归档的目录:
bing_search_result/
└─ 2026-05-03/
├─ 00_搜索索引.txt
# 所有结果的标题+链接索引
└─ pages/
# 所有网页的 Markdown 内容
├─ 1_股票分析 - 技能市场.md
├─ 2_TradingAgents-CN-Skill 股票分析.md
└─ ...四、封装为 Hermes Skill,让 AI 自动调用
现在我们把这个脚本封装成 Hermes 技能,以后只需要对 Hermes 说一句话,它就会自动完成搜索并总结结果。
把重复的工作做成 Skill,让 AI 成为你的执行手,而不是你的指挥官。
4.1 创建 SKILL.md 文件
在 ~/.hermes/skills/research/bing-search/ 目录下创建 SKILL.md:
---
name: bing-search
description: 使用 OpenCLI 进行 Bing 自动化搜索,保存网页内容到本地
version: 1.0.0
author: 养马系列
license: MIT
platforms: [linux, macos]
metadata:
hermes:
tags: [research, search, opencli, bing]
category: research
requires_toolsets: [terminal]
---
# Bing 自动化搜索技能
使用 OpenCLI 模拟人工操作进行 Bing 搜索,自动翻页并保存所有网页内容到本地。
## 何时使用
- 需要获取全网公开信息时
- 需要批量下载搜索结果时
- 其他搜索工具不可用或不稳定时
## 操作步骤
1. 运行脚本:`/path/to/bing_search_skill.sh "关键词" 页数`
2. 脚本会自动完成搜索、翻页、下载
3. 结果保存在 `./bing_search_result/日期/` 目录下
4. 读取 `00_搜索索引.txt` 和 pages 目录下的内容进行总结
## 常见陷阱
- 页数不要设置太大,避免被反爬
- 确保 OpenCLI 环境已正确部署
- 脚本会自动去重,当天多次搜索不会重复下载
## 验证
运行后检查是否生成了日期目录和索引文件4.2 让 Hermes 使用技能
现在你可以直接对 Hermes 说:
使用 bing-search 技能搜索"恒瑞医药",翻10页,然后总结核心内容Hermes 会自动调用脚本完成搜索,然后读取本地保存的所有网页内容,为你生成结构化的总结报告。
五、价值升华:省钱省token才是硬道理
很多人问我,为什么要花这么多功夫自己做搜索?直接用现成的 API 不香吗?
答案其实很朴素:省钱,省token,顺便实现自主可控。
现在不管是GPT的联网搜索,还是各种第三方搜索API,全都是按次/按token收费。批量搜10页内容,光搜索API就要花几块钱,再加上大模型总结的token,一次完整的调研可能要十几块。如果每天搜几次,一个月下来就是几百块的成本,这对个人用户来说太不友好了。
个人玩AI,先算成本账。一分钱不花能搞定的事,绝不用付费API。
而用OpenCLI自己做搜索,没有任何API费用,浏览器能看到的内容全免费。更重要的是,所有内容先下载到本地,再让大模型只处理你真正需要的部分,不用把整个网页的广告、导航、无关内容都传给大模型,token消耗直接砍90%。
比如一个网页有1万token,你只需要其中1000字的核心信息,本地先过滤再喂给大模型,一次就能省几千token。积少成多,一个月下来能省出大几百的API费用。
当然,自主可控依然是我们的底线。不用怕API突然涨价、关停,不用怕数据泄露,所有内容都保存在你的本地硬盘,想怎么处理就怎么处理。
拒绝黑盒,拒绝溢价,用最低的成本,实现最可控的效果。
这只是一个开始。接下来我们可以基于这个基础,实现更多省钱玩法:定时监控特定关键词、自动跟踪新闻更新、批量分析竞品信息等等。所有功能都在本地跑,一分钱不花。
如果你在部署过程中遇到了任何问题,或者有更好的优化方案,欢迎在评论区留言交流。我们一起把"养马"这件事做得更好。
© 2026 养马系列技术专栏 | 专注于个人 AI 助手的自主可控与生产力提升
关注我,获取更多 Hermes Agent 实战技巧