ZJU Literature Downloader
此技能將經過驗證的工作流程轉變為可重複、合法範圍內的流程,用於透過使用者的浙江大學圖書館 / WebVPN 存取權限來尋找、下載和閱讀論文。
邊界
僅使用使用者的合法機構存取權限。請勿繞過付費牆、DRM、CAPTCHA、Cloudflare、出版商機器人檢查或雙因素驗證。如果頁面要求 CAPTCHA、QR 碼登入、簡訊/OTP、Cloudflare、出版商機器人檢查或安全挑戰,請停止並要求使用者在 Chrome 中完成。
避免大量下載。以小批量方式工作,最好在使用者確認論文清單後進行。留下清晰的稽核軌跡,記錄下載內容、來源以及是否找到補充資料。
請勿要求使用者在聊天或終端機中貼上機構密碼、CAS 憑證、OTP 碼、恢復碼或工作階段令牌。如果使用者提供密碼,請拒絕並改用交接登入工作流程。
ZJU CAS 已儲存登入頁面的例外情況:如果使用者明確表示 Chrome 已填寫 ZJU CAS 憑證,並授權點擊登入/確認按鈕,則代理可以在 ZJU CAS/WebVPN/機構 SSO 頁面上點擊該按鈕一次,無需讀取、複製或輸入任何憑證。此例外不適用於 CAPTCHA、QR 碼登入、簡訊/OTP、出版商機器人檢查或預期機構登入流程之外的任何頁面。
請勿檢查或匯出 cookie、密碼、本地儲存、瀏覽器設定檔或工作階段檔案。僅使用瀏覽器已通過驗證的頁面上下文。
前置條件
在嘗試下載之前,請確認以下條件:
- 使用者的機器上已開啟 Chrome。
- 使用者已在 Chrome 中親自登入浙江大學圖書館 / WebVPN。
- 常見頁面:
https://libweb.zju.edu.cn/、https://webvpn.zju.edu.cn/、https://zju.summon.serialssolutions.com/。
- 常見頁面:
- 已允許目前瀏覽器實例進行 Chrome 遠端除錯。
- 要求使用者開啟
chrome://inspect/#remote-debugging。 - 他們必須啟用「允許對這個瀏覽器實例進行遠端除錯」。
- 要求使用者開啟
- 環境可以執行 Node.js 22+。
- 嘗試
node --version。 - 如果在 Codex Desktop 中
node不在 PATH 上,請嘗試%LOCALAPPDATA%\OpenAI\Codex\bin\node.exe。
- 嘗試
- web-access CDP 代理可用或可以啟動。
- 典型的 Claude Code 路徑:
%USERPROFILE%\.claude\skills\web-access-main\scripts\check-deps.mjs。 - 典型的共享代理路徑:
%USERPROFILE%\.agents\skills\web-access-main\scripts\check-deps.mjs。 - 在僅 Codex 的設定中,也請檢查
%USERPROFILE%\.codex\skills\web-access-main\scripts\check-deps.mjs。
- 典型的 Claude Code 路徑:
- 使用者已批准目標輸出資料夾。
如果 Claude Code 表示此技能未安裝,請將其安裝或複製到:
$env:USERPROFILE\.claude\skills\zju-literature-downloader
Codex 和其他代理設定可能改用 .codex\skills 或 .agents\skills;將這三個位置視為安裝目標,而非不同的技能版本。
批次範圍
當使用者提供明確的 DOI/標題/PMID 清單時,支援小批量處理。
建議限制:
- 一般批次:5-10 篇論文
- 實際上限批次:15-20 篇論文,需有暫停和一份清單
- 如果出現出版商檢查、CAPTCHA、WebVPN 過期或異常下載提示,請立即停止
切勿將廣泛的關鍵字搜尋變成無限制的自動下載。請勿下載整個期刊期數、卷號或大量結果集。
狀態分類
將每篇論文分類為以下其中一種狀態,並在清單中保留該狀態:
downloaded
downloaded_with_si
si_only_downloaded
cas_waiting_user
institutional_login_waiting_user
cas_resolved_retry_needed
publisher_verification_waiting_user
sciencedirect_robot_check
retry_after_user_verification
do_not_auto_retry
url_needs_repair
summon_no_link
summon_unreachable
browser_pdf_viewer_fallback_needed
publisher_blocked_waiting_user
no_authorized_pdf_found
failed_after_retry
ip_not_authorized
purchase_required
當瀏覽器明顯停留在浙江大學 CAS / 統一身分認證頁面時,使用 cas_waiting_user。當論文仍停留在機構選擇器、CARSI/Shibboleth/OpenAthens 交接或 CAS 之前的等效 SSO 步驟時,使用 institutional_login_waiting_user。兩者都是非最終狀態;為保持向後相容的清單,請保留 cas_waiting_user。
當已驗證一個或多個官方補充資訊檔案,但主要文章 PDF 仍無法透過使用者的授權存取取得時,使用 si_only_downloaded。請勿將其稱為 downloaded。
當 Summon SPA 在單次重新整理後持續回傳 ERR_EMPTY_RESPONSE 或無法載入時,使用 summon_unreachable。當 Chrome 明顯顯示 PDF,但瀏覽器上下文中的 fetch() 無法擷取其位元組時,使用 browser_pdf_viewer_fallback_needed。這兩種狀態都不表示論文不可用;兩者都指定了下一個合法的備用方案。
當出版商頁面顯示「Are you a robot?」、CAPTCHA、Cloudflare、機器人驗證或其他反自動化挑戰時,使用 publisher_verification_waiting_user 或 sciencedirect_robot_check。請勿將其視為最終失敗,但也不要嘗試自動解決。
啟動 Chrome 控制
在可用時使用 web-access CDP 代理。
在 Windows PowerShell 中:
$node = "node"
if (-not (Get-Command node -ErrorAction SilentlyContinue)) {
$node = "$env:LOCALAPPDATA\OpenAI\Codex\bin\node.exe"
}
$checkDepsCandidates = @(
"$env:USERPROFILE\.claude\skills\web-access-main\scripts\check-deps.mjs",
"$env:USERPROFILE\.agents\skills\web-access-main\scripts\check-deps.mjs",
"$env:USERPROFILE\.codex\skills\web-access-main\scripts\check-deps.mjs"
)
$checkDeps = $checkDepsCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
if (-not $checkDeps) { throw "web-access-main/scripts/check-deps.mjs not found" }
& $node $checkDeps
然後測試:
Invoke-WebRequest -UseBasicParsing -Uri "http://127.0.0.1:3456/targets" -TimeoutSec 10
如果此操作掛起或失敗:
- 要求使用者確認遠端除錯複選框。
- 檢查
%TEMP%\cdp-proxy.log。 - 請勿嘗試讀取 Chrome 工作階段檔案。
核心 CDP 代理 API
常見的 web-access 代理是 http://127.0.0.1:3456。
| Endpoint | Method | Purpose |
|---|---|---|
/health | GET | 代理健康狀態與 Chrome 連線狀態 |
/targets | GET | 列出已開啟的 Chrome 分頁 |
/new?url=... | GET | 建立新的背景分頁 |
/navigate?target=...&url=... | GET | 導航現有分頁 |
/close?target=... | GET | 關閉分頁 |
/info?target=... | GET | 取得頁面標題、URL 和 readyState |
/eval?target=... | POST body=JS | 在分頁中執行 JavaScript 並回傳 { value: ... } |
/clickAt?target=... | POST body=CSS selector | 點擊可見元素中心 |
對於包含 #! 片段的 Summon URL,請使用 /navigate 而非 /new。如果 #! 片段被移除,Chrome 可能會開啟 about:blank 或錯誤頁面。如果 curl 不可用,對於簡單檢查請使用 PowerShell Invoke-WebRequest,對於代理呼叫請使用 Node.js fetch()。
建議搜尋工作流程
優先使用圖書館探索路徑,而非直接前往出版商頁面。它更穩定,且較不容易觸發機器人保護。
- 在 ZJU Summon 中按 DOI 或確切標題搜尋:
https://zju.summon.serialssolutions.com/search?#!/search?pn=1&ho=t&include.ft.matches=f&l=en&q=<URL 編碼的 DOI 或標題>
- 透過
scripts/cdp_open_url.mjs或其他方式開啟 Summon URL,並在呼叫 CDP 代理時完整 URL 編碼巢狀 URL。Summon 使用#!;如果#片段被移除,Chrome 可能會開啟about:blank或錯誤頁面。 - 使用
/eval讀取結果頁面。 - 提取可見文字或
aria-label為以下內容的連結:PDF在線全文Full TextView PDF- 出版商特定的全文條目。
- 優先選擇結果中的
PDF連結(如果存在)。 - 透過 CDP 代理在新的背景分頁中開啟 PDF 連結。
- 如果出版商顯示安全挑戰,要求使用者手動完成。
- PDF 在 Chrome 中顯示後,使用
scripts/browser_pdf_downloader.mjs從已驗證的瀏覽器上下文中儲存。
Summon 實戰筆記
從 Summon 提取 PDF、線上全文或出版商連結時:
- 跳過空的
href值。第一個線上全文匹配可能是 facet 切換按鈕,而非真實連結。 - 將 Summon 視為緩慢的 SPA:導航後等待約 6 秒,然後重試連結提取最多 3 次,每次短暫暫停。
- 如果 Summon 重新導向到
login.serialssolutions.com/sso/login並顯示 IP 在授權範圍之外,記錄ip_not_authorized。在這種情況下,使用者可能需要 ZJU RVPN/SSLVPN 用戶端,而不僅僅是在瀏覽器頁面中使用 WebVPN,因為 CDP 控制的 Chrome 分頁可能仍使用本地網路 IP。 - 如果 Summon 沒有 PDF 但有線上全文連結,請先嘗試該路徑,然後再手動建構出版商 URL。
- 如果頁面在單次新導航和正常的 SPA 等待後持續顯示
ERR_EMPTY_RESPONSE或無法渲染,記錄summon_unreachable。不要在 Summon 上循環:如果需要的話,嘗試一次 DOI 的出版商登陸頁面或確認的 OA 路徑,但仍在使用者授權的瀏覽器工作階段中進行。
出版商特定模式
僅在確認論文身分後,將這些作為基於 DOI 的修復提示使用。如果頁面或 PDF 實際上未驗證,請勿聲稱存取權限。
ACS Publications
對於 DOI 前綴 10.1021/...:
https://pubs.acs.org/doi/pdf/<doi>
ACS 補充資訊通常遵循:
https://pubs.acs.org/doi/suppl/<doi>/suppl_file/<journal-code>_si_001.pdf
已驗證的範例 10.1021/acs.biomac.4c00102 使用了 bm4c00102_si_001.pdf。
盡可能從 ACS 文章登陸頁面開始。簡短的中文「請稍候...」過渡頁面可能會自行清除;等待約 5-10 秒並檢查頁面一次,然後再將其歸類為出版商挑戰。可讀的摘要頁面並不證明主要 PDF 已授權:如果仍顯示「Available to Purchase」或「Access through Institution」,請記錄適當的機構登入或購買狀態,並將任何登入選擇留給使用者。
即使主要 PDF 未授權,文章頁面上顯示的 ACS 補充資訊連結也可以合法地導向 ACS Figshare / ndownloader.figstatic.com 下載。跟隨可見的官方連結,驗證結果 SI PDF,並在主要文章也驗證之前記錄 si_only_downloaded。請不要猜測文章頁面連結之外的補充檔案名稱,也不要將可存取的 SI 視為擷取付費主要論文的許可。
Wiley
對於 DOI 前綴,例如 10.1002/... 或 10.1111/...,首先導航到已驗證的 Wiley 文章頁面,然後從該頁面自己的來源擷取:
<location.origin>/doi/pdfdirect/<doi>?download=true
請勿硬編碼 onlinelibrary.wiley.com:Summon 可能透過子網域(例如 advanced.onlinelibrary.wiley.com)進行驗證,跨來源擷取可能會失敗。同時,避免將分頁直接導航到 pdfdirect,因為瀏覽器可能會開始下載並使頁面上下文無法使用。優先使用頁面上下文的 fetch()。
Springer Nature
對於 DOI 前綴,例如 10.1007/... 和 10.1186/...:
https://link.springer.com/content/pdf/<doi>.pdf
機構登入解決後,這通常有效。如果直接 shell 下載回傳 401、403 或 HTML 登入頁面,請使用瀏覽器上下文的 fetch。
Nature Communications
對於 OA DOI 模式,例如 10.1038/s41467-...,嘗試:
https://www.nature.com/articles/<article-id>.pdf
從 DOI 後綴中提取 <article-id>,並仍驗證 PDF 標頭和文字。
bioRxiv
對於 DOI 前綴 10.1101/...,嘗試:
https://www.biorxiv.org/content/<doi>v1.full.pdf
如果版本 1 回傳 404,請嘗試文章頁面或後續版本。確認標題相符。
Frontiers
對於 DOI 前綴 10.3389/...,嘗試:
https://www.frontiersin.org/articles/<doi>/pdf
如果失敗,請先開啟文章頁面並使用其可見的 PDF 連結。
RSC Publishing
對於 DOI 前綴 10.1039/...,請勿假設 ZJU 已授權全文存取。如果 PDF 連結回傳 404 或購買頁面,請檢查文章頁面並記錄 no_authorized_pdf_found 或 purchase_required,而不是積極重試。
出版商驗證與 ScienceDirect
ScienceDirect 和某些出版商平台在重複的直接 DOI 導航或自動開啟分頁後,可能會顯示「Are you a robot?」、CAPTCHA、Cloudflare、機器人驗證或類似檢查。這些頁面是安全性和反自動化挑戰,而非一般的登入確認。
透過使用保守的存取模式來降低觸發它們的機率:
- 優先使用 ZJU Summon / WebVPN / 圖書館的「在線全文」連結,然後再進行
doi.org -> 出版商的導航。 - 一次處理一篇的 ScienceDirect 和其他敏感出版商的文章。
- 在清單中保留可見的稽核軌跡;請勿同時開啟許多出版商分頁。
- 等待每個頁面穩定後再尋找「Download PDF」、「View PDF」或「PDF」。
- 使用者在完成驗證步驟後,重複使用同一個分頁,而不是不斷開啟新分頁。
- 避免重試循環。在將頁面交給使用者之前,一次自動嘗試失敗就足夠了。
當出版商驗證頁面出現時:
- 停止對該分頁的自動操作。
- 將論文記錄在
publisher_verification.tsv或主要清單中,狀態為publisher_verification_waiting_user;對於 ScienceDirect 的「Are you a robot?」頁面,使用sciencedirect_robot_check。 - 告知使用者哪些論文和分頁需要手動處理。
- 請勿自動點擊 CAPTCHA、Cloudflare、「Are you a robot?」、機器人檢查或類似的挑戰控制項。
- 使用者表示驗證已完成後
…
(原文已截斷)