添加了自动重登录定时器(Implement auto relogin feature with timer) - #4
Conversation
添加了自动重登录定时器以防止因登陆过期失效而影响程序运行——无法正常提交选课申请(Added auto relogin functionality with a timer that triggers every 2 hours.)
|
感谢贡献,主要有两个问题。 |
- 去掉固定 2 小时的重登录定时器,改为在请求返回 DLSF_SUCCESS: false(或请求异常)时 才尝试重新登录,并在重登录成功后自动重试原请求 - 抢课链路中的 initACC、initSelCourses、scSubmit 三个接口改用该封装,轮询与提交遇到 登录失效时可以自愈,不必等到下一个轮询周期 - 重登录使用输入框中用户最新填写的用户名密码,并在登录成功后回写,避免用旧凭据登录 - 重登录与 cookie 探测都做单飞(single-flight)处理,多个 worker 同时发现失效只会登录一次 - 增加 30 秒冷却与连续失败上限,避免频繁登录触发 CAS 风控 - 记录登录时间,在检测到失效时打印距上次登录的间隔,便于统计 cookie 实际存活时长
|
感谢意见,都按这两点重做了: 1. 重登逻辑改到请求结果检测里触发 去掉了固定 2 小时的定时器。服务端在拿不到教务系统的有效响应时(例如 cookie 失效被重定向到登录页、JSON 解析失败)会统一返回 2. 不再用旧的用户名密码 登录改为优先读取输入框里当前填写的内容(回退到 localStorage),登录成功后再回写,避免"改了输入框但没保存、重登仍然用旧密码"的情况。 另外加了两个保护:重登和 cookie 探测都做单飞(single-flight)处理,多个 worker 同时发现失效时只会真正登录一次;并加了 30 秒冷却和连续失败上限(连续失败 3 次后停止并提示),避免凭据错误时反复打 CAS 触发风控。 关于登录失效这件事:我这边确实遇到过,长时间挂着脚本时轮询会一直停在"课程信息获取失败",只能手动刷新页面重新登录;也问了身边的同学,长时间挂脚本时同样有一部分人遇到这个问题,所以想把这段自愈逻辑补上。另外"过期时间"确实是我自己拍的,现在登录成功会记录登录时间,检测到失效时会打印距上次登录的分钟数,之后如果拿到实际存活时长的数据我再补上来。 如果这个方向可以,我可以再把其他接口也接上;如果你觉得哪里还是多余,我再精简。 |
添加了自动重登录定时器以防止因登陆过期失效而影响程序运行——无法正常提交选课申请(Added auto relogin functionality with a timer that triggers every 2 hours.)