不再需要手动抓包、复制临时链接,也不用担心链接中的 timestamp 和 token 几分钟后失效。

主要功能
✅ 内置 Chromium 浏览器,完美支持现代 Web 技术
✅ 自动捕获预览请求中的真实文件流,绕过 token 一次性限制
✅ 弹出原生保存对话框,自由选择保存位置和文件名
✅ 支持 PDF、PPTX、PPT 等常见课件格式
✅ 保留完整的登录状态(Cookie / Session)
✅ 轻量、免费、开源
使用方法
下载地址:https://wwaxe.lanzouu.com/iT2ah3q5t4yh
软件窗口打开后,复制粘贴自己学校的畅课网址地址,登录你的课程账号(学号 / 密码)。
进入课程,找到带有 PDF 或 PPT 附件的页面。
直接点击“预览”或“查看”按钮。
桌面上会立刻弹出一个“保存文件”对话框。
选择保存位置 → 点击“保存” → 下载完成。
注意:点击预览后,软件窗口内不会显示文件内容(因为被我们拦截并转为下载了),这是正常现象。
核心原理:为什么能够绕过限制?
传统方法的痛点
当你点击“预览”时,浏览器向服务器发起一个请求,例如:
text
GET /download/processed/xxx.pdf?timestamp=...&token=...
服务器返回文件内容(状态码 200 或 206),浏览器用内置插件显示预览。
这个请求中的 token 往往是一次性的,或者寿命极短(几分钟甚至几秒)。如果你复制这个 URL 到新标签页打开,服务器会返回 403 Forbidden,因为 token 已被消耗或过期。
Electron 的 will-download 事件
Electron 提供了 session.will-download 事件,它会在渲染进程触发任何下载动作时被调用。
关键点:即使服务器返回 Content-Type: application/pdf(本应预览),Electron 依然会将其视为一个“可下载的任务”,并触发 will-download。
因此,我们可以在这个事件中:
获取原始请求的全部信息(URL、Cookie、Range 头等),这些信息被封装在 item 对象中。
阻止默认的下载行为(event.preventDefault()),避免文件被直接存到默认下载目录。
弹出保存对话框让用户选择路径。
设置保存路径(item.setSavePath())并恢复下载(item.resume())。
由于我们使用的是同一个请求上下文(包括 token、Cookie、Range 等),服务器会认为这是合法用户的正常请求,因此能够完整地返回文件内容。整个过程没有二次请求,完美绕过了 token 一次性限制。
代码核心片段
javascript
mainWindow.webContents.session.on('will-download', (event, item, webContents) => {
const url = item.getURL();
if (url.includes('目标域名') && (url.includes('.pdf') || url.includes('.pptx'))) {
event.preventDefault(); // 阻止默认下载,我们要接管
// 提取文件名
let fileName = path.basename(url).split('?')[0];
if (!path.extname(fileName)) {
fileName += url.includes('.pdf') ? '.pdf' : '.pptx';
}
// 弹出保存对话框
dialog.showSaveDialog(mainWindow, { defaultPath: fileName })
.then(result => {
if (!result.canceled) {
item.setSavePath(result.filePath);
item.resume(); // 恢复下载
} else {
item.cancel();
}
});
}
});
注意事项
仅限个人学习使用:请遵守课程平台的相关规定,不要批量爬取或传播课件。
Token 时效极短时:某些平台的 token 在预览请求发出后立即失效(例如用于防盗链的一次性签名)。本方案仍然有效,因为我们直接复用原始请求,不进行二次请求。
分片请求(Range):PDF 预览常常使用 HTTP Range 分块加载(状态码 206)。will-download 会自动将这些分片合并成完整文件,无需额外处理。
其他文件类型:如需支持 Word、Excel 等,可在判断条件中添加对应的扩展名。
macOS 用户:首次运行时可能需要信任开发者(右键 → 打开)。
结语
这款小工具的核心代码不到 100 行,但它实实在在地解决了很多同学每天都要面对的“能看不能存”的苦恼。如果你也常被课程平台的预览限制困扰,不妨试试它。当然,如果你有一定的开发基础,也可以根据本文的原理,自己动手定制一个专属的下载器。
项目地址:[https://github.com/xqc0930-sudo/changkexiazai](请替换为你的实际仓库地址)
反馈与交流:欢迎在评论区留言,我会定期解答常见问题。