down-paper
v2.5.15
Published
批量下载试卷PDF工具 - 支持东方在线教育平台的试卷批量下载
Maintainers
Readme
📚 批量下载试卷PDF工具
一个用于批量下载东方在线教育平台试卷PDF的Node.js工具,支持命令行和编程接口两种使用方式。
✨ 功能特性
- 🚀 批量下载: 支持批量下载多个试卷PDF文件
- 📝 双版本生成: 自动生成原版和带答案版本
- 🎯 灵活配置: 支持自定义年级、学期、科目等参数
- 🔍 关键词搜索: 支持关键词精确搜索特定试卷
- 💻 多种使用方式: 支持命令行工具和编程接口
- 📊 详细日志: 提供完整的执行日志和统计信息
- 🔧 易于集成: 可作为npm包集成到其他项目中
📦 安装
全局安装(推荐)
# 方法一:跳过Chrome下载(推荐)
PUPPETEER_SKIP_DOWNLOAD=true npm install -g down-paper
# 方法二:使用国内镜像源
npm install -g down-paper --registry https://registry.npmmirror.com
# 方法三:如果遇到网络问题,可以设置环境变量
export PUPPETEER_SKIP_DOWNLOAD=true
npm install -g down-paper⚠️ 安装注意事项
如果安装过程中遇到Chrome下载失败的错误,请使用以下方法:
跳过Chrome下载(推荐):
PUPPETEER_SKIP_DOWNLOAD=true npm install -g down-paper使用国内镜像:
npm install -g down-paper --registry https://registry.npmmirror.com手动设置环境变量:
export PUPPETEER_SKIP_DOWNLOAD=true npm install -g down-paper
注意:如果跳过Chrome下载,请确保系统已安装Google Chrome浏览器。
Windows 用户安装问题解决
如果在 Windows 上遇到 Puppeteer 安装失败的问题:
# 方法1: 跳过 Chromium 下载
set PUPPETEER_SKIP_DOWNLOAD=true
npm install -g down-paper
# 方法2: 使用国内镜像源
npm install -g down-paper --registry=https://registry.npmmirror.com
# 方法3: 在 PowerShell 中
$env:PUPPETEER_SKIP_DOWNLOAD="true"
npm install -g down-paper详细说明请参考 Windows 使用指南。
本地安装
npm install down-paper从源码安装
git clone https://github.com/yourusername/down-paper.git
cd down-paper
npm install
npm link # 链接到全局,支持命令行使用🚀 使用方法
1. 命令行使用
基本用法
# 方式1:使用默认参数(推荐新手使用)
down-paper --cookie "your-cookie-string"
# 方式2:指定部分参数(其他使用默认值)
down-paper -g "0560" -c "your-cookie-string"
# 方式3:指定所有参数
# Linux/macOS:
down-paper -u "nlcp" -g "0560" -q "4" -c "your-cookie-string" --output-dir "./my-papers"
# Windows:
down-paper -u "nlcp" -g "0560" -q "4" -c "your-cookie-string" --output-dir ".\\my-papers"
# 方式4:参数设置为null(不传递值)
down-paper -g -q -u -c "your-cookie-string"
# 方式5:使用关键词搜索特定试卷
down-paper -u "khlx" -g "0557" -q "3" -k "第4讲" -c "your-cookie-string"
# 方式6:使用无头模式(不显示浏览器窗口,适合服务器环境)
down-paper -u "nlcp" -g "0560" -q "4" -c "your-cookie-string" -h
# 方式7:使用完整参数名
down-paper --use-scene "nlcp" --grade "0560" --quarter "4" --cookie "your-cookie-string"完整参数
# Linux/macOS - 指定所有参数和自定义输出目录
down-paper \
--cookie "your-cookie-string" \
--subject-id 1574 \
--grade "0560" \
--quarter 4 \
--use-scene "nlcp" \
--keywords "数学" \
--output-dir "./downloads" \
--headless
# Windows - 指定所有参数和自定义输出目录
down-paper ^
--cookie "your-cookie-string" ^
--subject-id 1574 ^
--grade "0560" ^
--quarter 4 ^
--use-scene "nlcp" ^
--keywords "数学" ^
--output-dir ".\\downloads" ^
--headless参数说明
| 参数 | 简写 | 必需 | 默认值 | 说明 |
|------|------|------|--------|------|
| --cookie | -c | ✅ | - | Cookie字符串 |
| --subject-id | -s | ❌ | 1574 | 科目ID |
| --grade | -g | ❌ | null | 年级代码(不传递时使用默认值,传递但无值时设为null) |
| --quarter | -q | ❌ | null | 学期(不传递时使用默认值,传递但无值时设为null) |
| --use-scene | -u | ❌ | null | 使用场景(不传递时使用默认值,传递但无值时设为null) |
| --keywords | -k | ❌ | - | 关键词搜索(可选) |
| --output-dir | -o | ❌ | ./download | 输出目录 |
| --headless | -h | ❌ | false | 使用无头模式运行浏览器(适合服务器环境) |
| --help | - | ❌ | - | 显示帮助信息 |
| --version | -v | ❌ | - | 显示版本号 |
参数使用方式说明
对于 -g、-q、-u 参数,支持三种使用方式:
不传递参数:使用默认值
down-paper -c "your-cookie" # grade: null, quarter: null, useScene: null (使用默认值)传递参数但没有值:设置为 null
down-paper -g -q -u -c "your-cookie" # grade: null, quarter: null, useScene: null传递参数且有值:使用指定值
down-paper -g "0557" -q "3" -u "khlx" -c "your-cookie" # grade: 0557, quarter: 3, useScene: khlx
年级代码对照表
| 代码 | 年级 | |------|------| | 0555 | S3 | | 0556 | S4 | | 0557 | 一年级 | | 0558 | 二年级 | | 0559 | 三年级 | | 0560 | 四年级 | | 0561 | 五年级 | | 0562 | 六年级 | | 0567 | 不区分 | | 0999 | 小升初 |
使用场景对照表
| 代码 | 场景 | |------|------| | gdk | 功底考 | | jdcp | 阶段测试 | | khlx | 课后测试 | | nlcp | 能力测评 | | syttl | 素养天天练 |
学期对照表
| 代码 | 学期 | |------|------| | 1 | 春季 | | 2 | 暑假 | | 3 | 秋季 | | 4 | 寒假 | | 9 | 不区分 |
学年对照表
| 代码 | 学年 | |------|------| | 929 | 上学期 | | 930 | 下学期 | | 931 | 全学年 |
年份对照表
| 代码 | 年份 | |------|------| | 2023 | 2023年 | | 2024 | 2024年 | | 2025 | 2025年 | | 2026 | 2026年 |
关键词搜索说明
关键词搜索功能可以帮助您精确查找特定的试卷,提高搜索效率:
使用示例:
# 搜索包含"思维"的试卷
down-paper -u "khlx" -g "0557" -q "3" -k "思维" -c "your-cookie"
# 搜索特定讲次(如第4讲)
down-paper -u "khlx" -g "0557" -q "3" -k "第4讲" -c "your-cookie"
# 搜索特定题型
down-paper -u "nlcp" -g "0560" -q "4" -k "应用题" -c "your-cookie"搜索效果对比:
- 不使用关键词:返回所有符合条件的试卷(可能很多)
- 使用关键词:只返回包含关键词的试卷(精确匹配)
无头模式说明
无头模式允许工具在后台运行而不显示浏览器窗口,适合服务器环境和自动化脚本:
使用场景:
- 🖥️ 服务器环境:在Linux服务器上运行,无需图形界面
- 🤖 自动化脚本:集成到CI/CD流程或定时任务中
- 🔇 静默运行:避免浏览器窗口干扰其他工作
参数对比:
| 参数 | 效果 | 使用场景 |
|------|------|----------|
| 无参数(默认) | 🖥️ 显示浏览器窗口 | 调试时查看页面状态 |
| -h 或 --headless | 🚫 不显示浏览器 | 服务器环境,正常使用 |
| --no-headless | 🖥️ 显示浏览器窗口 | 显式指定显示浏览器 |
使用示例:
# 默认行为:显示浏览器窗口(有头模式)
down-paper -u "khlx" -g "0557" -q "3" -k "第4讲" -c "your-cookie"
# 无头模式:不显示浏览器窗口
down-paper -u "khlx" -g "0557" -q "3" -k "第4讲" -c "your-cookie" -h
# 或者使用完整参数名
down-paper -u "khlx" -g "0557" -q "3" -k "第4讲" -c "your-cookie" --headless
# 显式指定显示浏览器
down-paper -u "khlx" -g "0557" -q "3" -k "第4讲" -c "your-cookie" --no-headless使用类型对照表
| 代码 | 类型 | |------|------| | 1 | 线上 | | 2 | 线下 |
2. 编程接口使用
基本用法
const downPaper = require('down-paper');
async function downloadPapers() {
try {
const result = await downPaper.generateBatchPDFs({
cookie: 'your-cookie-string',
queryParams: {
subjectId: 1574,
grade: '0560',
quarter: 4,
useScene: 'nlcp',
keywords: '数学' // 可选:关键词搜索
},
outputDir: './downloads', // 指定输出目录,避免文件冲突
headless: true // 使用无头模式,不显示浏览器窗口
});
console.log('下载完成:', result);
} catch (error) {
console.error('下载失败:', error.message);
}
}
downloadPapers();API 参考
generateBatchPDFs(options)
批量生成PDF文件的主要方法。
参数:
options.cookie(string, 必需): Cookie字符串options.queryParams(object): 查询参数subjectId(number): 科目ID,默认 1574useScene(string): 使用场景,默认 'khlx'grade(string): 年级,默认 '0557'quarter(number): 学期,默认 3keywords(string): 关键词搜索,可选
options.outputDir(string): 输出目录,默认 './download'options.headless(boolean): 是否使用无头模式,默认 false
返回值:
{
total: 10, // 总任务数
success: 8, // 成功任务数
failed: 2, // 失败任务数
duration: 120000, // 总耗时(毫秒)
failedLinks: [ // 失败的链接详情
{
index: 1,
url: 'https://example.com/paper1',
error: 'Error message'
}
]
}getPapers(params, cookies)
获取试卷列表。
const papers = await downPaper.getPapers({
subjectId: 1574,
grade: '0557',
keywords: '第4讲' // 可选:关键词搜索
}, 'your-cookie-string');createLinks(papersData)
从试卷数据生成链接数组。
const links = downPaper.createLinks(papersData);processSinglePDF(options)
处理单个iframe并生成PDF。
const result = await downPaper.processSinglePDF({
url: 'https://example.com/paper',
cookies: 'your-cookie-string',
outputDir: './downloads'
});generateSinglePDF(options)
生成单个PDF文件。
const result = await downPaper.generateSinglePDF({
url: 'https://example.com/paper',
cookies: cookieArray,
outputDir: './downloads'
});getLogger()
获取日志记录器实例。
const logger = downPaper.getLogger();
logger.info('开始处理');🔧 配置说明
Cookie 获取方法
- 登录东方在线教育平台
- 打开浏览器开发者工具 (F12)
- 切换到 Network 标签页
- 刷新页面或进行任何操作
- 在请求头中找到
Cookie字段 - 复制完整的 Cookie 字符串
输出文件结构
downloads/
├── 1年级/
│ ├── 思维B-1年级-第1讲.pdf
│ ├── 思维B-1年级-第1讲-答案.pdf
│ ├── 思维B-1年级-第2讲.pdf
│ └── 思维B-1年级-第2讲-答案.pdf
├── 2年级/
│ ├── 人教版-2年级-第4讲.pdf
│ └── 人教版-2年级-第4讲-答案.pdf
└── ...📝 日志系统
工具提供完整的日志记录功能:
- 控制台输出: 实时显示执行进度和结果
- 文件日志: 自动保存到
logs/目录 - 日志级别: INFO, WARN, ERROR, SUCCESS
- 详细统计: 包含成功率、耗时等统计信息
🛠️ 开发
项目结构
down-paper/
├── bin/ # CLI 入口文件
│ └── down-paper.js
├── lib/ # 发布后的代码
│ ├── index.js # API 入口
│ ├── batchProcessor.js # 批量处理逻辑
│ ├── iframeProcessor.js # iframe 处理
│ ├── pdfGenerator.js # PDF 生成
│ ├── request.js # HTTP 请求
│ └── logger.js # 日志系统
├── src/ # 源代码
├── logs/ # 日志文件
├── download/ # 默认下载目录
├── package.json
└── README.md构建
npm run build测试
# 测试 CLI 工具
down-paper --help
# 测试 API
node -e "console.log(require('./lib/index.js').version)"📄 许可证
MIT License
🤝 贡献
欢迎提交 Issue 和 Pull Request!
📞 支持
如果您在使用过程中遇到问题,请:
- 查看 Issues
- 提交新的 Issue
- 联系维护者
🔄 更新日志
v2.3.3
- 🖥️ 跨平台浏览器: 修复了 Windows 下 Chrome 浏览器启动失败的问题
- 🔧 优化: 创建了统一的跨平台浏览器配置工具
browserConfig.js - 📦 完善: 支持 Windows、macOS、Linux 的 Chrome 自动检测
- 🎯 改进: 优化了浏览器启动参数和错误处理
v2.3.2
- 🖥️ 跨平台浏览器: 修复了 Windows 下浏览器启动失败的问题
- 🔧 智能路径检测: 自动检测 Windows、macOS、Linux 的 Chrome 安装路径
- 🎯 无头模式: 新增
--headless参数,适合服务器环境运行 - 📝 错误处理: 改进了浏览器启动失败时的错误提示和解决方案
- 🚀 性能优化: 添加了更多浏览器启动参数,提高稳定性
v2.3.1
- 🔧 修复: 修复了 Windows 下 "cannot find module ../src/batchProcessor" 错误
- 📦 构建: 优化了构建脚本,确保发布包中的模块路径正确
- 🎯 完善: 修复了 CLI 工具和 API 入口的模块引用问题
v2.3.0
- 🖥️ 跨平台: 添加了 Windows 路径兼容性支持
- 🔧 修复: 使用
path.join()和path.sep确保跨平台路径处理 - 📝 完善: 更新了 Windows 和 Linux/macOS 的使用示例
- 🎯 优化: 改进了路径标准化逻辑,避免双分隔符问题
v2.2.0
- 🎯 优化: 更新了使用建议,推荐使用
--output-dir参数 - 📝 改进: 不再强制要求在空文件夹下运行
- 💡 完善: 更新了所有示例和帮助信息
- 🚀 提升: 更灵活的使用方式,用户可以在任何目录下运行
v2.1.0
- 🔧 修复: 修复了
--output-dir参数不生效的问题 - 📁 新增: 自动创建输出目录功能
- 🔧 改进: 优化了运行环境配置
- 📚 完善: 更新了完整的字段字典和对照表
- 🎯 优化: 改进了路径处理和目录创建逻辑
v2.0.0
- 📚 新增: 完整的字段字典和对照表
- 🔧 改进: 优化了运行环境配置
- 📖 完善: 更新了帮助信息和示例
v1.0.0
- ✨ 初始版本发布
- 🚀 支持批量下载试卷PDF
- 💻 提供命令行和编程接口
- 📊 完整的日志系统
- 🎯 灵活的配置选项
注意: 请确保您有权限访问相关教育资源,并遵守相关使用条款。
