Communitygithub.com

Nature Literature Downloader(自然文献下载器)

合法的学术全文、CNKI 机构访问、英文 OA 检索、出版商 API 访问、机构浏览器回退及补充材料下载。

Nature Literature Downloader(自然文献下载器) とは?

Nature Literature Downloader 是一款专为学术研究者设计的 AI 代理技能,用于通过合法途径获取学术文献全文。它支持中文文献(通过 CNKI 机构访问)和英文文献(通过出版商 API、开放获取(OA)检索和机构浏览器回退)。主要功能包括: - **多路由下载**:根据文献语言和出版商智能路由至 CNKI、Elsevier/Springer Nature/IEEE 的 API、OA 源或机构 Web Access。 - **配置管理**:使用 `scripts/configure_school.py` 和 `scripts/configure_credentials.py` 配置图书馆资源 URL 和出版商 API 密钥,并支持健康检查。 - **补充材料确认**:在下载前询问用户是否同时下载补充材料(SI),避免不必要下载。 - **浏览器状态复用**:利用用户已认证的浏览器会话,避免导出 cookie 或密码。 该技能适用于 Claude Code、Cursor、Codex 等 AI Agent 平台,通过 Python 和 Node.js 脚本协作实现。

対応✓Claude Code✓Codex CLI~Cursor
npx skills add Flyme886/nature-downloader

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Nature Literature Downloader(自然文献下载器) は何をしますか?

此技能将文献路由到合法的开放获取、出版商 API、CNKI 机构和基于浏览器的机构提供商。scripts/batch_download.mjs 是编排入口点;学校配置、出版商凭据、元数据/OA 解析、提供商下载、内容验证和清单是独立的模块。

已验证的路由是示例,而非默认值。每个机构应使用用户实际的图书馆资源 URL 开始,因为资源门户、CAS 回调、EZproxy、WebVPN、IP 认证的数据库页面和数据库详细信息页面比学校名称更能可靠地揭示实时授权路径。

SI 确认关卡——首先执行此操作。 在下载任何 PDF、CAJ、HTML、XML、存档或附件之前,询问用户是否想要补充材料(Supporting Information)。明确要求 SI 算作“是”;明确只要求正文算作“否”。否则,对整个批次询问一次。使用 --si 或 --no-si 之一运行下载器。如果未提供任一标志,脚本将返回 si_confirmation_required 且不会创建输出目录。

主工作流。 在路由之前规范化 DOI/标题,并识别语言和出版商。中文文献始终使用 CNKI。对于英文文献的 Elsevier、Springer Nature 和 IEEE 文章,若有可用的提供商凭据,首先尝试出版商 API,并且成功的 API 下载后不需要 OA 确定。如果该 API 尝试失败,自动检查合法的 OA 来源。其他英文出版商首先检查 OA,然后当 OA 不可用时使用机构 Web Access 路由。

规范化 DOI/题名并识别语言、出版商
├─ 中文文献:直接走 CNKI
└─ 英文文献
   ├─ Elsevier / Springer Nature / IEEE,且已配置有效 Key
   │  ├─ 优先通过出版商 API 下载
   │  ├─ API 下载成功:结束,不强制判断 OA
   │  └─ API 下载失败:检查文章级 OA,再走 PMC / Unpaywall / 合法仓储
   └─ 其他出版商
      ├─ 检查文章级 OA
      └─ OA 不可用:走 Web Access 机构授权

中文文献仅限 CNKI。 中文标题、zh 元数据语言、显式 CNKI 来源 URL 或 --route cnki 必须使用 CNKI,即使存在其他 OA 副本。重用用户当前的 Chrome 图书馆/CNKI 登录状态,并优先使用配置的 discovery.cnki_url。切勿导出 cookie 或收集机构的密码。

出版商 API 回退。 有效的 API 密钥不保证全文权限。当 Elsevier、Springer Nature 或 IEEE 的 API 尝试返回无权限或不可用的全文时,首先自动尝试合法的 OA 来源。只有当出版商 API 和 OA 路由都失败后,返回 api_fallback_confirmation_required 并询问一次是否使用 Web Access。不要自动切换到机构 Web Access。

浏览器状态原则。 授权下载依赖于用户登录的具体浏览器配置文件。如果代理、CDP 会话或浏览器自动化工具打开一个没有登录状态的新配置文件或不同浏览器,不要将失败视为缺少图书馆权限。切换到重用用户活动浏览器会话的控制路径,或要求用户在受控浏览器实例中认证。

格式原则。 PDF、HTML 全文和数据库原生格式(如 CAJ)是不同的交付物。如果用户仅要求 PDF,需要真正的 PDF 链接或 %PDF 响应,当不存在时报告 no_authorized_pdf_found / pdf_fetch_failed。不要将 CAJ、HTML 或登录页面保存为 PDF。

下载接收和首次运行配置

对于每个下载请求,首先建立文章列表并询问:

