Files
study-tool/todo.md
T
study-tool 585a7a28dd feat: study modes (fast/parallel) and course-container completion fix
- 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
2026-10-27 22:30:57 +08:00

80 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TODO
## 待修复:首次进入课程会弹提示挡住,必须手动点一下才能进课程
**状态**:暂停(2026-10-27 18:27)。现象确认存在,但还没抓到具体弹窗,修复方案未定。
### 现象
- 一个课程/课时**第一次**进入时,页面会先出提示(弹层/遮罩/确认框),不点它进不去。
- 手动点一下之后就能正常进入、正常播放;再进同一门课就不再出现。
- 因为卡在这一步,自动学习流程跑不下去,只能人工点。
### 需要先确认(下一步的起点)
1. 那个提示到底是哪一层的东西,三选一:
- 培训平台(`study.dgjy.net`)自己的「学习须知 / 继续学习 / 我已知晓」弹层;
- 播放页 `courseVideo` 里的播放前确认(点「开始学习」才 load video);
- 浏览器层的 autoplay / 全屏 / 权限提示。
2. 弹层出现的确切条件(首次进课程?首次进课时?换设备/换浏览器算不算首次?)。
3. 点掉它之后前端发了什么请求(有没有 `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` 里已经有一处「盲点确定」的补丁,说明历史上就撞过类似弹层:
```python
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 注进去,人工在窗口里点到弹层出现:
1. `python -c` 跑一遍 `app.login(user, pw)`,把 `sess.cookies`(只取 `*.dgjy.net`)写成 JSON;
2. `launch_persistent_context(headless=False)`,`ctx.add_cookies(...)`,`goto` 课程页;
3. 同时挂:
- `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` 落日志。
4. 人工点掉弹层 → 看日志里「点击前后出现了哪个 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 |