nature-downloader
nature-downloader 是一个合法机构权限下的学术全文/PDF 下载 skill。它把两部分能力合在一起:
- 首次资源入口配置:先记录用户实际使用的图书馆电子资源链接,再识别学校、SSO/CARSI/EZproxy/WebVPN/资源聚合平台信息,配置保存到
~/.config/lit-dl/school.json。 - 真实全文落地:通过用户已经登录的 Chrome 会话和 web-access CDP proxy,复用本人的图书馆/CARSI/出版社访问权限,把能合法访问的 PDF 保存到项目文件夹;如果馆藏只提供 HTML 全文,则保存 HTML/文本并明确说明没有 PDF。
- 中文文献默认知网:按中文题名下载时,默认优先走用户已登录/已授权的 CNKI/知网页面;可通过学校配置或
--cnki-url指定图书馆提供的知网入口。 - 开放获取优先:若文献本身是开放获取或开源期刊文章,直接走合法开放 PDF;若图书馆资源明确无权限,直接告诉用户。
它不绕过付费墙,不使用镜像站,不破解验证码,不读取或导出 cookies、密码、localStorage、session 文件。遇到 jAccount/CARSI、验证码、Cloudflare、短信/OTP、人机验证时,会停下让用户本人在 Chrome 里完成。
快速使用
把下面这句话复制给 agent,即可让它自动完成首次配置引导:
请使用 nature-downloader 帮我完成首次图书馆资源配置:先向我索要图书馆电子资源/数据库入口链接,识别授权路径并保存配置;如果需要登录,请引导我在 Chrome 中完成统一身份认证/CARSI 登录;最后运行配置展示和连通性自检,确认后续可复用该图书馆资源下载文献。
1. 配置资源入口
全新用户优先提供图书馆电子资源/数据库入口链接,而不是先填学校名:
python3 scripts/configure_school.py infer "https://whu.metaersp.cn/personalIndex"
python3 scripts/configure_school.py url "https://whu.metaersp.cn/personalIndex"
python3 scripts/configure_school.py show
infer 只判断授权路径不保存,url 会写入配置。比如武汉大学 whu.metaersp.cn 会被识别为资源聚合门户,后续需要登录时再跳转到 cas.whu.edu.cn。
如果没有资源入口链接,再用预设学校兜底:
python3 scripts/configure_school.py preset 上海交通大学
python3 scripts/configure_school.py show
查看可用预设:
python3 scripts/configure_school.py list
运行连通性自检:
python3 scripts/configure_school.py health --force
配置路径默认是 ~/.config/lit-dl/school.json。测试或多 profile 场景可以用 LIT_DL_CONFIG_DIR=/path/to/configdir 覆盖。
2. 准备浏览器登录态
- 在 Chrome 里打开本校图书馆或学术资源聚合入口。
- 用本人账号完成统一身份认证/CARSI 登录。
- 确认 Web of Science 或目标出版商页面能在 Chrome 中正常看到全文入口。
- 打开
chrome://inspect/#remote-debugging,允许当前浏览器实例远程调试。 - 启动 web-access CDP proxy。
3. 下载文献
按 DOI 下载:
node scripts/batch_download.mjs \
--dois "10.1007/s00122-021-03957-1,10.1111/pbi.14066" \
--out "./文献自动下载"
按中文题名下载,默认走知网:
node scripts/batch_download.mjs \
--title "乡村振兴背景下数字治理研究" \
--out "./文献自动下载"
如果只要 PDF、不要 CAJ,加 --cnki-format pdf。这样在知网没有明确 PDF 下载入口时,脚本会报出未找到可授权 PDF,而不会保存 .caj:
node scripts/batch_download.mjs \
--title "乡村振兴背景下数字治理研究" \
--cnki-format pdf \
--out "./文献自动下载"
如果学校图书馆提供了专用知网入口,可显式指定:
node scripts/batch_download.mjs \
--title "乡村振兴背景下数字治理研究" \
--cnki-url "https://kns.cnki.net/kns8s/defaultresult/index" \
--out "./文献自动下载"
按主题从 Web of Science 检索并下载前 N 篇:
node scripts/batch_download.mjs \
--topic "rice blast resistance gene" \
--count 10 \
--out "./文献自动下载"
按精确题名下载开放获取论文(适合 arXiv 论文、无 DOI 论文):
node scripts/batch_download.mjs \
--title "Attention Is All You Need" \
--open-access \
--out "./文献自动下载"
已知 PDF 地址时直接下载并验证:
node scripts/batch_download.mjs \
--pdf-url "https://arxiv.org/pdf/1706.03762" \
--title "Attention Is All You Need" \
--out "./文献自动下载"
默认只下载主 PDF。只有明确需要补充材料时才加:
node scripts/batch_download.mjs --dois "10.xxxx/example" --out "./文献自动下载" --si
输出目录:
文献自动下载/
PDFs/
SupportingInformation/
脚本会输出 JSON 状态,常见状态包括 downloaded、open_access_downloaded、full_text_html_available、library_no_permission、carsi_waiting_user、publisher_verification_waiting_user、sciencedirect_robot_check、no_authorized_pdf_found、failed_after_retry。当状态是 full_text_html_available 时,表示已拿到可读 HTML 全文,但当前授权路径没有有效 PDF,回复用户时必须说清楚;当状态是 library_no_permission 时,表示当前图书馆资源没有该文献全文权限,也必须直接说明。
当前实现边界
- 已实现:学校配置、配置文件读写、预设库、连通性自检、Web of Science 入口配置读取、Chrome 登录态下 PDF 下载、PDF 文件头验证、状态码体系。
- 已实现:中文题名默认 CNKI/知网路由,复用 Chrome 中已有的图书馆/知网登录态下载可授权访问的 PDF/CAJ;可用
--cnki-format pdf限制为只下载 PDF。 - 已验证路径:以上海交通大学/SJTU + Web of Science + CARSI/Chrome 会话为主要真实下载路径。
- 新用户首配策略:优先从图书馆资源入口链接识别授权链路;学校预设只作为兜底。
- 已验证开放获取路径:
--title "Attention Is All You Need" --open-access会精确匹配 arXiv 标题并下载 PDF。 - 工作流策略:开放获取文章直接下载;非开放获取文章走已配置图书馆资源;馆藏无权限时明确告知用户。
- 可扩展路径:其他学校可通过
data/schools.yaml配置 SSO/CARSI 和discovery.web_of_science_url。 - 不承诺:无登录态下载、绕过出版社限制、自动处理验证码/OTP/Cloudflare、无限批量下载。
- 注意:
--topic是 Web of Science 主题检索,不保证精确题名命中;精确题名优先使用--title。
依赖
pip install -r requirements.txt
node --version # 推荐 Node.js 22+
验证
python3 -m unittest discover -s tests/python
node --test tests/unit/*.test.mjs
node --check scripts/batch_download.mjs
node --check scripts/browser_pdf_downloader.mjs
详见 SKILL.md 了解完整工作流、安全边界、状态码体系和失败处理。