联网搜索
技能名称:联网搜索
技能描述
此技能允许角色(数字生命)通过调用/systemcmd/run-sync接口执行系统命令,使用wget命令调用DTNSBot HTTP API,在浏览器中打开搜索URL,实现快速联网搜索。该技能模拟了在浏览器地址栏直接输入搜索链接并访问的过程,通过命令行控制设备完成搜索。
触发条件
当用户明确要求角色进行搜索、查询最新信息、查找资料时触发。例如:
- “帮我搜索一下关于‘browser-use’的信息。”
- “查一下最近的科技新闻。”
- “我想知道browser-use是什么。”
输入参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| keyword | string | 是 | 要搜索的关键词 |
| search_engine | string | 否 | 搜索引擎类型,默认使用必应(bing)。可选:bing、google、baidu |
| search_type | string | 否 | 搜索类型,默认普通搜索。可选:normal、stock(股票搜索) |
| device_ip | string | 否 | Android设备IP地址,默认192.168.1.52:58082 |
执行流程
1. 准备工作
- systemcmd接口地址:
/systemcmd/run-sync - DTNSBot API基础地址:
http://{device_ip}/api/ - 搜索URL模板:
- 必应:
https://www.bing.com/search?q={keyword} - 谷歌:
https://www.google.com/search?q={keyword} - 百度:
https://www.baidu.com/s?wd={keyword} - 股票搜索:
https://xueqiu.com/k?q={keyword}
- 必应:
2. 搜索执行步骤
步骤 1:构建搜索URL
- 操作: 根据关键词、搜索引擎和搜索类型构建完整的搜索URL
- URL编码: 关键词需要进行URL编码,处理空格、特殊字符等
- 示例:
- 普通搜索: 关键词
browser-use→https://www.bing.com/search?q=browser-use - 股票搜索: 关键词
贵州茅台→https://xueqiu.com/k?q=贵州茅台
- 普通搜索: 关键词
步骤 2:执行open_url命令(通过systemcmd)
- 操作: 使用
wget命令调用DTNSBot API,在浏览器中打开搜索URL - 命令格式:
wget -q -O - "http://{device_ip}/api/?command=open_url%20{编码后的URL}" - systemcmd请求体:
{ "cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=open_url%20https%3A%2F%2Fwww.bing.com%2Fsearch%3Fq%3Dbrowser-use'", "cwd": "/tmp", "ostype": "linux", "timeout": 10000 }
步骤 3:等待页面加载
- 操作: 等待搜索结果页面加载完成
- 方法:
- 调用
get_uinfo命令获取UI信息 - 检查是否有“已加载100%”或“加载完成”的UI节点
- 如果没有,可多次轮询,每次间隔1-2秒
- 调用
- 示例systemcmd请求:
{ "cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=get_uinfo'", "cwd": "/tmp", "ostype": "linux", "timeout": 10000 }
步骤 4:获取搜索结果
- 操作: 获取当前界面的UI信息,从中提取搜索结果
- 命令:
get_uinfo- 触发UI信息采集get_uiinfo_result- 获取详细的UI节点信息
- 示例systemcmd请求:
{ "cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=get_uiinfo_result'", "cwd": "/tmp", "ostype": "linux", "timeout": 10000 }
3. 结果解析与提取
根据搜索结果页面结构,搜索结果主要位于android.webkit.WebView节点中。
解析策略:
- 从
get_uiinfo_result返回的JSON中获取data.nodes数组 - 定位
android.webkit.WebView类型的节点(特别是包含搜索结果的WebView) - 遍历WebView的子节点,查找结果条目:
- 标题节点: 通常
text字段包含完整标题,如“GitHub - browser-use/browser-use...” - 来源/URL: 可能位于
text字段中,包含域名如“github.com”、“zhuanlan.zhihu.com” - 描述: 部分结果包含描述文本,如“78,000+ GitHub stars...”
- 标题节点: 通常
- 识别结果条目的关键特征:
- 通常以
android.view.View节点表示 - 包含可点击的链接
- 可能包含图标、标题、URL、描述等子节点
- 通常以
4. 返回结果
将解析后的搜索结果以清晰、易读的格式返回给用户。
成功返回示例:
{
"status": "success",
"message": "已为您搜索到关于 'browser-use' 的相关信息",
"data": {
"keyword": "browser-use",
"search_engine": "bing",
"search_results": [
{
"title": "GitHub - browser-use/browser-use: Make websites accessible for AI agents",
"source": "github.com",
"description": "78,000+ GitHub stars. Trusted by Fortune 500. The #1 open-source browser automation platform."
},
{
"title": "Browser Use:40.7K Star!一句话让AI完全接管浏览器",
"source": "zhuanlan.zhihu.com",
"description": "Browser Use 是一款专为大语言模型(LLM)设计的智能浏览器工具,旨在让 AI 代理能够像人类一样自然地浏览和操作网页。"
},
{
"title": "【人工智能测试】Browser Use 深度解析,AI Agent 驱动的浏览器自动化",
"source": "bilibili.com",
"description": "视频播放量 165、弹幕量 0、点赞数 3、投硬币枚数 0、收藏人数 14、转发人数 1"
}
]
}
}
失败返回示例:
{
"status": "error",
"message": "搜索失败:未能获取到搜索结果",
"data": {
"keyword": "browser-use",
"reason": "页面加载超时或UI解析失败"
}
}
完整示例流程
以搜索关键词browser-use为例,使用默认设备IP 192.168.1.52:58082:
步骤1:打开搜索页面
{
"cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=open_url%20https%3A%2F%2Fwww.bing.com%2Fsearch%3Fq%3Dbrowser-use'",
"cwd": "/tmp",
"ostype": "linux",
"timeout": 10000
}
步骤2:等待页面加载(延迟2-3秒)
步骤3:触发UI信息采集
{
"cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=get_uinfo'",
"cwd": "/tmp",
"ostype": "linux",
"timeout": 10000
}
步骤4:获取详细UI数据
{
"cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=get_uiinfo_result'",
"cwd": "/tmp",
"ostype": "linux",
"timeout": 10000
}
步骤5:解析UI数据,提取搜索结果
步骤6:返回格式化的结果给用户
辅助命令参考
| 功能 | systemcmd请求体 |
|---|---|
| 返回主屏幕 | {"cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=home'", "cwd": "/tmp", "ostype": "linux", "timeout": 5000} |
| 返回上一页 | {"cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=back'", "cwd": "/tmp", "ostype": "linux", "timeout": 5000} |
| 获取UI信息 | {"cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=get_uinfo'", "cwd": "/tmp", "ostype": "linux", "timeout": 10000} |
| 获取UI数据 | {"cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=get_uiinfo_result'", "cwd": "/tmp", "ostype": "linux", "timeout": 10000} |
| 截取屏幕 | {"cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=screenshot'", "cwd": "/tmp", "ostype": "linux", "timeout": 10000} |
| 点击坐标 | {"cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=click_at_500,800'", "cwd": "/tmp", "ostype": "linux", "timeout": 5000} |
| 输入文本 | {"cmd": "wget -q -O - 'http://192.168.1.52:58082/api/?command=input_hello'", "cwd": "/tmp", "ostype": "linux", "timeout": 5000} |
响应格式说明
systemcmd成功响应
{
"ret": true,
"msg": "success",
"data": {
"output": "{\"status\":\"success\",\"message\":\"...\"}",
"error": "",
"exitCode": 0,
"success": true
}
}
systemcmd失败响应
{
"ret": false,
"msg": "命令执行失败",
"data": {
"output": "",
"error": "Connection refused",
"exitCode": 1,
"success": false
}
}
错误处理
| 错误场景 | 处理方式 |
|---|---|
| systemcmd接口无响应 | 返回错误信息“无法连接到systemcmd服务,请检查服务状态” |
| wget命令执行失败 | 检查Android设备IP和端口是否正确,确认DTNSBot服务是否运行 |
| open_url命令失败 | 检查URL格式是否正确,关键词是否包含非法字符 |
| 页面加载超时 | 增加等待时间或轮询检查页面加载状态,可适当增加timeout值 |
| UI解析失败 | 返回原始UI数据或提示“解析搜索结果失败,请重试” |
| 搜索结果为空 | 返回“未找到相关搜索结果,请尝试其他关键词” |
注意事项
- 设备IP配置: 默认使用
192.168.1.52:58082,可根据实际网络环境修改device_ip参数 - URL编码: 关键词中的空格、中文、特殊符号必须进行URL编码,避免命令解析错误
- 页面加载:
open_url命令执行后,需要等待足够时间让页面完全加载(通常2-5秒) - 轮询机制: 如果第一次获取UI信息时页面未加载完成,可多次轮询,每次间隔1-2秒
- 超时设置: 根据操作复杂度设置合适的超时时间,复杂操作建议设置10000-15000ms
- wget参数: 使用
-q -O -参数静默输出,避免额外日志干扰 - 多页面处理: 如果设备已有打开的浏览器,
open_url会在当前浏览器中打开新标签页 - 结果质量: 搜索结果的提取依赖于UI结构的稳定性,不同浏览器或搜索引擎的UI可能不同
优化建议
- 搜索引擎选择: 可根据用户偏好或搜索结果质量选择不同的搜索引擎
- 结果数量: 可根据需要限制返回的结果数量(如前5条)
- 缓存机制: 对于相同关键词的搜索,可缓存结果避免重复请求
- 并发控制: 避免同时执行多个搜索命令,可能导致UI状态混乱
- 失败重试: 如果搜索结果提取失败,可尝试重新获取UI信息(最多3次)
- 股票搜索: 当用户查询股票信息时,自动使用雪球网搜索URL模板
【特别注意】
- 设备优先访问本机:http://127.0.0.1:58082 除非用户特别要求访问指定设备