Skip to content

添加了自动重登录定时器(Implement auto relogin feature with timer) - #4

Merged
Ltfjx merged 2 commits into
Ltfjx:mainfrom
RiceXi:patch-2
Sep 20, 2026
Merged

Ltfjx merged 2 commits into
Ltfjx:mainfrom
RiceXi:patch-2

Conversation

@RiceXi

@RiceXi RiceXi commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

添加了自动重登录定时器以防止因登陆过期失效而影响程序运行——无法正常提交选课申请(Added auto relogin functionality with a timer that triggers every 2 hours.)

添加了自动重登录定时器以防止因登陆过期失效而影响程序运行——无法正常提交选课申请(Added auto relogin functionality with a timer that triggers every 2 hours.)
@Ltfjx

Ltfjx commented Jun 19, 2026

Copy link
Copy Markdown
Owner

感谢贡献,主要有两个问题。
第一个是把重登逻辑写在请求结果检测里更合适;
第二个是如果用户在填写了用户名密码后没有刷新网站,那么重新登录还是会用老的用户名密码来进行,这一点不符合预期。
另外,其实我在之前的使用过程中没有遇到过登录失效的情况,所以我当时才没有写重新登录的逻辑。总而言之这个功能目前还需要更多考量,如果还有其他想法的话,欢迎提出。

- 去掉固定 2 小时的重登录定时器,改为在请求返回 DLSF_SUCCESS: false(或请求异常)时
  才尝试重新登录,并在重登录成功后自动重试原请求
- 抢课链路中的 initACC、initSelCourses、scSubmit 三个接口改用该封装,轮询与提交遇到
  登录失效时可以自愈,不必等到下一个轮询周期
- 重登录使用输入框中用户最新填写的用户名密码,并在登录成功后回写,避免用旧凭据登录
- 重登录与 cookie 探测都做单飞(single-flight)处理,多个 worker 同时发现失效只会登录一次
- 增加 30 秒冷却与连续失败上限,避免频繁登录触发 CAS 风控
- 记录登录时间,在检测到失效时打印距上次登录的间隔,便于统计 cookie 实际存活时长
@RiceXi

RiceXi commented Sep 18, 2026

Copy link
Copy Markdown
Contributor Author

感谢意见,都按这两点重做了:

1. 重登逻辑改到请求结果检测里触发

去掉了固定 2 小时的定时器。服务端在拿不到教务系统的有效响应时(例如 cookie 失效被重定向到登录页、JSON 解析失败)会统一返回 DLSF_SUCCESS: false,现在请求返回这个值(或请求异常)时,会先用一次 initstudinfo 探测确认 cookie 是否真的失效,确认失效后才重新登录,并在重登成功后自动重试刚才那次请求。抢课链路的 initACC、initSelCourses、scSubmit 都走这个封装,轮询和提交都能自愈,不用等到下一个轮询周期。

2. 不再用旧的用户名密码

登录改为优先读取输入框里当前填写的内容(回退到 localStorage),登录成功后再回写,避免"改了输入框但没保存、重登仍然用旧密码"的情况。

另外加了两个保护:重登和 cookie 探测都做单飞(single-flight)处理,多个 worker 同时发现失效时只会真正登录一次;并加了 30 秒冷却和连续失败上限(连续失败 3 次后停止并提示),避免凭据错误时反复打 CAS 触发风控。

关于登录失效这件事:我这边确实遇到过,长时间挂着脚本时轮询会一直停在"课程信息获取失败",只能手动刷新页面重新登录;也问了身边的同学,长时间挂脚本时同样有一部分人遇到这个问题,所以想把这段自愈逻辑补上。另外"过期时间"确实是我自己拍的,现在登录成功会记录登录时间,检测到失效时会打印距上次登录的分钟数,之后如果拿到实际存活时长的数据我再补上来。

如果这个方向可以,我可以再把其他接口也接上;如果你觉得哪里还是多余,我再精简。

@Ltfjx
Ltfjx merged commit d901728 into Ltfjx:main Sep 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants