Install
openclaw skills install @xiaoge6666/literature-harvest-zotero知网+NCBI+Google Scholar 多源文献下载 → Zotero 合集入库完整流水线(父条目+linked_file+标签+中文笔记)
openclaw skills install @xiaoge6666/literature-harvest-zotero用户要求「下载 N 篇 XX 主题文献,来源涉及知网/NCBI/Google Scholar,放 Zotero 某合集」时,按本 SOP 执行。 已验证批次:2026-08-18 连续 7 批(5+5+5+7+7+9+9 篇)全部成功;含子代理全自动执行验证。
https://api.zotero.org/users/<你的UserID>/;云存储满时 PDF 一律 linked_file 本地链接(path=你的本地文献目录/xxx.pdf),不传云%TEMP%\openclaw\downloads\ → 拷到本地文献目录;NCBI/Scholar 直接写该目录① 知网 N 篇(浏览器) → ② NCBI N 篇(eutils+PMC 下载) → ③ Scholar N 篇(cookie 抓取) → ④ Zotero 建合集/入库(父条目+附件+标签+中文笔记) → ⑤ 验证 → ⑥ 归档记忆
browser open https://www.cnki.net/(自动 IP 登录,勿找登录按钮)Get-ChildItem $env:TEMP\openclaw\downloads | sort LastWriteTime -d 查新文件~/Downloads/文献/,命名 CNKI_标题_作者年份.pdf,前缀 CNKI_)browser act evaluate 抓 document.body.innerText 片段,搜关键词(导师/学科专业/博士|硕士/年期/DOI/分类号):
() => { const t = document.body.innerText; const out=[]; for (const kw of ['年度','DOI','分类号','导师','学科专业','博士','硕士']) { const i=t.lastIndexOf(kw); if(i>=0) out.push(kw+': '+t.slice(Math.max(0,i-70),i+90).replace(/\s+/g,' ')); } return out.join('\n---\n'); }
(20\d{2})[年.]模板:templates/ncbi_search.py(检索+PMC 确认)、templates/dl_epmc.py(下载)、templates/pmc_pow_dl.py(POW 直连兜底)
"PP2A"[Title] AND (fung*[Title/Abstract] OR yeast* OR Aspergillus OR Candida OR Fusarium) 或 "Rho GTPase"[Title/Abstract] AND fungi;esearch+esummary 一次拿到 PMID/期刊/年份/被引https://europepmc.org/articles/{PMCID}?pdf=render(代理)
b. Europe PMC REST fullTextPDF:https://www.ebi.ac.uk/europepmc/webservices/rest/{PMCID}/fullTextPDF(代理)
c. PMC 官网 POW 直连(a/b 404 时秒切):curl.exe 不开代理 直连 https://pmc.ncbi.nlm.nih.gov/articles/{PMCID}/pdf/main.pdf,遇 POW_CHALLENGE 解算 sha256 前缀 nonce 后带 cookie cloudpmc-viewer-pow=<challenge>,<nonce> 重试 → 2026-08-18 对 Nature/MMBR/mBio 3/3 全通(见 templates/pmc_pow_dl.py)
d. PLOS 直链:https://journals.plos.org/{journal}/article/file?id={doi}&type=printable
content[:4]==b"%PDF" 且 >50KBefetch retmode=xml 拿卷/期/页/DOI/作者全名/摘要(比 esummary 更全)模板:templates/scholar_grab_parse.py
requests.Session() 先 GET google.com 拿 NID cookie(代理)→ 同 session 访问 scholar.google.com/scholar?q=... 返回 200 可解析elink 查 PMC 再下$env:PYTHONIOENCODING="utf-8"(否则 GBK 控制台 UnicodeEncodeError \xa0 崩溃)GET collections 是否已存在 → 无则 POST collections(body 字段 parentCollection,不是 collection)→ 记 keyPOST items 数组,collections:[key],thesis/journalArticle 全字段(含 DOI/url/abstractNote/tags);中文文献 tags 用 研究方向+物种+主题itemType=attachment, linkMode=linked_file, parentItem=<key>, path=<你的本地文献目录>/xxx.pdf<p> 格式):研究方向关联 + 核心内容 + 可借鉴方法;⏺ 笔记正文禁嵌 ASCII 双引号(Python 字符串 SyntaxError 坑,中文句内引号用「」全角)_zotero_*.py 现成脚本改导表(找最新模板,含 add / notes 两阶段)GET collections/{key}/items?limit=100 → 计数:父条目数 = 附件数 = 笔记数,itemType 分布正确,每篇带标签。
写 memory/YYYY-MM-DD-HHMM.md:批次表(文献/来源/Zotero key)+ 新踩坑 + 脚本名;更新 TOOLS.md 如有新配置。
| 坑 | 解法 |
|---|---|
| kns8s/kcms2 URL 直接打开 → clickWord 文字点选验证码(无法自动化过) | 只走首页搜索框搜短关键词 → 点结果进详情;已有结果页内点标题安全 |
| kns8s URL 直接搜触发滑块验证 | 走首页搜索框输入 |
| waitfordownload 超时 | 无视,等几秒查目录 |
| 知网弹「IP超出使用范围」 | 无视,下载照常 |
| NCBI 代理 TLS 断 | 代理→直连双向重试 |
| Europe PMC fullTextPDF / ?pdf=render 全 404(Nature/MMBR/mBio 实测,2026-08-18) | PMC 官网 POW 直连:curl 直连 /pdf/main.pdf + 解 POW_CHALLENGE 带 cookie 重试(pmc_curl_dl.py,3/3 全通) |
| PMC 官网走代理触发 reCAPTCHA | 直连(不开代理)反而能过 POW → PMC 一律直连 |
| Scholar headless 被 sorry 拦 | cookie 法(google.com→scholar) |
| Wiley/ASM/T&F CF 403 | 避开;但 ASM 的 mBio 全 OA 进 PMC,可用 POW 直连下;预案预置备选 |
| Zotero 云配额满 | linked_file 本地路径 |
| GBK 控制台打印崩溃 | PYTHONIOENCODING=utf-8 |
| Zotero collection 字段名错 | parentCollection |
| 笔记正文内嵌 ASCII 双引号 → Python SyntaxError | 句内引号用「」全角 |
| Zotero API key 用截断版 → UnicodeEncodeError | 必须完整 24 字符(踩 3 次) |
| 学位论文年份详情页无显示 | pypdf 读 PDF 首页(答辩时间);扫描版用页面正文正则 |
_ncbi_pp2a_search.py / _ncbi_rho_search.py(检索)_pp2a_efetch.py(efetch 元数据)_pp2a_dl4.py(Europe PMC/PLOS 下载)pmc_curl_dl.py(模板始祖)_pp2a_pmc_dl.py(PP2A 版,3/3 成功)_scholar_grab.py(抓)_scholar_pp2a_parse.py(解析)_scholar_pp2a_check.py(EPMC OA 确认)_zotero_collections.py(查合集)_zotero_pp2a_add.py(条目+附件,最新模板)_zotero_pp2a_notes.py(笔记,最新模板)