OA0
OA0 是一个探索 AI 的社区
现在注册
已注册用户请  登录
OA0  ›  代码  ›  BrowserPilot — 让 AI 自动操作浏览器完成网页任务

BrowserPilot — 让 AI 自动操作浏览器完成网页任务

 
  autoscaling ·  2026-03-19 11:00:27 · 11 次点击  · 0 条评论  

🛫 BrowserPilot

一个由自然语言控制的智能网页浏览代理。

演示

语言是人类发出和接收指令最自然的界面。与其编写容易因变更而失效的定制自动化或爬虫代码,创建和添加代理应该像写简单的英语一样简单。

🏗️ 安装

  1. pip install browserpilot
  2. 此处下载最新稳定版的 Chromedriver,并将其放置在与本文件相同的文件夹中。解压。在 Finder 中,右键单击解压后的 chromedriver 并点击"打开"。这将移除默认的限制性权限,允许 Python 访问它。
  3. 以您喜欢的方式创建一个环境变量,将 OPENAI_API_KEY 设置为您自己的 API 密钥。

🦭 使用方法

🗺️ API

使用方式相当简单(见下文)。

from browserpilot.agents.gpt_selenium_agent import GPTSeleniumAgent

instructions = """访问 Google.com
找到所有的文本区域。
找到第一个可见的文本区域。
点击第一个可见的文本区域。
输入"buffalo buffalo buffalo buffalo buffalo"并按下回车。
等待 2 秒。
找到所有指向维基百科的锚点元素。
点击第一个。
等待 10 秒。"""

agent = GPTSeleniumAgent(instructions, "/path/to/chromedriver")
agent.run()

更具挑战性(但也更有趣)的部分是编写自然语言指令。

📑 编写指令

如果您熟悉 Selenium 的工作原理和一般编程,会很有帮助。这是因为本项目使用 GPT-3 将自然语言翻译成代码,因此您应该尽可能精确。从这个角度看,它更像是使用 Copilot 编写代码,而不是与朋友交谈;例如,将事物称为 inputtextarea(而不是"文本框"、"搜索框"),或者"写着'登录'的按钮"而不是"登录按钮"。有时,它也无法识别某些重要的特定词汇,因此最好将它们拆分成单独的行。与其说"找到所有可见的文本区域",不如说"找到所有文本区域",然后"找到第一个可见的文本区域"。

您可以查看 prompts/examples 中的一些示例来开始。

通过将指令包裹在 BEGIN_FUNCTION func_nameEND_FUNCTION 中来创建"函数",然后通过以 RUN_FUNCTIONINJECT_FUNCTION 开头的行来调用它们。下面是一个示例:

BEGIN_FUNCTION search_buffalo
访问 Google.com
找到所有的文本区域。
找到第一个可见的文本区域。
点击第一个可见的文本区域。
输入"buffalo buffalo buffalo buffalo buffalo"并按下回车。
等待 2 秒。
获取页面上所有包含"buffalo"一词的锚点。
点击第一个链接。
END_FUNCTION

RUN_FUNCTION search_buffalo
等待 10 秒。

您也可以选择创建一个包含指令列表的 yaml 或 json 文件。通常,它需要有一个 instructions 字段,以及一个可选的 compiled 字段,其中包含处理后的代码。

参见 buffalo 维基百科示例

您可以向 GPTSeleniumAgent 的构造函数传递一个 instruction_output_file 参数,它会输出一个包含 GPT-3 编译后指令的 yaml 文件,以避免重复支付 API 费用。

✋🏼 贡献

我设想有两种贡献方式。

  • 添加到指令库:阅读上面的"编写指令"部分,并直接提交拉取请求将内容添加到 prompts/ 中!在某个时候,我会制定文件夹命名约定和提交代码评估(安全性、准确性等)的协议。这对于不太熟悉编码的人来说是一个特别有吸引力的选择。
  • 贡献代码:我很乐意接受建议!为仓库做贡献的主要方式是扩展代理的能力,或者完全创建新的代理。最好的方法是熟悉上面的"架构与指令模式",然后 (a) 在 InstructionCompiler 的基础指令中扩展能力列表,以及 (b) 在 GPTSeleniumAgent 中编写相应的方法。

⛩️ 架构与指令模式

