name: smartedu-downloader description: 从国家中小学智慧教育平台 (basic.smartedu.cn) 下载教材资源——包括英语等学科的听力音频 (MP3) 和教材电子版 (PDF)。当用户提供 smartedu.cn 教材链接 (tchMaterial/detail?...contentId=...) 并希望下载听力、课件、电子课本、教材PDF时触发。用户只需提供登录账号密码和教材链接即可。触发词:智慧教育、smartedu、国家中小学、下载教材、下载听力、电子课本、教材PDF、课件下载。 agent_created: true
从 国家中小学智慧教育平台(basic.smartedu.cn)下载教材资源:
- 听力音频(MP3,如英语教材的 Listening)
- 教材电子版(PDF 本体)
r*-ndr-private.ykt.cbern.com.cn)需要 X-Nd-Auth 鉴权头才能下载。access_token + mac_key 通过 HMAC-SHA256 生成。必需:
- 登录手机号(账号)
- 登录密码
- 一个或多个教材链接(https://basic.smartedu.cn/tchMaterial/detail?...contentId=<CID>...)
从每个链接的 URL 中提取 contentId 参数值作为 cid。
在真正下载前,先用文件服务器镜像确认每个教材是「听力音频」还是「纯PDF」,以及标题,便于给用户预告:
node -e '
const CID="<contentId>";
(async()=>{
for (const s of ["s-file-1","s-file-2","s-file-3"]) {
try {
const r = await fetch(`https://${s}.ykt.cbern.com.cn/zxx/ndrv2/resources/tch_material/details/${CID}.json`);
if(!r.ok) continue;
const d = await r.json();
const hasPdf=(d.ti_items||[]).some(it=>it.ti_format==="pdf"||it.lc_ti_format==="pdf");
console.log("标题:", (d.global_title&&d.global_title["zh-CN"]), "| PDF:", hasPdf);
break;
} catch(e){}
}
const a = await (async()=>{for(const s of ["s-file-1","s-file-2","s-file-3"]){try{const r=await fetch(`https://${s}.ykt.cbern.com.cn/zxx/ndrs/resources/${CID}/relation_audios.json`);if(r.ok)return await r.json();}catch(e){}}return[];})();
console.log("听力数量:", Array.isArray(a)?a.length:0);
})();
'
脚本依赖 playwright(需已安装 chromium 浏览器)。检查:
node -e "require('playwright'); console.log('playwright OK')"
若缺失,需在隔离的 node workspace 安装:npm i playwright && npx playwright install chromium(按运行环境的隔离规则调整路径与 NODE_PATH)。
所有参数通过环境变量传入 scripts/smartedu_downloader.js:
| 变量 | 说明 |
|---|---|
SMARTEDU_PHONE |
登录手机号(必需) |
SMARTEDU_PASS |
登录密码(必需) |
SMARTEDU_JOBS |
JSON 数组 [{"cid":"<contentId>","name":"<可选人类可读名>"}](必需) |
SMARTEDU_OUTPUT_DIR |
输出根目录(默认 ./smartedu_downloads) |
SMARTEDU_MODE |
audio|pdf|auto(默认 auto:有听力则下听力,否则下PDF) |
name 省略时脚本会自动用教材官方标题命名。
示例(一次登录批量下载多个教材):
SMARTEDU_PHONE="手机号" SMARTEDU_PASS="密码" \
SMARTEDU_MODE="auto" \
SMARTEDU_OUTPUT_DIR="/输出/目录" \
SMARTEDU_JOBS='[
{"cid":"b7ca9536-ccd7-a4db-56b3-971645c54515"},
{"cid":"540ac93d-67fc-4353-9e49-1ef20d02b5a4"}
]' \
NODE_PATH="<node_modules 路径>" node scripts/smartedu_downloader.js
重要:脚本以前台方式运行(headless:false),会弹出真实浏览器窗口。运行后要提示用户:
浏览器已打开,账号密码已自动填好。请你:1. 点击蓝色「登录」按钮 → 2. 拖动滑块完成验证码 → 3. 等待自动跳转。之后脚本会自动取 token 并下载全部教材。
脚本最多等待 6 分钟让用户完成登录+验证码。不要用后台方式运行,否则无法观察进度、任务易丢失。
下载后校验文件完整性:
- MP3:文件头为 ID3(494433) 或帧头 fffb/fff3,大小 > 1KB
- PDF:文件头 %PDF-,末尾 %%EOF
然后用 present_files 把输出目录展示给用户。
ND_UC_AUTH-e5649925-441d-4a53-b525-51a2f1c4e0a8&ncet-xedu&token{value:"<json字符串>", expire:...},真正的 access_token/mac_key 在 value 里,需先 JSON.parse 外层再解包 .value(脚本已处理)。MAC id="{access_token}",nonce="{ts}:{rand}",mac="{HMAC_SHA256(mac_key, "{nonce}\n{GET}\n{host}\n{path}\n")}"(mac 为 hex)#username,密码 #tmpPassword,协议勾选 #agreementCheckboxpage.goto 跳转,否则验证码界面被冲掉,用户无法操作。脚本仅在离开 auth 域名后才检查/跳转。relation_audios 为 0),此时应下 PDF 本体。auto 模式会自动处理。https://s-file-{1,2,3}.ykt.cbern.com.cn/zxx/ndrv2/resources/tch_material/details/{CID}.json更多技能请访问小葱技能站7w4.net。
https://s-file-{1,2,3}.ykt.cbern.com.cn/zxx/ndrs/resources/{CID}/relation_audios.jsonr{1,2,3}-ndr-private.ykt.cbern.com.cn(需鉴权)这个Skill质量中等偏上,胜在文档非常详细、步骤清晰,但部署和运行略显麻烦。优点是功能实用、能智能切换下载模式、账号安全处理得当;缺点是安装playwright浏览器比较费劲,只能前台运行不够方便,依赖外部平台API也可能影响长期使用。普通用户需要一定技术基础才能顺利运行。