dsh-lit-fetch:在 DSH 里检索文献、批量拉 PDF、生成获取清单

前言

在 DSH 里做文献综述或批量备料时,常见做法是自己在浏览器里搜 DOI、再逐个找 PDF,或写脚本调 Crossref、Sci-Hub、Unpaywall。这些步骤分散,agent 也难以一次性完成「搜元数据 → 落盘 PDF → 把下不到的条目整理成可点清单」。社区插件 dsh-lit-fetch(维护者 loyalchiiina,分类:联网工具)把这三件事收成三个工具,供对话中的 agent 调用;它不是网页正文抓取工具,不解析 readability、不把 HTML 转成正文,只做文献元数据检索、PDF 下载和批量获取清单 HTML。

这是什么

dsh-lit-fetch 是 DeepSeek Harness 的文献获取插件:按 DOI 或标题/关键词查论文元数据,按 DOI 批量下载 PDF(Sci-Hub 镜像优先、Unpaywall 开放获取兜底),并对未能自动拿到的条目生成中文页面的可点击清单。宿主侧为纯 Node.js,无 Python 依赖;当前 package 版本为 1.0.5,许可证 MIT。源码与说明见 GitHub,目录页见 SkillHub。

检索:search_papers

下面介绍元数据检索的行为,便于你在对话里描述需求时和 agent 对齐。

  1. DOI 精确查:输入形如 10.xxxx/...(正则 ^\d+\.\d+\//)时,走 Crossref works/{doi};单次请求超时 15 秒,失败会自动降级为 OpenAlex 关键词检索。
  2. 标题/关键词查:非 DOI 或 Crossref 未命中时,走 OpenAlex works?search=,默认返回 5 条,最多 20 条。
  3. 返回字段:标题、作者、期刊、年份、DOI、官方链接。

在 DSH 对话中可自然语言触发,例如:「帮我找关于 static mixer CFD 的文献」→ agent 调用 search_papers。

下载:download_papers

按 DOI 列表批量下载 PDF 到指定目录,策略如下。

  1. Sci-Hub 优先:依次尝试 8 个镜像域名(sci-hub.ren / ee / st / ru / se / wf / hk、tesble.com),请求 域名 + DOI 页面(超时 25 秒),用正则从 iframe/embed 解析 PDF 直链,再整包读入内存、校验魔数 %PDF- 与最小体积(拒绝小于 3000 字节),通过后先写 <文件名>.pdf.part 再 rename 为正式文件(非流式、无断点续传)。
  2. 开放获取兜底:Sci-Hub 均失败或校验不过时,查 Unpaywall(30 秒超时),优先 best_oa_location,再遍历 oa_locations 的 url_for_pdf 或 url,同样走下载与校验。
  3. 并发与命名:并发默认 4,可调且夹在 1–8;文件名为 <两位序号>_<清洗后标题>.pdf(标题去掉 \ / : * ? " < > | 与换行制表符,最长 120 字符)。

每篇可能的状态:ok / scihub-fail / oa-fail / closed-access / no-doi。结果数组写入输出目录的 _lit_fetch_report.json(内容是数组,不是汇总对象)。注意:Sci-Hub 失败但 OA 成功时,同一篇会写入两条记录(scihub-fail 与 ok),因此记录条数可能大于论文篇数。

对话示例:「把这些 DOI 下载到 D:\papers\」→ agent 调用 download_papers。

清单:generate_manifest

对未能自动获取的文献,可生成可点击的 HTML 清单,默认文件名为 批量获取入口.html(可改),页面语言固定为中文。每行含序号、链到 https://doi.org/<DOI> 的标题、第一作者、年份、期刊、状态徽章和「下载 PDF」按钮;另有「顺序打开全部」,逐条间隔 800 ms 打开。

对话示例:「给没下载到的文献生成获取清单」→ agent 调用 generate_manifest。

状态字段与清单显示(重要)

download_papers 产出的状态与 generate_manifest 识别的状态不一致:

来源 状态值
download_papers ok · scihub-fail · oa-fail · closed-access · no-doi
generate_manifest 仅识别 ok(绿色「✓已下载」)· failed(橙色「✗需手动」)
其余取值 灰色「—」,既不算已下载也不算需手动

若把下载结果原样传给 generate_manifest,只有 ok 会显示为已下载,其余失败态都会变成灰色「—」。若希望失败项显示橙色「✗需手动」,需先把非 ok 状态映射为 failed 再传入。

安装与启用

插件以当前 DSH 进程权限运行联网与写盘,安装前建议自行查看 源码 与 MIT 许可证。

官方安装命令如下(README 原文):

dsh plugin --profile desktop add dsh-lit-fetch
# 或从本地目录 link
# cp -r dsh-lit-fetch ~/.dsh/local-plugins/

运行环境要求 Node.js ^22.19.0 || >=24.0.0;peer 依赖包括 @deepseek-ai/dsh 等,以 package.json 为准。

插件在宿主注册 /lit-fetch 前缀路由,返回 {status, plugin, version} JSON,version 来自 package.json,便于确认已加载版本。

典型用法小结

经过上面的步骤,一条常见链路是:

  1. 用自然语言搜索,得到 DOI 与元数据;
  2. 指定本地目录批量下载 PDF,查看 _lit_fetch_report.json;
  3. 对仍需人工处理的条目映射状态后生成 批量获取入口.html,或直接在清单里逐条打开 DOI 与下载入口。

适用场景与限制

适合:在 DSH 会话里做文献调研、按 DOI 批量备 PDF、把下不到的论文整理成可点清单;与「网页正文抓取」类插件职责不同,勿混用。

已知限制(README 说明):

  • Sci-Hub 2021 年后基本停止收录新文献,Elsevier/Wiley/ACS 2021 年后文章大概率无收录;
  • 直连 Sci-Hub 镜像可能较慢,文档建议 VPN/代理;
  • OA 兜底仅查 Unpaywall,部分 arXiv 预印本可能未收录;
  • PDF 全量缓冲在内存,无流式、无断点续传、无下载进度;页面抓取 25 秒、PDF 读取 180 秒等超时需自行容忍大文件失败。

DSH 生态强调「一切皆插件」;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-lit-fetch 把 Crossref/OpenAlex 检索、Sci-Hub 与 Unpaywall 下载、以及中文 HTML 获取清单收进 DSH 工具链,适合需要在 agent 对话里闭环「搜—下—补清单」的开发者。进一步细节以仓库 README 为准:GitHub — loyalchiiina/dsh-lit-fetch。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