本仓库的灵感来源于 Yihui HeAdept.aiNat Friedman 的工作。特别是,使用的基本抽象和指令构建于 Yihui 的黑客马拉松代码之上。预处理 HTML 并使用 GPT-3 智能挑选元素的想法来自 Nat。

  • 使用的指令可以在 instruction compiler 中找到。基础指令用简单的英语描述了浏览代理可以采取的一系列操作、一些关于如何编写代码的通用约定以及对其行为的一些约束。这些操作与 GPTSeleniumAgent 中的方法一一对应。截至目前,这些操作包括:
    • env.driver,Selenium 网络驱动。
    • env.find_elements(by='id', value=None) 查找并返回元素列表。
    • env.find_element(by='id', value=None)env.find_elements() 类似,但只返回第一个元素。
    • env.find_nearest(e, xpath) 可用于定位另一个元素附近的元素。
    • env.send_keys(element, text) 向元素发送 text
    • env.get(url) 访问 url。
    • env.click(element) 点击元素。
    • env.wait(seconds) 等待 seconds 秒。
    • env.scroll(direction, iframe=None) 滚动页面。如果给定了 iframe 则切换到该框架。direction 可以是 "up"、"down"、"left" 或 "right"。
    • env.get_llm_response(text) 向 AI 询问关于字符串 text 的问题。
    • env.retrieve_information(prompt) 根据提示返回页面中的信息字符串。使用 prompt="Summarize:" 进行摘要。通过"retrieve"、"find in the page"或类似命令调用。
    • env.ask_llm_to_find_element(description) 要求 AI 查找与描述匹配的元素。
    • env.query_memory(prompt) 使用提示要求 AI 查询其(嵌入索引)记忆中的已浏览网页。通过"Query memory"调用。
    • env.save(text, filename) 将字符串 text 保存到文件 filename
    • env.get_text_from_page() 返回页面中的自由文本。
  • 其余代码基本上是向 GPT-3 暴露 Selenium 对象的中间件。对于基础指令中提到的每个操作,GPTSeleniumAgent 中都有一个对应的方法。
    • 使用 InstructionCompiler 将用户输入解析为语义连贯的操作块。
  • 代理具有 Memory,使其能够综合理解所见内容。

🎉 已完成

0.2.51
- 感谢 @rapatel0,您现在可以通过 Selenium Grid 远程运行 BrowserPilot。

0.2.42 - 0.2.44
- examples.py 和依赖项的小改动。
- 为大型 Llama Index 升级进行重构。

0.2.38 - 0.2.41
- 将 enable_memory 改为 memory_file,以便更好地控制内存命名。允许用户加载内存。
- 简化 get_text_from_page

0.2.26 - 0.2.37
- 下定决心,将默认模型切换为 gpt-3.5-turbo。成本将大大降低!
- 同时修复了重试机制。之前实际上没有执行重试操作!
- 为 GPT-3.5 稍微调整了指令。
- 令人担忧的是,gpt-3.5-turbo 不断尝试导入模块。我手动移除了尝试导入模块的行。
- 兼容新的 Llama Index 更新。

0.2.14 - 0.2.25
- 添加选项以避免网站检测到机器人。
- 增加更多 OpenAI API 错误处理。
- 改进堆栈跟踪提示和其他一些提示。
- 添加"在视口中显示"的能力。
- 使 from browserpilot.agents import <agent> 成为可能。
- 使 find_elementfind_elements 仅搜索显示的元素。
- 运行完成后保存内存。
- 添加滚动到顶部和底部的选项。

0.2.10 - 0.2.13
- 为 OpenAI 异常添加更多错误处理。
- 将所有嵌入查询改为使用 ChatGPT。
- 摆脱 nltk 依赖!可喜可贺。
- 扩展向 LLM 询问网页问题的最大令牌窗口。
- 修复 Memory 模块中尝试在 OpenAI API 密钥初始化之前访问它的问题。稍微修改提示。
- ❗️ 启用 ChatGPT 与 GPT Index 一起使用,以便我们可以使用 GPT3.5-turbo 查询嵌入。

0.2.7 - 0.2.9
- 在默认模型上摇摆不定。ChatGPT 在编写代码方面效果不佳,因为它对返回的内容过于自由发挥。
- 此外,我尝试稍微压缩了提示,因为它变得有点长。

0.2.4 - 0.2.6
- 为代理添加记忆(仍处于实验阶段且效果不佳)。添加截图元素的能力。
- 围绕版本控制和提示注入的错误修复。

0.2.3
- 将 chrome_options 移到更合理的位置。保持 yaml 文件整洁,你懂的?

0.2.2
- ChatGPT 支持。

0.2.1
- 支持通过字典加载指令。

0.2.0
- 🎬 一个 Studio CLI,帮助迭代测试提示!
- JSON 加载。
- 基本的 iframe 支持。

<0.2.0
- GPTSeleniumAgent 应该能够加载提示和缓存的成功运行(以 yaml 文件形式)。InstructionCompiler 应该能够将指令保存到 yaml。
- 💭 为代理添加摘要能力。
- 演示/测试需要它请求 LLM 综合在线读取内容的场景。
- 🚨 如果能找到一种方法将 HTML 页面的内容输入到 GPT-3 上下文窗口中,并让它可靠地从中挑选出特定元素,那就太好了!

🚨 免责声明

本软件包使用 exec 在 Python 中运行来自 OpenAI API 的代码输出。这被认为是不安全的做法。因此,在使用本软件包时应格外小心。标准免责声明如下。

本软件按"原样"提供,不附带任何明示或暗示的担保,包括但不限于对适销性、特定用途适用性和非侵权性的担保。在任何情况下,作者或版权持有人均不对因使用本软件或与本软件的使用或其他方式相关的任何索赔、损害或其他责任承担责任,无论是在合同诉讼、侵权诉讼还是其他诉讼中。

11 次点击  ∙  0 人收藏  
登录后收藏  
0 条回复
关于 ·  帮助 ·  PING ·  隐私政策 ·  服务条款   
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
耗时 18 ms
Developed with Cursor