定时浏览器任务的可靠运行:会话复用、幂等与人工验证
需要登录的网站任务,表面上是“打开页面并点击按钮”,真正容易出错的却是登录状态过期、二次验证、重复提交和结果无法确认。下面用每日任务为例,整理一套可以长期维护的浏览器自动化流程。
一、为每个账号保留独立浏览器配置
浏览器配置目录不仅保存 Cookie,还可能保存设备信任等站点状态。每个账号使用独立目录,任务结束后保留配置,下次从同一配置启动浏览器。目录只允许任务用户访问,备份时按凭据处理。持久配置能减少重复登录,但不能保证网站永远不要求验证;登录是否有效,必须以当前页面的实际状态为准。
二、把登录和任务执行放在同一个会话
任务开始先访问目标页面,检查是否仍在登录态。未登录时,在当前浏览器完成官方登录流程,然后重新打开目标页面确认身份。若页面要求短信或图形验证,应暂停并由账号持有人完成;不要用猜测、循环提交旧验证码或其他方式绕过安全验证。验证码到达后再继续同一浏览器中的操作,可以避免“登录成功但执行任务的浏览器仍未登录”的问题。
三、点击前后都要检查状态
先识别“今日已完成”,只有明确出现可点击的任务按钮时才提交。提交后等待网站显示成功状态,再记录成功。若点击已发出,但页面超时或结果不明,应停止自动重试,并在下一次运行时先重新查询任务状态。否则一次网络超时可能变成多次提交。
async function runDailyTask(page) {
await ensureLoggedIn(page);
if (await isCompleted(page)) return 'already_done';
await page.getByRole('button', { name: '立即签到' }).click();
if (await isCompleted(page)) return 'success';
throw new Error('提交后状态不明,需要重新查询');
}
上面的代码是流程示意:ensureLoggedIn 和 isCompleted 必须按实际站点页面实现。关键是“提交后状态不明”不能直接当作失败再次点击。
四、重试只覆盖提交前的临时故障
页面首次加载超时、短暂连接中断等,可以设置少量重试并逐次增加等待时间。登录失效、安全验证和页面结构变化需要明确处理,不属于可盲目重试的故障。按钮一旦点击,重试入口应回到“查询当前状态”,而不是重复点击。
五、让日志和通知说明真实结果
日志记录账号备注、操作阶段、最终状态及错误类别即可,不记录密码、Cookie、一次性验证码或完整请求头。通知区分“成功”“今日已完成”“失败”,通知投递失败单独记录,不能把已经完成的任务改判为失败。长期运行时,还应关注浏览器进程、配置目录权限和页面结构变更。
这套方法的核心是把浏览器任务当作状态机:先确认身份,再确认任务状态,提交一次,最后核实结果。它不能消除网站的安全验证,但能让自动化在验证出现时安全地停下,并在验证完成后继续工作。
- 点赞
- 收藏
- 关注作者
评论(0)