「信任此浏览器」为什么没生效:自动化脚本里的持久化 Profile 与 Cookie 落盘
现象:选了「信任此浏览器」,第二天照样收短信验证码
有个每天跑一次的浏览器自动化脚本,用来登录华为云开发者中心做日常任务。第一次登录时在「是否信任此浏览器?」弹窗里选了「信任」,弹窗上也写得很清楚:若信任,当您下次登录时,系统将不会要求您提供验证码。结果第二天脚本一启动,二次验证又弹了出来,又得收一条短信。
第一反应是平台没记住,或者是风控策略太严。实际排查下来,问题不在服务端,而在脚本自己身上。
排查:信任标记到底存在哪
「信任设备」这类能力,本质上是服务端在登录成功后往浏览器写入一个长期有效的设备标识:可能是一组 cookie,也可能是 localStorage 里的 device token。下一次认证时,服务端读到这个标识,就跳过短信二次验证。它依赖三件事:
- 浏览器把标识持久化到磁盘;
- 下次启动读的还是同一份用户数据;
- 退出时正常关闭,让缓存里的数据真正落盘。
顺着这三条看脚本,问题一眼就出来了:用的是 chromium.launch() 加 browser.newContext()。Playwright 对这种非持久化上下文,会在临时目录里创建一个随机的 user-data-dir,浏览器进程退出后目录就被清理。也就是说,服务端确实下发并写入了信任标识,但脚本一关,标识连同整个 profile 一起没了。第二天启动时是一个全新的浏览器、全新的设备指纹,服务端自然只能当成陌生设备,重新发验证码。
解法:固定 userDataDir + 优雅退出
把启动方式换成持久化上下文,显式指定一个工作区内的固定目录,同时保留反自动化检测的常规处理:
const PROFILE = '/workspace/.workbuddy/browser-profile/huawei-grow';
fs.mkdirSync(PROFILE, { recursive: true });
ctx = await chromium.launchPersistentContext(PROFILE, {
executablePath: CHROME,
headless: true,
args: ['--disable-blink-features=AutomationControlled'],
ignoreDefaultArgs: ['--enable-automation'],
userAgent: UA,
locale: 'zh-CN',
timezoneId: 'Asia/Shanghai',
});
退出更要小心。用 kill -9 或强杀进程树,Chromium 来不及 flush cookie / LevelDB,写了一半的状态可能直接损坏。给常驻脚本挂一个退出指令和信号钩子:
async function shutdown() {
try { if (ctx) await ctx.close(); } catch (_) {}
process.exit(0);
}
process.on('SIGINT', shutdown);
process.on('SIGTERM', shutdown);
改完之后重走一次完整登录(密码 + 短信),在弹窗里选「信任」。之后同一目录启动,二次验证不再出现。
顺带踩到的两个定位坑
登录页新旧两套 UI 共存。 页面里同时存在旧版 AngularJS 的 #loginBtn 和新版按钮,旧按钮宽高为 0、class 里带 loginBtnDisabled,按文本取第一个元素必然点空。正确做法是按可见尺寸过滤,点击 .hwid-btn.hwid-btn-primary。
密码框也有隐藏的孪生节点。 input[type=password] 会先命中一个 .hwid-hidden-password 的不可见输入框,直接 fill 会等到超时。用语义 class input.hwid-input-pwd,或者 Playwright 的 :visible 伪类更稳:
page.locator("input[placeholder='短信验证码']:visible").fill(code);
验证码输入框同理——手机号登录 tab 下还留着一个同 placeholder 的隐藏节点。
小结
「信任此浏览器」不是服务端单方面的开关,它是一份需要客户端好好保管的凭据。自动化脚本里最容易忽略的不是点没点那个按钮,而是 profile 有没有落盘、进程有没有被优雅关闭。把 launchPersistentContext、固定 userDataDir、ctx.close() 这三件事补齐,设备信任才真正生效,也能少收一次短信验证码。
另外留一句经验:迁移到固定 profile 的第一次启动,仍需要完整登录一次并在弹窗里选信任,这是 unavoidable 的一次性成本;之后才是免验证。别因为第一次还要验证码就误判改动没生效。
- 点赞
- 收藏
- 关注作者
评论(0)