是否同时下载这些文献的 Supporting Information(SI,补充材料)?

仅当需要识别请求的文章时,才能在此问题之前进行元数据查找。在知道答案之前不要下载文件。仅当所选路由为 CNKI 或 Web Access 时配置图书馆。仅当所选英文文章属于 Elsevier、Springer Nature 或 IEEE 时配置出版商 API;在尝试配置的提供商 API 之前不需要 OA 确定。

付费图书馆资源配置

询问用户实际使用的图书馆资源 URL:

请发你平时进入图书馆电子资源/数据库的平台链接。
可以是资源门户、数据库列表、Web of Science 入口、某个数据库详情页,
或跳转到统一身份认证的登录链接。

然后在保存配置之前从 URL 推断授权路由:

python3 scripts/configure_school.py infer "https://example.edu/library/resources"
python3 scripts/configure_school.py url "https://example.edu/library/resources"
python3 scripts/configure_school.py show
python3 scripts/configure_school.py health --force

此技能不包含任何学校预设。如果用户无法提供资源 URL,要求他们找到其机构的图书馆/数据库入口,而不是猜测特定学校的域名。

默认配置路径为:

~/.config/lit-dl/school.json

对于测试或隔离配置文件,设置:

LIT_DL_CONFIG_DIR=/path/to/configdir

下载器自动读取此配置。如果存在 discovery.web_of_science_url,scripts/batch_download.mjs 将其用作 Web of Science 入口;否则回退到 https://www.webofscience.com/wos/woscc/basic-search。

对于中文文献,下载器还会读取存在的 discovery.cnki_url。如果不存在,scripts/batch_download.mjs --title "<中文题名>" 回退到 https://kns.cnki.net/kns8s/defaultresult/index。

固定出版商 API 启动输出

在图书馆资源 URL 已保存、显示并通过健康检查后,立即输出以下 Markdown 块。不要将 URL 替换为搜索结果,不要缩短 IEEE 警告,并且不要要求用户将 API 密钥粘贴到聊天中。

