Nature 文獻下載器 是做什麼的?
此技能將文獻路由至合法的開放取用、出版商 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 存取路線。
標準化 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 存取。
瀏覽器狀態原則。 授權下載取決於使用者登入的特定瀏覽器設定檔。如果代理程式、CDP 工作階段或瀏覽器自動化工具開啟了一個新的設定檔或沒有登入狀態的不同瀏覽器,請勿將失敗視為缺少圖書館權限。切換至重複使用使用者活躍瀏覽器工作階段的控制路徑,或要求使用者在受控的瀏覽器實例中進行驗證。
格式原則。 PDF、HTML 全文以及資料庫原生格式(如 CAJ)是不同的 deliverables。如果使用者只要求 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 金鑰。使用者負責執行所有密碼、CAPTCHA、OTP、電子郵件確認、同意及 API 金鑰複製步驟。請勿從瀏覽器頁面讀取 API 金鑰,或要求使用者透過聊天傳送它們。
API 優先與開放取用備援
對於英文文章,在決定何時解析文章級 OA 之前,先識別其出版商:
-
收集 DOI、PMID、確切標題、文章 URL 或明確的論文清單,然後標準化其後設資料與出版商。
-
如果文章屬於 Elsevier、Springer Nature 或 IEEE,且已設定可用的提供者憑證,請先嘗試該出版商 API。成功時,記錄
accessMode: publisher_api和oa_status: not_checked_api_first;請勿僅為了標記文章而執行 OA 解析。 -
如果出版商 API 失敗,請自動搜尋合法的 OA 來源,例如 PMC、Unpaywall、出版商 OA 頁面、arXiv 及其他合法儲存庫或明確的開放 PDF URL。將失敗的 API 嘗試保留在資訊清單中。
-
對於所有其他英文出版商,在 Web Access 之前先搜尋這些合法的 OA 來源。
-
對於確切標題或明確的 OA-only 請求,偏好使用:
node scripts/batch_download.mjs --title "<exact title>" --open-access --no-si --out "<project>"當使用者提供已知的合法 OA PDF URL 時,使用
--pdf-url。 -
驗證下載的檔案並記錄來源。將成功的 PDF 標記為
open_access_downloaded。 -
如果未找到合法的 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 中繼資料 API 存取並非付費全文存取;需要已發行的全文存取端點/範本,才能將 IEEE 視為可透過 API 下載。秘密儲存在 ~/.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 核取方塊階段:嘗試一次可見的核取方塊。
- 簡單的
Continue、Verify或等效的可見控制項:點擊一次,然後重新檢查頁面狀態。
移交給使用者: 僅在有限的嘗試失敗後,或當頁面需要機密或身分驗證輸入(如圖像選擇答案、QR 碼批准、SMS/OTP、通行金鑰、硬體金鑰或雙因子驗證)時,才立即詢問使用者。保持受挑戰的分頁開啟,且切勿要求使用者將憑證或驗證碼貼到對話中。
避免無限制或無差別的下載。僅處理使用者確認的明確論文清單,採用提供者友善的節奏,並留下清晰的稽核軌跡,記錄下載了什麼、從哪裡下載以及是否找到了輔助資訊。
請勿要求使用者將機構密碼、資料庫密碼、OTP 碼、恢復碼或工作階段權杖貼到對話或終端機中。如果使用者主動提供密碼,請拒絕並改用移交登入工作流程。
已儲存的機構登入頁面例外:如果使用者明確表示瀏覽器已填入憑證並授權點擊可見的登入/確認按鈕,則代理程式可以在預期的機構 SSO / CAS / CARSI / Shibboleth 頁面上點擊該按鈕一次,無需讀取、複製或輸入任何憑證。此例外不適用於 CAPTCHA、QR 碼登入、SMS/OTP、出版商機器人檢查、同意/安全警告或預期機構登入流程之外的任何頁面。
請勿檢查或匯出 Cookie、密碼、本地儲存、瀏覽器設定檔或工作階段檔案。僅使用瀏覽器已驗證的頁面上下文。
先決條件
在嘗試下載之前,請確認適用於所選存取分支的條件。
對於僅 OA 分支,請確認目標論文識別碼/清單、輸出資料夾、Node.js 22+,以及在需要時用於 PDF 驗證的 Python 3。不需要圖書館設定或機構瀏覽器登入。
對於付費圖書館分支,請確認以下條件:
- 擁有使用者圖書館/資料庫登入狀態的瀏覽器在使用者的機器上開啟。
- 學校設定存在且有效。
- 執行
python3 scripts/configure_school.py show。 - 如果不存在,執行
python3 scripts/configure_school.py preset "<school name>"或引導使用者透過src/wizard.py進行設定。
- 執行
- 使用者已親自登入其機構
…
(已截斷以利翻譯)