把华为云成长中心的每日任务做成自动化:运行时选型与判据踩坑
背景
华为云开发者成长中心有一套日常任务:签到、浏览鸿蒙案例、发表博客、体验 AI DevSpace 等等。单个任务只要几十秒,但要每天记得做、还要在几个不同站点之间来回切换,实际很容易断签。我把它做成了每天定时自动执行的流程,这篇文章记录方案选型和几个真正花时间的坑。
一、运行时选型:不要用无头浏览器
最直接的想法是用无头浏览器跑脚本。实测下来这条路在登录环节就会卡住:华为云登录页带了设备指纹与验证码风控,无头环境里很容易弹滑块,一旦弹出来,后续所有步骤都无从谈起。
后来的做法是直接操作自己日常在用的那个 Chrome,通过浏览器扩展 + 本地桥接服务,把页面控制权暴露成一个可调用的工具集。同一个账号、同一出口 IP,换成真实 Chrome 之后密码登录一次通过,全程没有验证码。结论是:验证码判定的是“有没有真实渲染”,而不是“是不是 Linux”。
二、跨机桥:Chrome 和脚本不在同一台机器
我的脚本跑在一台常开的 Linux 服务器上,而日常用的 Chrome 在另一台机器。扩展默认只连 127.0.0.1,所以要改两处:扩展里的连接地址改成桥所在机器的局域网地址,桥的监听地址与端口改成环境变量控制。改完在扩展管理页“加载已解压的扩展程序”即可。
排查时最容易走错的一步是:看到“扩展没连上”就去重装扩展。实际上这句话有四种完全不同的原因——桥没跑、桥跑了但那台机没开 Chrome、Chrome 开了但没装扩展、装了但端口指错。判定方式是登录到桥所在机器,用 ss 看端口监听与已建立的连接:如果对端是非回环地址,说明扩展在另一台机器上,这时本机直连的客户端永远连不上,必须改走远端转发的那条调用链。
三、一个必须提前验证的隐藏前提
真实 Chrome 的方案有一个容易被忽略的前提:那个窗口不能被最小化。窗口最小化时标签页不做布局,innerWidth 会变成 0,所有按坐标点击、元素快照都会失效;但读取文字、执行 JS、提交表单这些不需要布局的操作依然正常。于是表现成很怪的“一半好一半坏”:登录成功了,任务按钮却点不动。
判据只有一条:读一次 innerWidth。为 0 就是窗口被最小化了,加长等待、换选择器、加重试都不会好。可以尝试新开一个标签页复测,如果仍然是 0,就只能把那个 Chrome 窗口切回前台。
四、判据要“正向证明”,不能靠“没看到失败”
这套自动化里最贵的一课是判据写法。早期用“页面里没有出现‘请填写’‘请选择’这类提示”来判断表单提交成功,结果页面上常驻一句温馨提示,导致文章明明已经发表成功、页面正在跳转的瞬间被判定为失败,连续几天都在报同一个错。
后来统一改成三种正向判据,按可靠性排序:
- 接口响应体里有实体 ID(例如提交博客后返回 blogId);
- URL 跳到了目标路由(例如完成页);
- 页面上出现了结构性标志(例如登录后的用户菜单节点)。
页面文案只能用来解释现象,不能用来判定成败——固定文案和真实校验错误常常在同一段文本里,正则区分不了。
五、其它几个实测细节
第一,富文本编辑器有 API 就用 API。TinyMCE 系列直接调 setContent 写正文,比自己改 iframe 的 body 再派 input 事件可靠得多,后者常常不同步,字数统计停在 0。第二,发表按钮必须用真实指针事件,脚本里合成的事件对 Vue 组件无效,页面会毫无反应。第三,正文要先于标题写入,先填标题会触发组件重渲染,把编辑器实例换掉。第四,勾选协议类控件往往不是原生 checkbox,而是一个带样式的 span,点不到它就会静默失败、没有任何提示。
结论
把日常任务自动化,难点不在业务逻辑,而在两件事:拿到一个有信任基础的浏览器环境,以及为每一步写出能被证伪的判据。前者决定了你能不能过风控,后者决定了你报的结果是真还是假。把这两件事做对之后,剩下的只是把任务清单逐条对上号而已。
- 点赞
- 收藏
- 关注作者
评论(0)