请按需配置以下出版商,即可实现长期稳定下载
Elsevier API Key(必配置)
[https://dev.elsevier.com/apikey/manage](https://dev.elsevier.com/apikey/manage)
Website URL可以填写:[Yuan1z0825/nature-skills](https://github.com/Yuan1z0825/nature-skills)

Springer Nature Developer Portal(建议配置)
https://dev.springernature.com/#api
下滑依次点击**Subscribe now“-“free”**

IEEE Developer Registration(按需)
[https://developer.ieee.org/member/register](https://developer.ieee.org/member/register)

完成登录/注册及“学校邮箱”验证后,进入 API Management 页面复制 API Key。IEEE 普通 Key 仅用于 Metadata API,全文访问需要单独申请 Full-Text Access。

显示此块后停止,并等待用户完成注册、学校邮箱验证和复制相关 API 密钥。用户执行所有密码、验证码、OTP、电子邮件确认、同意和 API 密钥复制步骤。切勿从浏览器页面读取 API 密钥或要求用户通过聊天发送它们。

API 优先和开放获取回退

对于英文文章,在决定何时解析文章级 OA 之前识别其出版商:

  1. 收集 DOI、PMID、准确标题、文章 URL 或明确的文章列表,然后规范化其元数据和出版商。

  2. 如果属于 Elsevier、Springer Nature 或 IEEE 并且已配置可用的提供商凭据,首先尝试该出版商 API。成功时,记录 accessMode: publisher_api 和 oa_status: not_checked_api_first;不要仅为了标记文章而运行 OA 解析。

  3. 如果出版商 API 失败,自动搜索合法的 OA 来源,如 PMC、Unpaywall、出版商 OA 页面、arXiv 和其他合法仓库或明确的开放 PDF URL。在清单中保留失败的 API 尝试。

  4. 对于所有其他英文出版商,在 Web Access 之前搜索这些合法的 OA 来源。

  5. 对于准确标题或显式的仅 OA 请求,优先使用:

    node scripts/batch_download.mjs --title "<准确标题>" --open-access --no-si --out "<项目>"
    

    当用户提供已知的合法 OA PDF URL 时使用 --pdf-url。

  6. 验证下载的文件并记录来源。将成功的 PDF 标记为 open_access_downloaded。

  7. 如果未找到合法的 OA 全文,标记 oa_not_found。对于 API 已经失败的支持出版商,在 Web Access 之前请求确认。对于其他出版商,继续到 Web Access。如果显式请求了 --route open_access,在 OA 结果后停止。

出版商 API 凭据

在固定的出版商启动块之后,仅配置用户已获得 API 密钥的提供商。让用户通过本地隐藏提示输入每个密钥:

python3 scripts/configure_credentials.py set elsevier
python3 scripts/configure_credentials.py set springer_nature
python3 scripts/configure_credentials.py set ieee --fulltext-endpoint 'https://issued-endpoint.example/articles/{doi}'
python3 scripts/configure_credentials.py show
python3 scripts/configure_credentials.py validate <provider>
python3 scripts/configure_credentials.py delete <provider>
python3 scripts/configure_credentials.py contact-email [email protected]

仅使用上面固定启动块中的注册 URL。让用户通过本地隐藏提示输入每个密钥;切勿回显或将其放入清单中。IEEE Metadata API 访问不是付费全文访问;在将 IEEE 视为可通过 API 下载之前,需要已发放的 Full-Text Access 端点/模板。密钥存储在 ~/.config/lit-dl/credentials.json,权限为 0600。

资源 URL 分类

在选择访问路径之前,对用户提供的 URL 进行分类:

cas.* / /authserver/login        CAS / SSO 登录页面;检查 service= 回调,然后返回到服务门户
idp/shibboleth / carsi           CARSI / Shibboleth 机构路由
ezproxy / libproxy               EZproxy 远程访问代理
webvpn / vpn                     WebVPN 路由
metaersp / metaauth / uas        图书馆资源聚合门户
webofscience / sciencedirect     数据库或出版商入口;检查是否通过门户访问

如果 URL 是带有 service= 参数的登录页面,将回调主机视为资源服务,不要使整个工作流停留在登录页面。例如,https://login.university.example/authserver/login?service=https://resources.university.example/callback 意味着身份服务在认证后返回到用户的资源门户。

机构特定域名

对照用户地址栏中实际显示的内容进行确认;为每个机构纠正这些内容,而不是假设预设是完整的。

图书馆主页 / 聚合:  library.example.edu, resources.example.edu
发现/数据库入口:    webofscience.com, clarivate.com, cnki.net, sciencedirect.com, provider.example.com
统一身份 / SSO:      sso.example.edu, cas.example.edu, idp.example.edu
联邦 / WAYF:           ds.carsi.edu.cn, wayf.example.org, shibboleth/openathens hosts
代理 / WebVPN:              ezproxy.example.edu, webvpn.example.edu

将配置的机构登录、联邦、代理和数据库登录主机视为登录阶段。不要将访问它们视为最终失败。

边界

仅使用用户的合法机构访问权限。不要绕过付费墙、DRM 或双因素认证。

验证优先规则: 当用户的认证 Chrome 会话中出现可见的滑块、复选框、机器人检查或简单验证控件时,在浏览器中尝试它,然后再要求用户干预。保持尝试有界(每个标签最多两次),验证挑战已消失,并在成功时从同一标签继续。

  • 滑块/拖动挑战(包括 CNKI 拼图滑块):估计可见的移动距离并模拟逐渐拖动。
  • ScienceDirect 机器人检查、管理的 Turnstile 和 reCAPTCHA 复选框阶段:尝试可见的复选框一次。
  • 简单的“继续”、“验证”或等效的可见控件:点击一次,然后重新检查页面状态。

用户移交: 仅在有限的尝试失败后,或当页面需要秘密或身份相关的输入(如图像选择答案、QR 批准、短信/OTP、通行密钥、硬件密钥或双因素认证)时,立即要求用户。保持受挑战的标签页打开,并且切勿要求用户将凭据或代码粘贴到聊天中。

避免无边界或不加区分的下载。仅处理用户确认的明确文章列表,应用提供商友好的节流,并保留清晰的审计痕迹,记录下载了什么、从哪里下载以及是否找到了补充材料。

不要要求用户将机构密码、数据库密码、OTP 代码、恢复代码或会话令牌粘贴到聊天或终端中。如果用户提供密码,拒绝并使用移交登录工作流。

已保存的机构登录页面例外:如果用户明确表示浏览器已填写凭据并授权点击可见的登录/确认按钮,代理可以仅点击一次该按钮在预期的机构 SSO / CAS / CARSI / Shibboleth 页面上,而不读取、复制或输入任何凭据。此例外不适用于 CAPTCHA、QR 登录、短信/OTP、出版商机器人检查、同意/安全警告或预期机构登录流程之外的任何页面。

不要检查或导出 cookie、密码、本地存储、浏览器配置文件或会话文件。仅使用浏览器已认证的页面上下文。

前置条件

在尝试下载之前,确认适用于所选访问分支的条件。

对于仅 OA 分支,确认目标文章标识符/列表、输出文件夹、Node.js 22+ 以及当 PDF 验证需要时的 Python 3。不需要图书馆配置或机构浏览器登录。

对于付费图书馆分支,确认以下条件:

  1. 持有用户图书馆/数据库登录状态的浏览器在用户机器上打开。
  2. 学校配置存在且有效。
    • 运行 python3 scripts/configure_school.py show。
    • 如果缺失,运行 python3 scripts/configure_school.py preset "<学校名称>" 或引导用户通过 src/wizard.py。
  3. 用户已亲自登录其机构。

…[截断以供翻译]

関連スキル