- settings: study.mode fast|normal and study.parallel 1-5 - normal mode: one headless browser per video, visibility keep-alive, auto-degrade when the platform enforces order - report study/log/detail/save before isComplete; drop lastProgressTime on completion - complete periodType 10/13 container nodes and recompute counters via PUT calFinalScore - capture mode: POST /api/capture records all XHR/fetch including new tabs - UI: study mode in settings, capture / stop-capture menu items
4.5 KiB
TODO
待修复:首次进入课程会弹提示挡住,必须手动点一下才能进课程
状态:暂停(2026-10-27 18:27)。现象确认存在,但还没抓到具体弹窗,修复方案未定。
现象
- 一个课程/课时第一次进入时,页面会先出提示(弹层/遮罩/确认框),不点它进不去。
- 手动点一下之后就能正常进入、正常播放;再进同一门课就不再出现。
- 因为卡在这一步,自动学习流程跑不下去,只能人工点。
需要先确认(下一步的起点)
- 那个提示到底是哪一层的东西,三选一:
- 培训平台(
study.dgjy.net)自己的「学习须知 / 继续学习 / 我已知晓」弹层; - 播放页
courseVideo里的播放前确认(点「开始学习」才 load video); - 浏览器层的 autoplay / 全屏 / 权限提示。
- 培训平台(
- 弹层出现的确切条件(首次进课程?首次进课时?换设备/换浏览器算不算首次?)。
- 点掉它之后前端发了什么请求(有没有
period/study/log、student/join之类)。
已排查到的线索
-
触发点在「进入课程 → 课时」这条路径上,接口层面看不出来:
app.py的学习主流程是纯 HTTP(study_complete_period→period/study/log), 只有kind == "direct"的直链视频才用 Playwright 开真浏览器(play_period_to_end,app.py:1664)。 -
play_period_to_end里已经有一处「盲点确定」的补丁,说明历史上就撞过类似弹层:ok = pg.query_selector(".el-message-box__btns .el-button--primary") if ok: ok.click()但它只在视频开始播放之后每 2 秒点一次,且只认 Element-UI 的 message-box; 如果是进入页面时的
el-dialog遮罩,这个选择器打不中。 -
新版平台课程页地址(
discover()拿到的page_url,日志里 token 打码):https://study.dgjy.net/training/trainDetails?id=<trainCourseId>&isFront=1 -
课程页点「继续学习」后跳到课时列表页:
https://study.dgjy.net/training/curriculum?id=<moocCourseId>&isFront=1&courseId=<trainCourseId>视频课时在period/list/tree/studyLog里,periodType=2,file.fileType=mooc_video。 -
播放页拼法见 app.py:1675:
https://study.dgjy.net/training/courseVideo?classhour=<periodId>&isJoin=1&needJoin=1&courseId=<trainCourseId>&isFront=1&trainCourseId=<trainCourseId>
为什么这次没抓到
演示账号(库里唯一账号)的两门课 12 + 14 个课时全部已 completeTime 有值,
「首次进入」的前置状态已经不在了,弹层复现不出来。
下次要么换一个没学过的账号/课程,要么把某个课时的 studyLog 清掉再试。
下次的复现 + 取证办法
用带界面的 Playwright 窗口,把登录后的 cookie 注进去,人工在窗口里点到弹层出现:
python -c跑一遍app.login(user, pw),把sess.cookies(只取*.dgjy.net)写成 JSON;launch_persistent_context(headless=False),ctx.add_cookies(...),goto课程页;- 同时挂:
page.on("request"/"response")全量记录(过滤掉 png/css/font);document.addEventListener('click', ..., true)记录target的 CSS 路径和文字;- 每 2 秒
page.screenshot()一张; - 每 2 秒扫一次可见的
.el-message-box / .el-dialog / [role=dialog],把innerText落日志。
- 人工点掉弹层 → 看日志里「点击前后出现了哪个 dialog 文本 + 紧随其后的请求」,就知道该自动点哪个。
修好后要做到
- 自动学习时不再需要人工点一下:进课程/进课时后若出现确认弹层,自动识别并点掉,
再继续走
period/study/log或courseVideo播放。 - 只点「继续/确定/我已知晓」这类无副作用的按钮,别乱点「提交/评价」。
- 日志里留下「已自动关闭弹层:<文字>」,方便出问题时对账。
相关代码位置
| 位置 | 作用 |
|---|---|
app.py:1664 play_period_to_end |
直链视频真播;已有盲点 .el-message-box__btns .el-button--primary |
app.py:1530 run_study_course |
新版平台课程主流程(反馈表 / 测验 / 视频) |
app.py:1013 discover_study |
读课程结构,产出 page_url / train_id / courseware |
app.py:1128 study_period_log |
课时上报接口,isComplete 走这里 |
app.py:633 _discover_once |
jspx 课程页 → study trainDetails 的跳转与 token 落 cookie |