浏览器完全自动化开源 CLI 工具Beachpatrol
Beachpatrol:浏览器终端用户自动化CLI中心。释放在线生活任务的全部潜力
简介
Beachpatrol 是一个 CLI 工具,旨在替代并自动化您的日常网页浏览器。
https://github.com/sebastiancarlos/beachpatrol/assets/88276600/bc3bf9e8-28e2-48ef-a1f4-8754b4918916
运行 beachpatrol 可启动 Chromium 或 Firefox 浏览器,并通过 Playwright 脚本进行外部控制。您可以将其作为日常浏览器使用,其功能与普通浏览器无异。
您还可以使用 beachpatrol --profile <profile-name> 启动特定配置文件,或使用 beachpatrol --incognito 进入无痕模式。
要实现自动化,请在 beachpatrol/commands 文件夹中创建一个自定义的 Playwright 脚本。然后运行 beachmsg <script-name> [<argument>...],脚本将被执行。您可以使用 Playwright API 在当前聚焦的标签页上操作,切换到现有标签页,打开新标签页,或使用无头标签页。
如果您不想频繁切换到 CLI 来操作浏览器,可以安装 beachpatrol-browser-extension。其用户界面允许您选择命令并传入参数,通过浏览器扩展的 Native Messaging 功能调用 beachmsg。此外,界面会高亮适用于当前 URL 的命令,为常见场景(如分页和下拉菜单)提供 GUI 元素,并支持快捷键
您可以用 Beachpatrol 自动化什么?一切皆有可能:
- 检查电子邮件。
- 查看银行交易记录。
- 从网站下载文件。
- 将当前标签页的文本导出到文件。
- 填写在线表单。
- 检查社交媒体或工作通讯平台的消息。
- 与操作系统集成:将浏览器任务添加到 Bash/Python 脚本中。
- 所有这些功能都可在您的日常浏览器中实现!
要求
- Linux(Wayland 或 X11)、macOS 或 Windows
- Node.js 和 NPM
- Chromium 或 Firefox(Playwright 会自动安装)
安装
- 克隆仓库:
git clone https://github.com/sebastiancarlos/beachpatrol - 进入文件夹:
cd beachpatrol - 运行
npm install安装依赖。 - 运行
make安装可执行文件的符号链接(默认安装到/usr/local/bin,该路径应在您的PATH中)。- 在 Windows 上,可以运行
npm install -g .全局安装。
- 在 Windows 上,可以运行
示例
- 运行
beachpatrol启动浏览器。- 可选:使用
beachpatrol &在后台运行。
- 可选:使用
- 将其作为常规浏览器使用。
- 注意:由于 Chromium 的限制,目前无法通过浏览器内置功能切换配置文件,但未来可能会修复。
- 按需安装浏览器扩展。
- 关闭后重新运行
beachpatrol,您仍会保持所有网站的登录状态。 - 如需使用其他配置文件,运行
beachpatrol --profile new-profile-name。
- 运行
beachmsg smoke-test执行预装的测试命令,完成经典的 Selenium 冒烟测试。 - 如果显示 “Form submitted”,则表示运行成功。
- 现在您可以创建自己的自动化命令了!
编写第一个命令
假设您想自动化网页搜索,可以在 commands/search.js 文件中(相对于克隆的仓库目录)添加以下内容:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(line export default async (context, ...searchTerms) => { const page = await context.newPage(); await page.goto( `https://www.google.com/search?q=${encodeURIComponent(searchTerms.join(" "))}`, ); };
每个 Beachpatrol 命令必须导出一个默认的异步函数,作为命令的入口点。
该函数应接收:
- Playwright 浏览器上下文作为第一个参数,
- 以及命令的参数(如果有)。
然后,您可以通过与 BrowserContext API 交互来自动化浏览器操作。
上述 search.js 命令会打开一个新标签页(context.newPage()),执行任务后将其保持为焦点。其他命令可能针对当前聚焦的标签页操作,或要求特定标签页已打开。具体实现取决于您的需求,您可以自由设计命令。
运行以下命令执行新命令:
ounter(line beachmsg search "您的搜索关键词"
提示:您可以编辑命令文件并重新运行,无需重启 beachpatrol 服务器!更改会自动生效。
您还可以参考内置的 commands/smoke-test.js 命令获取灵感。
技术细节
首先,beachpatrol 包含一个定制的 Playwright 脚本来启动浏览器。它传递的参数尽可能还原非自动化浏览器的体验。例如,它不会设置固定视口(这是 Playwright 自动化测试的默认行为)。
Beachpatrol 还安装并加载了 patchright、playwright-extra 和 puppeteer-extra-plugin-stealth 包。这些工具用于隐藏浏览器的自动化特征,这是实现基本功能(如 Google 登录)的必要条件。
当然,这些工具与网站防爬措施之间存在持续的博弈。因此,它们可能随时失效。Beachpatrol 承诺会在必要时采用新的反检测技术,并鼓励用户遵守各网站的服务条款。
目前,patchright 是完成此任务的最佳工具之一,但它不支持 Firefox。对于 Firefox,我们使用 puppeteer-extra-plugin-stealth,可能会遇到 Cloudflare 误报或额外的 Google 验证码等问题。
浏览器启动后,会监听 UNIX 套接字 beachpatrol.sock,接收来自 beachmsg 的消息。
使用方法
用法:beachpatrol [--profile <profile_name>] [--incognito] [--headless] - 使用指定配置文件启动浏览器。 - 打开套接字以监听命令。可通过 'beachmsg' 命令发送命令。 选项: --profile <profile_name> 使用指定配置文件。默认:default --browser <browser_name> 使用指定浏览器。默认:chromium 支持的浏览器:chromium, firefox --incognito 以无痕模式启动浏览器。 --headless 以无头模式启动浏览器。 --help 显示帮助信息。
用法:beachmsg <command> [args...] - 向控制浏览器的 beachpatrol 服务器发送命令。 - 提供的命令必须存在于 beachpatrol 的 "commands" 目录中。 选项: --help 显示帮助信息。
常见问题
声称浏览器无法自动化是否有些夸张?
当我们说浏览器无法自动化时,我们更多是在思考像 Bash、Vim 或 Emacs 这样的工具所提供的深度自动化能力(在这些工具中,几乎每个交互都可以轻松编写脚本并无缝集成到自定义工作流中)。
我们承认现有的自动化工具(如自动填充、鼠标键盘宏、书签脚本、扩展以及 Playwright 等工具)可以实现部分功能。
Beachpatrol 旨在为现有技术带来新的视角,将自动化工具重新构想为日常浏览的一部分,而不仅仅是一次性任务。就像您喜爱的 Shell 或可扩展文本编辑器一样。
简而言之,我们的目标是将现有的自动化工具(目前主要用于测试或爬取)调整为适合日常浏览的工具,并提供简单且对高级用户友好的 UI。
但 Beachpatrol 不就是 Playwright 浏览器的封装吗?
确实如此,但它提供了多项增值功能:
- 反自动化检测:Beachpatrol 精心选择 Playwright 选项和插件,以模拟常规浏览器的行为,帮助规避网站用于识别和阻止自动化浏览器的检测机制。
- 客户端/服务器架构:
beachpatrol启动浏览器并监听套接字,独立的客户端beachmsg可用于向受控浏览器发送 Playwright 命令。这种分离提供了更大的灵活性和与其他工具的集成能力。 - 浏览器扩展:配套的浏览器扩展设计用于与套接字通信并发送命令,提供用户友好的图形界面和上下文工具。
为什么选择 Playwright 而非 Selenium?
初始的浏览器启动基准测试表明,Playwright 更具优势。
| 浏览器 | 启动时间 |
|---|---|
| Playwright Chrome | 1.7s |
| Selenium Node Chrome | 1.8s |
| Selenium Java Chrome | 4s |
| Playwright Firefox | 4.3s |
| Selenium Java Firefox | 6s |
| Selenium Node Firefox | 9s |
为什么选择 JavaScript/Node.js 而非 Python?
尽管 Python 是网页自动化的热门语言,但我们选择 JavaScript 以实现与浏览器扩展的代码共享。
为什么使用外部自动化工具(Playwright)而非浏览器扩展?
类似功能确实可以通过用户脚本管理器(如 Violentmonkey 浏览器扩展)实现。
但 Beachpatrol 允许我们从操作系统和浏览器扩展两端控制浏览器,且我们的优先级是操作系统。此外,浏览器扩展与操作系统的交互存在限制。因此,Playwright 是更自然的选择。
此外,虽然从扩展控制浏览器是可能的,但 Manifest v3 移除了执行第三方代码字符串的能力。流行的自动化扩展(如 Greasemonkey 和 Tampermonkey)可能也会受到 Manifest v3 的影响。替代方案是将代码嵌入扩展,但这需要在每次更改后重新打包扩展。虽然存在一些变通方法,并且未来可能有 Manifest v3 解决方案,但这条路径充满挑战。
相比之下,鉴于企业对传统浏览器测试的需求,Selenium 及相关工具更可能在可预见的未来继续工作。
Beachpatrol 与书签脚本相比如何?
书签脚本适合通过点击快速执行任务,但其功能局限于用户触发的操作,难以处理复杂工作流(如基于特定时间的自动化或与操作系统功能的交互)。
此外,个人偏好也是一个因素。对于喜欢更精细控制的用户,将自动化脚本保存在文件系统中感觉更整洁,且不受特定浏览器生态的限制。但我们承认书签脚本有其优势,可能是许多用户的首选。
为每个任务编写 Playwright 脚本太耗时。
您可以使用 Chromium 开发者工具的 Recorder 标签页 录制操作并导出为 Puppeteer 脚本(其 API 与 Playwright 相同)。或者使用 Playwright 的 codegen。
此外,鉴于 Playwright 的流行,您可以用自然语言描述任务并向 AI 请求生成 Playwright 脚本。稍加练习后,这将帮助您快速完成脚本编写。
项目地址
https://github.com/sebastiancarlos/beachpatrol/blob/main/README.md
扫码加入技术交流群,备注「开发语言-城市-昵称」
(文:GitHubStore)