🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

自然论文速递 666489/dsh-nature-papers

DeepSeek 客户端
66648975 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

每日推送三篇 Nature 高分论文并附摘要

26.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/1 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/666489/dsh-nature-papers.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 75 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 9 处,展示前 9 条)
  • 读取本地文件
    lib/index.js:44
    if (existsSync(file)) {
  • 读取本地文件
    lib/index.js:46
    const raw = readFileSync(file, 'utf8').replace(/^ FEFF/, '')
  • 写入本地文件
    lib/index.js:60
    try { renameSync(file, `${file}.bak`) } catch { }
  • 写入本地文件
    lib/index.js:68
    mkdirSync(dirname(store.file), { recursive: true })
  • 写入本地文件
    lib/index.js:70
    writeFileSync(tmp, JSON.stringify({ history }, null, 2), 'utf8')
  • 写入本地文件
    lib/index.js:71
    renameSync(tmp, store.file)
  • 发起网络请求
    lib/client.js:83
    const res = await fetch(ROUTE + path, {
  • 发起网络请求
    lib/client.js:125
    fetch(ROUTE + '/shutdown', { method: 'POST' }).catch(() => { });
  • 发起网络请求
    lib/scraper.js:67
    const res = await fetch(url, {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 每日推送三篇论文
  • 附论文摘要
  • 拉取最新论文

用于拉取nature中最新的论文(默认生化信息)。最初的想法来源于想要一个实时推送论文的应用来辅助我日常的学习,受deepseek harness“一切皆插件”理念的启发,我打算vibecoding出一个插件,顺便开源。

README

由 DeepSeek 最新模型翻译生成
dsh-nature-papers DSH Web 插件,实时抓取 nature.com 上关于 AI for biology — 生命科学中的深度学习 / 机器学习(计算优先) 的最新论文,以 期刊影响因子(IF)作为首要质量排序标准 排名,每天在页面 右下角 的悬浮面板里展示 3 篇论文 —— 附原文直达链接、期刊 IF 和内容摘要。每日推荐按日期(年-月-日)归档,之后可以随时回看。面板底部还提供一键 Exit Harness 操作。 本文是完整的技术实现指南(开源文档):架构、各功能的实现细节、Nature 反爬自动降级机制、数据格式和 API 契约。 目录 1. 功能概览 2. 目录结构 3. 架构:DSH 插件模型 4. 功能实现细节 - 4.1 实时抓取(nature.com 搜索页) - 4.2 Nature 反爬自动降级(Client Challenge → PubMed) - 4.3 影响因子优先排序 - 4.4 内容摘要(摘要抓取链路) - 4.5 每天 3 篇与缓存 - 4.6 历史记录与去重 - 4.7 实时刷新 - 4.8 右下角面板(客户端) - 4.9 Exit Harness 5. HTTP API 契约 6. 配置 7. 存储格式 8. 限流、容错与反爬措施 9. 已知限制 10. 运维:安装 / 更新 / 启动 / 停止 / 卸载
展开完整文档(README 剩余 1 节)
dsh-nature-papers

DSH Web 插件,实时抓取 nature.com 上关于 AI for biology — 生命科学中的深度学习 / 机器学习(计算优先) 的最新论文,以 期刊影响因子(IF)作为首要质量排序标准 排名,每天在页面 右下角 的悬浮面板里展示 3 篇论文 —— 附原文直达链接、期刊 IF 和内容摘要。每日推荐按日期(年-月-日)归档,之后可以随时回看。面板底部还提供一键 Exit Harness 操作。

本文是完整的技术实现指南(开源文档):架构、各功能的实现细节、Nature 反爬自动降级机制、数据格式和 API 契约。

目录

1. 功能概览
2. 目录结构
3. 架构:DSH 插件模型
4. 功能实现细节
- 4.1 实时抓取(nature.com 搜索页)
- 4.2 Nature 反爬自动降级(Client Challenge → PubMed)
- 4.3 影响因子优先排序
- 4.4 内容摘要(摘要抓取链路)
- 4.5 每天 3 篇与缓存
- 4.6 历史记录与去重
- 4.7 实时刷新
- 4.8 右下角面板(客户端)
- 4.9 Exit Harness
5. HTTP API 契约
6. 配置
7. 存储格式
8. 限流、容错与反爬措施
9. 已知限制
10. 运维:安装 / 更新 / 启动 / 停止 / 卸载

功能概览

- 🧬 每天 3 篇:每天自动更新(跨天重新抓取);当天内走缓存,不会闪烁。
- 🏆 影响因子优先:内置约 90 种期刊的近似 JCR 影响因子参考表;候选按「IF 降序 → 发表日期降序」排序,每张卡片显示 IF x.x。
- 🔗 直达链接:点击标题在新标签页打开 nature.com 原文,另附 DOI 链接。
- 📄 内容摘要:优先取文章页 Abstract,取不到就退回搜索页摘录;可展开 / 收起。
- 📜 历史记录:按 YYYY-MM-DD 归档,每条记录在日期旁显示 主题(学科类型)(默认「AI 生化信息」;自由搜索以查询词作为主题),可展开回看任意一天。
- 🔍 自由搜索:在面板搜索框输入任意查询词,实时抓取 Nature(不限于默认主题);结果以查询词为主题记入历史,不影响每日默认推荐。
- 🔄 实时刷新:点击按钮立即重新抓取并重新挑选(优先选之前从未推荐过的论文)。
- ⏻ 退出 Harness:经过两步确认后,优雅关闭 DSH 服务器进程。
- 🛡 反爬自动回退:当 nature.com 返回 Client Challenge 时,插件自动切换到 PubMed E-utilities 镜像(仍限定在 Nature Portfolio 期刊范围内;链接仍指向 nature.com)。

目录结构

nature-papers/
├── package.json # package manifest: dsh.client metadata, exports map
├── README.md # English documentation (this file)
├── README_zh.md # Chinese documentation
├── LICENSE # MIT license
├── .gitignore
├── install.ps1 # install/update/uninstall script
├── start-dsh.ps1 # start dsh web script
├── stop-dsh.ps1 # stop dsh web script
├── restart-dsh.ps1 # restart dsh web script
├── test-scraper.mjs # standalone scraper-core test
└── lib/
├── index.js # host side (Cordis plugin): routes / storage / daily scheduler / exit
├── scraper.js # scraping core (pure Node, testable standalone): dual sources, parsing, ranking
├── if-data.js # journal impact-factor reference table + name normalization
└── client.js # browser bundle: bottom-right panel (shell.overlay slot)

配套脚本放在仓库根目录(下面的命令都在该目录下运行):

| 脚本 | 用途 |
| install.ps1 | 把代码同步到安装目录,并写入 cordis.patch.yml 条目(支持 -Uninstall) |
| start-dsh.ps1 | 在后台启动 dsh web(隐藏窗口,日志写入磁盘) |
| stop-dsh.ps1 | 按监听端口精确停止 dsh web 进程 |
| restart-dsh.ps1 | 杀掉旧进程 → 确认端口空闲 → 启动新进程 → 自检插件 |
| test-scraper.mjs | 独立测试抓取核心(不依赖 Cordis) |

架构:DSH 插件模型

DSH Web 是一棵 Cordis 插件树:web 配置档的空根配置 cordis.yml 由多个补丁层组合而成(@deepseek-ai/dsh-base、@deepseek-ai/dsh-web-app 两个 bundle 层 + 用户层 cordis.patch.yml)。挂载插件 = 往组合后的树里插入一条 loader 条目,让它被导入并激活。

挂载链路(宿主侧)

1. 放置包:把这个目录复制到 $DSH_HOME\profiles\node_modules\dsh-nature-papers(真实目录)。DSH 服务器解析裸 Node 模块说明符时,会从配置档目录逐级向上查找,所以 import('dsh-nature-papers') 和它的依赖 @deepseek-ai/schemastery 都能解析到。
2. 注册条目:写入 cordis.patch.yml(由 install.ps1 自动维护):

- insert:
- id: nature-papers
name: dsh-nature-papers
config:
query: 'deep learning biology'
count: 3
requestDelayMs: 1000yaml
storageFile: !!js dshHomePath('storages/nature-papers.json')

insert 补丁把条目追加到组合后的树里;!!js 表达式在条目激活时求值(求值作用域由 boot() 注入 dshHomePath)。

3. 激活:加载器按名称 import() 模块 → unwrapExports 取出默认导出 { name, inject, Config, apply } → Cordis 解析 inject: ['webServer'](等待服务就绪)→ 用 schemastery 的 Config 校验配置 → 运行 apply(ctx, config):注册 5 条 HTTP 路由,加载并持久化历史存储,启动每日滚动定时器。条目停止或更新时,ctx.effect 里的清理函数会注销路由并清理定时器。

挂载链路(客户端)

lib/client.js 是浏览器 bundle,通过包里的 dsh.client 声明(platform: web)和 exports["./client"] 识别:

1. dsh-client-modules(宿主侧)扫描加载器条目,找出声明了 dsh.client 的包 → 把 bundle 内容哈希进 window.__DSH_BOOT__ 清单 → 在 /plugins/dsh-nature-papers/client.js 提供访问。
2. 页面加载时,shell 读取 __DSH_BOOT__ → 加载 bundle 脚本 → bundle 调用 window.__ModuleLoader__.load({ id, factory }) 注册 factory(懒加载 CJS:注册 ≠ 执行)。
3. Cordis 客户端加载器物化 factory(factory(require),其中 require('react') 可用)→ 得到插件对象 { name, inject: ['slots'], apply }。
4. apply() 通过 ctx.slots.inject('shell.overlay', ...) 把面板组件注册进 shell.overlay 插槽 —— 该插槽由 ui-layout 的 AppFrame 覆盖层渲染(position:absolute; inset:0),面板用 position:absolute; right:16px; bottom:16px 定位 —— 也就是页面右下角。

数据流

Browser panel ──fetch──▶ /plugins/dsh-nature-papers/* ──▶ host routes
│
┌─────────────┴──────────────┐
Source A: nature.com search Source B: PubMed E-utilities
└─────────────┬──────────────┘
▼
IF ranking → de-dup → abstract enrichment
▼
$DSH_HOME/storages/nature-papers.json

功能实现细节

4.1 实时抓取(nature.com 搜索页)

请求构造(scrapeNatureSearch):

- URL:https://www.nature.com/search?q=<query>&order=date_desc,其中 query 是空格分隔的关键词(AND 语义),默认 deep learning biology(AI × 生物学方向)。
- 分页:最多 3 页(&page=2/3);某页返回少于 10 行,或达到候选上限(maxCandidates,默认 90)时提前停止;页与页之间用 requestDelayMs 控制间隔。
- 请求头:浏览器 UA + accept: text/html,...;超时用 requestTimeoutMs;失败重试一次(退避 1.2s)。

行解析:按 切分每条结果,再用正则提取字段:

| 字段 | 锚点 | 说明 |
| 标题 | …<a href="/articles/<id>"> | 去掉标签,解码实体 |
| 链接 | href="(/articles/[a-zA-Z0-9-]+)" | 拼成 https://www.nature.com/articles/<id> |
| 类型 | data-test="article.type">… | 命中黑名单时丢弃(news/comment/editorial/news & views/…) |
| 期刊 | data-test="journal-title-and-link"> | 纯文本 |
| 日期 | | ISO 日期,用作次级排序键 |
| 摘要片段 | data-test="article-description">…… | 搜索页自带的 1–2 句概述(兜底用) |
| 开放获取 | 行内含 u-color-open-access | 布尔标记 |
| DOI | 由文章 id 推导:/^s\d+-\d+/ → 10.1038/<id> | 其他格式(如 BMC 期刊)为 null |

4.2 Nature 反爬自动降级(Client Challenge → PubMed)

背景:对不执行脚本的爬虫,nature.com 会返回 JavaScript 校验页(「Client Challenge」,约 3 KB HTML,内含 loadScript 例程);纯 HTTP 客户端过不了这一关(必须真实浏览器执行 JS 才能拿到 cookie)。

检测(两处):

- 搜索页:html.includes('Client Challenge') || !html.includes('app-article-list-row') → 抛出 nature.com 触发了反爬校验(Client Challenge),已切换备用源(nature.com served a Client Challenge; switched to the fallback source)。
- 文章页:命中 Client Challenge 时,该论文摘要视为不可用,返回 null,改用摘要片段兜底。

降级流程(generateEntry):

1. 先试源 A(实时抓取 nature.com);
2. 出错时自动切到源 B(PubMed E-utilities),不打断用户请求;
3. 源 B 查询构造:

- esearch:term = ("Nature"[ta] OR "Nature Communications"[ta] OR …) AND ("deep learning"[tiab] OR "machine learning"[tiab] OR "artificial intelligence"[tiab] OR "neural network"[tiab] OR "large language model"[tiab] OR "foundation model"[tiab] OR bioinformatics[tiab] OR "computational biology"[tiab]),配 sort=date&retmax=90 —— [ta] 期刊字段把检索锁定在约 55 种 Nature Portfolio 期刊,[tiab] 主题词保证话题相关(AI 方法优先,生物应用其次);
- esummary:一次调用取回全部命中(最多 90 条)的标题、期刊全名、发表日期和 DOI;
- 新闻过滤:Nature 新闻条目的 DOI 形如 10.1038/d41586-…;凡 doi.startsWith('10.1038/d4') 的行一律丢弃——只保留研究型论文;
- 链接还原:带 10.1038/ 前缀的 DOI 映射回 https://www.nature.com/articles/<suffix>(链接仍指向 nature.com);其他前缀走 https://doi.org/<doi>;
- 摘要:对排名前 count2 的 PMID 发起一次批量 efetch(retmode=xml&rettype=abstract);把 XML 按 <PubmedArticle> 块切分,提取 <ArticleTitle> / <AbstractText>(多个分段拼接)/ <Journal> / <PubDate> / <ELocationID EIdType="doi">。

4. 面板会标注这批数据的来源(「来源:Nature 实时」/「来源:PubMed 镜像」——Source: Nature live / Source: PubMed mirror),并在响应里给出切换原因(sourceError),显示在面板顶部的提示条中。

主动反爬措施:浏览器 UA、请求延迟(默认 1.5 s)、单请求超时、带退避的重试、页数上限、仅在摘录不够时才抓取文章页(减少请求数),以及当日缓存(一天内不重复抓取)。

4.3 影响因子优先排序

数据(if-data.js):约 90 种期刊的 JCR 影响因子近似值(大多为 2023 年发布)——覆盖 Nature(旗舰刊)、Nature 研究期刊、Nature Reviews 系列、npj 系列,以及托管在 nature.com 上的高 IF Springer Nature/BMC 期刊(Signal Transduction and Targeted Therapy 40.8、Cell Research 28.1、Molecular Cancer 27.7、Genome Biology 10 等)。

名称归一化:lowercase → strip non-alphanumerics (including "&" and spaces) → strip a leading "the"。这样 nature.com 的 Communications Biology 和 PubMed 的 Nature reviews. Molecular cell biology 都能命中同一条表项。

排序规则(rankRows): js
sort((a, b) =>
(b.journalIf - a.journalIf) || // ① IF descending ("impact factor first")
b.pubDate.localeCompare(a.pubDate) || // ② same IF: newest publication first
a.title.localeCompare(b.title)) // ③ stable tiebreak

不在表里的期刊 IF 记为 0(排在所有已知期刊之后);未知时卡片显示 IF —。这些数字仅用于排序和展示,不是授权数据。

4.4 内容摘要(摘要抓取链路)

- 来源 A:先用搜索页摘录;只有当摘录缺失或短于 60 个字符时,才抓取文章页的 Abstract——定位 id="Abs1-content" 开标签之后的内容,截到 之前,再 stripTags 并压缩空白;结果短于 40 个字符视为无效。抓取串行进行,按 requestDelayMs 间隔(礼貌限速)。
- 来源 B:一次 efetch 返回排名靠前候选的完整摘要(PubMed 摘要覆盖率约 100%)。
- 最终兜底:abstract || snippet || '(暂无简介,请点击标题查看原文)'(无摘要可用;点击标题阅读原文)。
- 客户端会把超过 140 字符的摘要截断成三行,并带一个「展开/收起」开关。

4.5 每天三篇论文与缓存

- 存储:单个 JSON 文件(config.storageFile,默认 $DSH_HOME/storages/nature-papers.json);见 存储格式。写入是原子的(先写 .tmp 再重命名);文件损坏时重命名为 .bak 并重建。
- 生成触发时机:
1. 当天第一次请求 GET /today(懒生成,包含实时抓取);
2. 每日滚动定时器(每 30 分钟检查一次本地日期是否变化;新的一天还没有数据时,在后台预生成);
3. 用户点击「刷新」(强制生成)。
- 幂等性:一天之内,/today 始终返回当天的条目(优先读缓存)——页面重新加载不会闪烁;到第二天自动轮换。
- 并发合并:state.generating 持有进行中的生成 promise,并发请求共用一次生成,不会重复抓取。

4.6 历史与去重

- 每次生成成功后,条目插入历史头部(日期降序,再按主题排序);同一天同主题的条目会被替换;上限为 historyCap(400 天)。
- 每条记录都带一个 subject(学科类型):每日默认使用配置的 subject(默认「AI 生化信息」);自由搜索用查询词本身作为 subject。客户端把 subject 标签显示在日期旁边。
- 去重(同一篇论文绝不推荐两次):只作用于每日默认挑选;候选池会过滤掉历史中已推荐过的所有 URL;如果剩余不足 count 篇,放宽为只排除最近 30 天;仍不够就允许重复(取当前最优)。自由搜索跳过去重(按需结果,时效优先)。
- 客户端「历史」视图按日期分组条目(同一天多个 subject 各占一行);点击某一行展开当天的卡片(TOP 序号、期刊、IF、标题链接、摘要)。

4.7 实时刷新

- POST /refresh → generate(force=true):立即重新抓取,并把当天已有条目也计为已看过(轮换出一批新的)。
- 失败时返回 502 { ok:false, error };客户端显示错误并给出重试按钮。

4.8 自由搜索

- 面板的搜索框发送 POST /search { query };宿主用该查询词实时抓取(优先 nature.com,回退 PubMed),不做去重;subject = query 记入历史(显示在日期旁边)。
- query 会去除首尾空白并限制在 200 字符以内;空查询返回 400。
- 搜索结果在当前视图显示,不替换每日默认(「刷新」会回到默认 subject)。

4.9 右下角面板(客户端侧)

- 挂载:shell.overlay 插槽(list 类型,root 作用域),注册 id nature-papers,order: 100。
- 状态机:collapsed(收成一颗药丸,记在 localStorage)/ view(today ↔ history)/ loading / error / entry / history / expanded(展开摘要)/ exitState(退出确认)/ searchQuery + searching(自由搜索)。
- 每日自愈:窗口 focus 事件加 10 分钟一次的定时检查,判断「本地日期 ≠ 面板日期」→ 自动重新拉取 /today。
- 样式:使用应用主题的 CSS 变量(--dsw-alias-)并带兜底值,适配浅色/深色模式;样式通过 注入,插件被移除时由 HMR 机制清理。

4.10 退出 Harness

- 宿主侧:POST /shutdown → 先返回 200 {ok:true}(好让面板显示最终状态),200 ms 后调用启动器注入的 appExit 服务(ctx.get('appExit')),由它执行优雅关闭流程:销毁插件树、关闭 HTTP 服务器、退出进程;appExit 不可用时回退到 process.exit(0)。
- 客户端:页脚按钮「⏻ 退出 Harness」→ 第一次点击进入「⚠ 确认退出?」(4 秒内未确认自动复位)→ 第二次点击 POST /shutdown,并显示「正在退出…」。

HTTP API 契约

统一前缀 /plugins/dsh-nature-papers;响应格式为 { ok: boolean, data?: any, error?: string }。

| 方法 | 路径 | 说明 | 错误码 |
| GET | /today | 今日精选(当天首次请求会触发实时抓取) | 502 上游失败;405 方法错误 |
| GET | /history | 完整历史(日期降序;每条记录都带自己的 subject) | 405 |
| POST | /refresh | 强制重新抓取并重新挑选今日精选 | 502;405 |
| POST | /search | 自由搜索:body { query },subject 取 query,不去重 | 400 query 为空/body 格式错误;502;405 |
| GET | /info | 运行时状态:日期、默认 subject、历史天数、来源、上次生成时间、上次错误 | 405 |
| POST | /shutdown | 优雅关闭服务器进程 | 405 |

/today 响应示例: json { "ok": true,
"data": {
"date": "2026-08-14",
"papers": [
{
"rank": 1,
"title": "Acquired resistance to the RAS(ON) multi-selective inhibitor …", "url": "https://www.nature.com/articles/s41591-026-04537-w", "journal": "Nature Medicine", "journalIf": 58.7, "journalIfKnown": true, "pubDate": "2026-08-11", "doi": "10.1038/s41591-026-04537-w", "summary": "Circulating tumor DNA analyses in 44 patients …", "openAccess": true, "source": "nature" } ], "sourceError": null } }

配置

| 字段 | 默认值 | 说明 |
| query | deep learning biology | 每日默认搜索关键词(空格表示 AND;即 AI × 生物学方向) |
| subject | AI 生化信息 | 每日默认精选的 subject(学科类型),在历史里显示在日期旁边 |
| count | 3 | 每天论文数(1–10) |
| storageFile | $DSH_HOME/storages/nature-papers.json | 历史记录存储路径 |
| requestDelayMs | 1500 | 抓取间隔(限流) |
| requestTimeoutMs | 25000 | 单次请求超时 |
| maxCandidates | 90 | 候选池大小(按 IF 取最近 N 篇最优论文) |
| historyCap | 400 | 历史记录保留天数 |

存储格式 json {
"history": [
{
"date": "2026-08-14",
"subject": "AI 生化信息", "query": "deep learning biology",
"papers": [
{
"rank": 1,
"title": "…", "url": "https://www.nature.com/articles/…", "journal": "Nature Medicine", "journalIf": 58.7, "journalIfKnown": true, "pubDate": "2026-08-11", "doi": "10.1038/…", "summary": "…", "openAccess": true, "source": "nature" } ] } ] }

同一天可以存多条记录(每日默认推送,加上任意次自由搜索),用 date + subject 区分;自由搜索的 subject 就是查询词本身。

限流、容错与反爬措施

| 机制 | 实现 |
| 请求延迟 | 翻页与抓取文章页之间插入 requestDelayMs |
| 超时 | 每次请求用 AbortSignal.timeout(requestTimeoutMs) |
| 重试 | 网络失败重试一次,退避 1.2 s |
| 反爬检测 | Client Challenge 标记字符串 + 结果行缺失(双重检查) |
| 双源故障转移 | nature.com 失败 → PubMed;两者都失败 → 返回 502 并附明确错误信息 |
| 请求量控制 | 当天缓存;摘要不够时才抓文章页;PubMed 摘要用一次批量 efetch 取回 |
| 存储安全 | 原子写入(tmp + rename);文件损坏时通过 .bak 自动重建 |
| 并发 | 生成 Promise 合并(共享进行中的请求) |
| 生命周期 | 所有路由/定时器都在 ctx.effect 内注册;卸载时自动清理 |

已知限制

- 影响因子是近似的 JCR 参考值(多为 2023 年发布),只用于排序和展示,不是授权数据;数值会随时间过时。
- nature.com 对高频访问可能返回 Client Challenge;此时插件自动改用 PubMed 镜像(见 4.2),并在面板上标注来源。
- 端点只暴露在回环地址上,没有鉴权(与 DSH 其他 /plugins 路由一致)。
- 代码热重载有限:cordis.patch.yml 由 watchUserPatches 监听,但这个监听器实际并不可靠(BOM 编码、文件删除、chokidar 精确文件监听失效都会让它停止响应),所以插件代码改动(lib/.js)需要重启 dsh web(见下方运维部分);入口级配置改动也建议重启,稳妥一些。
面板是固定定位的浮层(不可拖动);它与其他 shell.overlay 注册项按注册顺序堆叠。

操作:安装 / 更新 / 启动 / 停止 / 卸载

在仓库根目录下运行下面的命令(powershell -ExecutionPolicy Bypass -File .\xxx.ps1)。
脚本会自动解析 $DSH_HOME(先读环境变量,读不到就回退到 ~/.dsh);dsh 启动器自动探测(PATH 或 npx 缓存,可用 -DshBin 固定);端口默认 3080,可用 -Port 配置。没有硬编码任何机器相关的路径。
powershell

Install / update (syncs code + writes the patch entry; falls back to in-place

overwrite when the server is running and the directory is locked)

powershell -ExecutionPolicy Bypass -File .\install.ps1

Uninstall

powershell -ExecutionPolicy Bypass -File .\install.ps1 -Uninstall

Start / stop (a restart is required for code changes to take effect)

powershell -ExecutionPolicy Bypass -File .\stop-dsh.ps1
powershell -ExecutionPolicy Bypass -File .\start-dsh.ps1
powershell -ExecutionPolicy Bypass -File .\restart-dsh.ps1 # kill old → confirm port → start new → self-check

The panel's "⏻ 退出 Harness" is equivalent to stop-dsh.ps1 (graceful exit)

诊断:$DSH_HOME\restart-result.txt(重启自检)、$DSH_HOME\web-server.log / web-server.err.log(服务器日志)、GET /plugins/dsh-nature-papers/info(运行时状态)。

开发提示:抓取核心 scraper.js 不依赖 Cordis,可以直接用 node test-scraper.mjs 单独验证;改完 lib/ 后,运行 install.ps1 并重启。
预览分享卡片长什么样 ↓666489/dsh-nature-papers
分享 · DeepSeek Harness Hub
666489/dsh-nature-papers

每日推送三篇 Nature 高分论文并附摘要

这是你的仓库?认领条目

回到顶部