自动刷课

1. 记录完整流程

写脚本之前,用 MCP 或自动化脚本让 AI 自己跑一遍完整流程,把每一步记下来:

  • 进入课程页
  • 点击播放
  • 什么时候弹刷脸
  • 点击拍照 / 上传
  • 认证成功后怎么恢复播放
  • 章节结束后怎么切下一节
  • 出异常弹窗时页面行为是什么

脚本的状态和分支都从这步记录来。

2. 保持播放状态稳定

把流程拆成有限状态,比如正常播放、刷脸提示、拍照、上传、认证后恢复、异常恢复。所有动作由状态触发,按当前状态决定下一步做什么。

播放模块和刷脸模块分开,播放只管播放状态的维护,刷脸只管验证流程的推进,两边在状态切换点交接。

页面上经常同时挂多个弹窗(旧层没删只是动画隐藏),需要给弹层排优先级(上传层 > 拍照层 > 提示层),同时过滤掉残留层(fadeOut 动画、不可见遮罩、失活按钮)。

3. 模拟真实用户行为

模拟真实用户点击链路。站点内部函数可以直接调用,但它会绕过页面自身的状态管理——状态流转、权限校验、弹层联动这些链路都会被跳过,页面容易进入非预期状态。需要确认调用之后页面状态和正常点击链路一致,否则走点击更稳。

  • 优先点封面/大播放按钮/可见按钮
  • 每次点击后等状态反馈再做下一步
  • 同类动作加节流(3~8 秒)
  • 每个动作设重试上限

4. 异常恢复

线上一定会遇到刷新无效的情况,需要一条更重的恢复路径:

  • 会话重建
  • 自动回登录页再登录
  • 恢复后重新进入课程并续跑

5. 微信环境适配

页面有微信环境限制时,设置微信 UA 让页面走微信环境分支,功能/弹层/权限链路才能一致。

  • 优先在浏览器层设置(Selenium/Playwright 启动参数)
  • 前端脚本里改 navigator.userAgent 只能覆盖前端判断,请求头不一定一致

示例 UA:

Mozilla/5.0 (Linux; Android 13; V2148A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 XWEB/1160117 MMWEBSDK/20240404 MMWEBID/8833 MicroMessenger/8.0.49.2600(0x28003137) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64

6. 避免人脸照片被判重复

平台会对上传的人脸照片做重复判定,同一张图反复用会被拦。两种思路:

静态图片方案:

  • 素材脚本定时产出新图片,每次做轻微随机变化(亮度/对比度/色彩/边缘噪点等)
  • OBS 读取最新图片输出到虚拟摄像头
  • 页面脚本只负责点击流程
  • 需要处理本地缓存问题(同一路径文件被旧缓存命中)

视频方案:

  • 录一段视频,让人做模棱两可的动作(点头、眨眼、转头这类)
  • 循环播放这段视频输出到虚拟摄像头
  • 动作本身有概率通过平台的活体/动作检测

7. 日志定位问题

日志至少包含:

  • 当前状态
  • 触发动作
  • 动作结果
  • 状态切换
  • 重试次数

看到一段日志就能定位卡在哪一步。