学科网组卷网自动组卷技能
一、适用场景
- 按人教版(或其他版本)教材章节/知识点,从组卷网选题组卷并下载 docx。
- 标准规格(用户默认口径):难度适中 12 道 + 困难 4 道 = 16 道选择题 + 1 道综合题,须有图形、答案、解析。
- 一次做多套同主题试卷时,可跨套避重(记录已用题组,后续套卷跳过)。
二、输入与输出
输入:
1. 教材版本 + 册次 + 章节/知识点名(或直接给章节码,见第七节速查表)。
2. 可选:题量构成、难度配比、试卷标题(默认 <知识点>专题训练)。
3. 可选:避免重复的历史选题记录(上几套用了哪些题组)。
输出:
1. <试卷标题>.docx(约 1.5–7MB,含 7–11 张图)保存到指定目录(默认当前工作目录)。
2. 试卷同时存入用户组卷中心账号(当前:王荣连),便于日后复用。
3. 验收清单报告:选择题编号、答案、【详解】、图片数量。
三、前置条件
- 本机已装 ego lite 浏览器,且组卷网已登录(登录走
sso.zxxk.com扫码;正确域名是 zujuan.xkw.com,zujuan.zxxk.com 会 403)。 - ego-browser 可执行文件定位:
ls -t "/c/Program Files/Citro Labs/ego lite/Application"/*/ego-browser.exe | head -1 - 脚本执行方式:
"$EXE" nodejs < 脚本.mjs(stdin 传入 ESM 脚本)。
四、执行步骤(每步输入/输出/操作)
Step 1 定位章节,取得章节码
- 操作:打开
https://zujuan.xkw.com,按 教材版本→学科→册次 逐级进入,点击章节树目标节点(章节树是点击式节点,不是链接,用 page.click 点节点文本)。点击后 URL 中出现zj<数字>码。 - 输出:章节码,如 河流地貌的发育=
zj167136。 - 提示:知识点跨级筛选时用
ctk码(见第七节)。
Step 2 组合筛选 URL
- 操作:在已打开的章节筛选页地址栏把路径段改为筛选码组合后
goto: - 单章节:
zj<码>qt<题型码>d<难度码>o2 - 知识点(ctk 在 zj 之后,ctk 在前):
zj<码>/ctk<码>qt3401d2o2 - 码表:qt3401=单选、qt3404=综合题、qt3405=多选(勿用);d2=适中、d3=困难。
- 输出:筛选后的题目列表页(题组列表,每页约 10 组)。
- 注意:
page.goto换筛选条件比点页面上筛选控件可靠;翻页用页码链接或 goto.../o2p<页码>式 URL(以页面实际为准)。
Step 3 按序号把题组加入试题篮(模板脚本 scripts/add_to_basket.mjs)
- 输入:空间 ID、含
zj码的页面 URL 片段、要加的题组序号列表(0 起,按「适中→困难→综合」顺序记录)。 - 操作:定位列表页 tab → 对每个序号执行:滚动到该组
a.add-exam-btn→click()(单次点击即可,勿加 dispatchEvent,避免双重入篮)→ 等 2.5s → 读.quest-basket-nav篮数核对。已加过的按钮类名变为delques,可用来判断。 - 输出:逐步打印
ADD[i] basket=N,最终核对篮数 = 应加小题总数(12+4 或 +综合)。 - 选题规则:先看每组小题数(标题旁有),凑齐适中 12(如 3+3+2+2+2)、困难 4(2+2)、综合 1;逐题浏览题干避免选重复情境;多套卷时记录已用组,后续套卷浏览时跳过相同题组。
Step 4 试题篮 → 去组卷
- 操作(须在同一脚本内连续执行,中间不能断):
1. 单击.quest-basket-nav内面板块打开试题篮面板(单点击即可);
2. 点面板底部「去组卷」;
3. 若弹出"确认清空草稿"对话框,点a.confirm-btn.mid-button。 - 输出:新 tab 打开组卷中心(试卷编辑页)。
Step 5 改名 + 保存 + 下载(模板脚本 scripts/rename_and_download.mjs)
- 输入:组卷中心页(新 tab,如
p7)、试卷标题、保存目录。 - 操作:
1. 改名:#pui_maintitle是 contenteditable,直接textContent = 标题并触发input+blur事件(点外层 div 无效)。
2. 保存:点「保存试卷」按钮(文本匹配、取可见元素的最后一个)。
3. 下载:先document.querySelectorAll('iframe.iframe-el').forEach(f=>f.remove())移除广告覆盖层(否则a.download-btn点击报 "none can receive")→ 点a.download-btn→ 轮询等弹窗 iframe(.tk-dialog iframe-parent iframe,src=/dialog/downloadword)出现且其 contentDocument 中有a.confirm-btn.pay-prompt→page.waitForEvent('download',{timeout:60000})先挂好 → 用contentDocument点「免费下载」→dlObj.suggestedFilename()取名 →saveAs(目录+文件名)。 - 输出:docx 文件落盘 + 打印
FILE:/SAVED。
Step 6 验收(用 scripts/verify_docx.py,见下节)
每套卷必须验证 PASS 后再交付;不达标回到 Step 3 补选。
五、验收标准(用 scripts/verify_docx.py,已按组卷网真实 docx 结构校准)
实测组卷网 docx 结构:正文行首题号 1–17;卷尾「参考答案」区按题组给【详解】(每个选择题组 1 块 + 综合 1 块);选择题答案在卷尾答题卡表格(题号/答案两行)中。
1. 正文题号:行首 数字. 覆盖 1–17(16 选择 + 1 综合第 17 题),缺号即 FAIL。
2. 【详解】块 ≥8:按题组计(5–6 个适中组 + 2 困难组 + 1 综合);组内逐小题解析紧跟其后,不带重复标记。
3. 选择题答案 16/16:卷尾答题卡表格(或答案行 数字.字母)覆盖全部 16 题。
4. 图片 ≥7 张:doc.inline_shapes(典型 7–11);无图说明选题偏文字题,需回 Step 3 重选。
5. 多套避重:人工/记录核对跨套无相同题组。
6. 文件大小 >1MB(有图即有体量);试卷标题与文件名一致。
运行:python ~/.workbuddy/skills/zujuan-exam-composer/scripts/verify_docx.py <试卷.docx>,输出 PASS/FAIL 并以退出码区分。
六、注意事项与已知坑(务必遵守)
- ego 控制权翻转:长脚本约 40s 被硬停 → 小步脚本 + bash 外层循环重跑;EPERM 瞬时锁重试
takeOverTaskSpace即可。 - Download 对象没有
cancel(),也不支持page.on('download');只能waitForEvent+saveAs。未消费的下载会让页面毒化("already has an active download wait"),所以入篮绝不能点出下载,下载一旦触发必须 saveAs 收尾。 - 广告 iframe 覆盖:点下载按钮前必须移除
iframe.iframe-el。 - 下载弹窗在 iframe 里:外层 dialog 点不到内容,须
iframe.contentDocument操作。 - qt3405 是多选题,不是综合题;综合题用 qt3404。
- 标题改名只认
#pui_maintitle(contenteditable)。 - 窗口最小化不影响 DOM 操作,但
page.screenshot会失败,调试少用截图。 - 未托管的 tab 需要
task.adopt();已结束空间用claimTaskSpace(id)恢复。 - 登录态失效时会出现跳登录页/空列表——请用户扫码,勿硬试。
- 换筛选条件优先改 URL goto,不要依赖页面控件点击。
七、章节码速查(人教版选择性必修1,累积维护)
| 章节/知识点 | 码 |
|---|---|
| 塑造地表形态的力量(二上第一节) | zj167134 |
| 构造地貌的形成(二上第二节) | zj167135 |
| 河流地貌的发育(二上第三节) | zj167136 |
| 第一章 地球的运动(选必1) | zj167130 |
| └ 正午太阳高度 | ctk47226 |
| └ 昼夜长短 | ctk47225 |
| └ 时差 | ctk47223 |
| └ 昼夜更替(昼夜交替) | ctk47222 |
新章节组卷后把新码追加进本表。
八、已验证的组卷构成示例
- 板块构造:适中 5 组(2+2+3+3+2)=12 + 困难 2 组(2+2)=4 + 综合(新西兰南阿尔卑斯·板块边界)。
- 时差:适中 6 组各 2 题 + 困难 2 组(2+2) + 综合(神舟二十三 4 问)。
- 昼夜长短:适中(2+3+3+2+2)=12 + 困难(2+2) + 综合(南开光照图)。
九、保存与调用方式
- 保存位置(用户级,跨项目可用):
~/.workbuddy/skills/zujuan-exam-composer/(含本 SKILL.md 与 scripts/ 模板)。 - 调用方式:
1. 对话中直接说:「用组卷网组一套 XX 专题训练」/「@skill:zujuan-exam-composer 组卷:昼夜长短」——助手读取本 SKILL.md 按步骤执行。
2. 模板脚本按需复制到工作目录改参数后运行:
bash EXE=$(ls -t "/c/Program Files/Citro Labs/ego lite/Application"/*/ego-browser.exe | head -1) "$EXE" nodejs < add_to_basket.mjs "$EXE" nodejs < rename_and_download.mjs
3. 参数通过脚本头部常量修改:SPACE_ID(ego 空间 ID)、URL_FLAG(页面 URL 片段)、INDICES(题组序号数组)、TITLE(试卷名)、SAVE_DIR(保存目录)。
十、模板脚本清单
| 脚本 | 作用 | 对应步骤 |
|---|---|---|
scripts/add_to_basket.mjs |
定位筛选页 tab,按序号加题组入篮并核对篮数 | Step 3 |
scripts/basket_to_paper.mjs |
打开试题篮面板→去组卷→确认清空草稿 | Step 4 |
scripts/rename_and_download.mjs |
改名→保存→移广告层→下载弹窗 iframe→saveAs | Step 5 |
scripts/verify_docx.py |
python-docx 验收(题号/详解/答案覆盖/图数),PASS/FAIL | Step 6 |
注:模板脚本运行前需改脚本头部 CONFIG(SPACE_ID / URL_FLAG / INDICES / PAGE_TAB / TITLE / SAVE_DIR)。