联网搜索

技能名称:联网搜索

技能描述

此技能允许角色(数字生命)通过调用/systemcmd/run-sync接口执行系统命令,使用wget命令调用DTNSBot HTTP API,在浏览器中打开搜索URL,实现快速联网搜索。该技能模拟了在浏览器地址栏直接输入搜索链接并访问的过程,通过命令行控制设备完成搜索。

触发条件

当用户明确要求角色进行搜索、查询最新信息、查找资料时触发。例如:

  • “帮我搜索一下关于‘browser-use’的信息。”
  • “查一下最近的科技新闻。”
  • “我想知道browser-use是什么。”

输入参数

参数名 类型 必填 说明
keyword string 要搜索的关键词
search_engine string 搜索引擎类型,默认使用必应(bing)。可选:binggooglebaidu
search_type string 搜索类型,默认普通搜索。可选:normalstock(股票搜索)
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-usehttps://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:等待页面加载

  • 操作: 等待搜索结果页面加载完成
  • 方法:
    1. 调用get_uinfo命令获取UI信息
    2. 检查是否有“已加载100%”或“加载完成”的UI节点
    3. 如果没有,可多次轮询,每次间隔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信息,从中提取搜索结果
  • 命令:
    1. get_uinfo - 触发UI信息采集
    2. 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节点中。

解析策略:

  1. get_uiinfo_result返回的JSON中获取data.nodes数组
  2. 定位android.webkit.WebView类型的节点(特别是包含搜索结果的WebView)
  3. 遍历WebView的子节点,查找结果条目:
    • 标题节点: 通常text字段包含完整标题,如“GitHub - browser-use/browser-use...”
    • 来源/URL: 可能位于text字段中,包含域名如“github.com”、“zhuanlan.zhihu.com”
    • 描述: 部分结果包含描述文本,如“78,000+ GitHub stars...”
  4. 识别结果条目的关键特征:
    • 通常以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数据或提示“解析搜索结果失败,请重试”
搜索结果为空 返回“未找到相关搜索结果,请尝试其他关键词”

注意事项

  1. 设备IP配置: 默认使用192.168.1.52:58082,可根据实际网络环境修改device_ip参数
  2. URL编码: 关键词中的空格、中文、特殊符号必须进行URL编码,避免命令解析错误
  3. 页面加载: open_url命令执行后,需要等待足够时间让页面完全加载(通常2-5秒)
  4. 轮询机制: 如果第一次获取UI信息时页面未加载完成,可多次轮询,每次间隔1-2秒
  5. 超时设置: 根据操作复杂度设置合适的超时时间,复杂操作建议设置10000-15000ms
  6. wget参数: 使用-q -O -参数静默输出,避免额外日志干扰
  7. 多页面处理: 如果设备已有打开的浏览器,open_url会在当前浏览器中打开新标签页
  8. 结果质量: 搜索结果的提取依赖于UI结构的稳定性,不同浏览器或搜索引擎的UI可能不同

优化建议

  1. 搜索引擎选择: 可根据用户偏好或搜索结果质量选择不同的搜索引擎
  2. 结果数量: 可根据需要限制返回的结果数量(如前5条)
  3. 缓存机制: 对于相同关键词的搜索,可缓存结果避免重复请求
  4. 并发控制: 避免同时执行多个搜索命令,可能导致UI状态混乱
  5. 失败重试: 如果搜索结果提取失败,可尝试重新获取UI信息(最多3次)
  6. 股票搜索: 当用户查询股票信息时,自动使用雪球网搜索URL模板

【特别注意】