
# 我把重复的网页农场操作做成了可视化托管工具Node.js Playwright 多账号自动化实践平时操作网页农场时收菜、播种、浇水、开宝箱、签到和查看角色状态都很机械。账号一多还需要反复切换页面、等待作物成熟很容易漏掉任务。于是我用 **Node.js Express Playwright** 写了一个多账号浏览器自动化管理工具并将项目开源。它不是一个简单的定时点击脚本而是带有账号隔离、任务编排、状态快照和可视化管理页面的完整小型服务。项目地址[https://gitee.com/hellojidian/csdn-battle-script](https://gitee.com/hellojidian/csdn-battle-script) 本项目仅供浏览器自动化技术学习和个人效率工具研究。使用前请遵守目标网站的服务条款不要用于破坏服务、绕过安全限制或影响其他用户。## 这个工具解决了什么问题最初我的需求只是自动处理农场但随着流程增加普通的单文件脚本很快遇到了几个问题1. 多个账号如何保存各自的登录状态2. 如何限制同时打开的浏览器数量避免内存爆掉3. 作物还没成熟时怎样在合适的时间再次启动4. 页面加载慢、DOM 没渲染完成或者接口延迟时怎样避免误操作5. 如何知道每个账号刚才执行到了哪一步6. 自动化出错后如何留下足够的信息方便排查目前项目已经把这些问题集中到一个管理页面中处理。## 主要功能### 1. 多账号独立运行每个账号都有独立的 Playwright 持久化浏览器目录Cookie 和登录状态互不影响。管理页面可以添加、编辑、启用或停用账号也能单独启动、停止某个账号。为了控制资源占用可以动态设置最大并发数。其余账号会进入等待队列在有空闲位置并满足执行条件时再启动。### 2. 完整的任务流程目前支持的流程包括- 农场自动收获、播种和浇水- 双倍经验状态处理- 每日典藏宝箱- 每日活动签到- 斗塔托管- 家园打小怪- 角色、装备和农田快照- 经验变化统计不同功能可以在管理页面独立开启或关闭。### 3. 成熟时间计划与手动模式程序会根据农田快照计算最早成熟时间并在成熟后加入随机延迟再唤醒对应账号。这样不需要让所有浏览器一直挂在后台。我还增加了“自动计划轮询”总开关它统一控制- 作物成熟时间自动唤醒- 每日固定任务轮询- 浏览器实例运行满 24 小时后的自动重启关闭开关后服务不会自动启动账号但仍然可以手动启动单个账号或者点击“启动一轮”执行一次完整流程。这个设计比较适合本地调试和按需使用。### 4. 可视化快照与日志管理页面会显示每个账号的- 当前流程和运行状态- 农田地块状态及剩余成熟时间- 当日宝箱和签到结果- 角色等级、体力和生命值- 装备及技能快照- 最近运行日志遇到页面异常时程序还可以保存 DOM 快照方便定位选择器失效、网络延迟或页面结构变化。### 5. 经验统计项目带有独立的经验统计页面可以查看所有纳入统计账号的当前经验、每日增减趋势、角色名片数量和宝箱执行情况。## 技术实现项目主要使用- **Node.js**运行环境- **Express**管理页面和接口服务- **Playwright**浏览器启动、登录状态和页面控制- **原生 HTML / CSS / JavaScript**管理页面- **JSON**本地配置和账号数据整体流程可以简单理解为text管理服务启动↓读取账号与脚本开关↓选择到期或手动指定的账号↓启动独立浏览器上下文↓登录校验 → 农场 → 宝箱 → 斗塔 → 签到与打怪↓保存快照并关闭浏览器↓等待下一次手动执行或计划唤醒页面操作中加入了加载等待、接口状态等待、重复执行保护、启动重试和卡死看门狗尽量避免因为页面短暂卡顿造成连续点击。## Windows 本地运行### 1. 下载项目powershellgit clone https://gitee.com/hellojidian/csdn-battle-script.gitcd csdn-battle-script### 2. 安装依赖powershellnpm installnpm run install:browsers第二条命令会安装 Playwright 使用的 Chromium 浏览器。### 3. 启动服务powershellnpm start浏览器访问[http://localhost:3131](http://localhost:3131)默认管理账号admin默认管理密码123456首次启动会自动生成本地配置账号列表默认为空。登录管理页面后再添加自己的游戏账号即可。## 配置和隐私安全真实账号、管理密码、浏览器 Cookie、运行日志和调试快照都不应该提交到公开仓库。项目已经通过 .gitignore 排除textconfig/accounts.jsonconfig/auth.jsonconfig/app.jsonprofiles/logs/debug-dom/node_modules/公开项目时只保留示例配置。建议把默认管理密码改成自己的强密码尤其不要把管理服务端口直接暴露到公网。## 为什么选择 Playwright相比简单的 HTTP 请求或浏览器插件Playwright 更适合这种需要真实登录状态和页面交互的流程- 可以保存持久化登录状态- 支持等待元素、URL 和页面加载状态- 能监听页面异常并截图或保存 DOM- 可以为每个账号创建隔离环境- 调试时可以显示真实浏览器窗口当然代价是 Chromium 会占用一定内存因此项目加入了并发限制、流程结束关闭和可控的定时重启。## 后续计划后续准备继续完善- 更细粒度的任务计划配置- 更清晰的运行失败提示- 管理页面操作体验- 更多流程测试- Docker 或更简单的部署方式如果这个项目对你的 Playwright 学习或浏览器自动化实践有帮助欢迎在 Gitee 点一个 Star也欢迎提交 Issue 一起交流。项目地址[https://gitee.com/hellojidian/csdn-battle-script](https://gitee.com/hellojidian/csdn-battle-script)## 二级更新### 新增时间管理与随机执行窗口在原有成熟时间自动唤醒和手动“启动一轮”的基础上这次增加了独立的“时间管理”功能。管理员可以自己设置哪些星期允许运行以及当天允许执行的时间范围。进入管理页面后点击顶部的“时间管理”通过管理员密码验证即可打开设置窗口。每条计划都可以选择周一到周日中的任意日期并设置随机执行的开始时间和结束时间。计划可以添加多条保存后统一启用。例如设置周一到周五 08:00 至 09:00系统会在这个窗口内随机生成一个实际执行时间可能是 08:17也可能是 08:43。页面会直接显示本周期的“下次执行”时间方便确认任务什么时候启动。时间范围支持 00:00 到 24:00精确到分钟。24:00 表示所选日期结束后的次日 00:00如果开始时间和结束时间相同则按照固定时间执行。随机时间并不是调度器每检查一次就重新生成而是在创建下一个执行周期时只生成一次并将结果保存到本地配置中。这样即使重启 Node.js 服务下次执行时间也不会发生变化。如果服务器停机导致本次时间已经错过系统默认跳过本次不会在服务恢复后突然补跑。服务端调度器每 15 秒检查一次计划。到达随机时间后直接复用现有的 startNewRound() 模块因此手动点击“启动一轮”和时间计划触发使用的是同一套账号停止、状态清理和重新轮换流程。执行完成后系统会从下一个符合星期条件的日期中生成新的随机时间确保同一条计划在一个日期周期内只运行一次。时间计划保存在 config/app.json 的 timeManagement 字段中其中星期使用数字 1 到 7 表示周一到周日页面中文只负责展示服务端逻辑不依赖中文内容判断。本次更新还补充了上海时区转换、随机窗口生成、重启后保留执行时间、错过窗口不补跑、下一日期周期以及 24:00 边界处理等单元测试。