Pular para o conteúdo principal
H

dsh-rss-monitor

hgl011091/dsh-rss-monitor

Native RSS monitor for DeepSeek Harness: multi-source subscription, keyword filtering, scheduled polling with smart dedup, and email notifications for new items (HTML template with thumbnail cards), with SMTP passwords stored only in the credential store.

Instalar

dsh plugin --profile web add github:hgl011091/dsh-rss-monitor

README

📰 dsh-rss-monitor

DeepSeek Harness 原生 RSS 订阅监控插件 —— 定时检查、关键词过滤、新条目邮件通知,原生设置页体验

多源订阅 · 关键词过滤 · 智能去重 · HTML 邮件通知 · 凭据安全存储

DSH Plugin Node Tests License


✅ 功能特点

功能说明
📰多源订阅RSS 2.0 / Atom 均支持;添加前可"测试连接",预览标题与最新条目
🔳关键词过滤每源独立的"包含/排除"关键词(匹配标题与摘要),多个关键词逗号分隔
定时检查间隔 1–1440 分钟可调(默认 5 分钟);顶部开关启停监控;随时手动"立检检查"
🔄智能去重md5(feedUrl|guid||link||title) 前 16 位作为稳定 id,环形窗口上 1000 条
📧邮件通知SMTP(SSL 465 等),精美 HTML 模板带缩略图卡片,3s/4s 指数退避重试,可发测试邮件
🧩原生设置页通过 slots 注入 Harness 设置界面:概览 / RSS 源 / 邮件通知 / 运行设置 四个标签,中英双语
🛳概览面板运行状态、上次/下次检查、最新发现(缩略图原比例、标题可点击)、检查历史(手动/自动、新条目数、错误)
🎨显示条数可调"最新发现"与"检查历史"各 1–100 行自行设置,已记录条目始终显示真实总数
🖧自动刷新设置页每 15 秒拉取状态,数据无变化不重渲染,窗口外后台自动暂停轮询
🔐凭据安全SMTP 密码只存 Harness 凭据库(DSH_RSS_SMTP_PASS_*),配置文件中仅存引用 passRef,界面与磁盘均不见明文
🆕🗓️ 时间窗口自定义每周定时监控——按星期 + 时间段触发

🆕 v0.2.9 兼容性修复

本版本修掉了两个让设置页完全不可用的传输层问题(症状:加载报 cannot get property "webServer" without inject,或点任何按钮报 transport failure for /dsh-rss-monitor/<端点>: HTTP 405):

  • RPC 挂载方式重构 — 不再用插件自定义通道 connection.rpc.handle('/dsh-rss-monitor', …),改为在共享 /api 通道下按端点注册精确 Fetch 路由(/api/dsh-rss-monitor.<端点>,共 11 条)。原因有三:
    1. 注册自定义通道会在 dsh-client-connection 内部触及 webServer 服务;桌面端加载器直接应用条目、忽略模块级 inject 声明,所以服务未就绪时直接加载失败;
    2. 当前桌面版本上,发往插件自定义通道的浏览器请求可能落进静态前端兜底(对 POST 一律回 405);
    3. connection.fetch.register 完全不依赖 webServer,没有任何启动时序竞争;精确路由优先于内置网关拦截器,且与其它设置页共用同一套浏览器认证围栏。
  • 客户端同步 — 浏览器端改用 connection.rpc.call('/api', 'dsh-rss-monitor.<端点>', …),与其它正常工作的设置标签页走同一条传输。
  • 宿主版本声明peerDependencies 补充 @deepseek-ai/dsh-host-webserver 兼容版本(含 0.1.5-rc.1),商店的宿主要求检查不再告警。

宿主要求(v0.2.10 起精确声明)engines.dsh >= 0.1.2-rc.1——DSH Desktop 2.0.9(内嵌 host 0.1.5-rc.1)实测可用。0.1.2-rc.1 是 dsh-client-connection 引入 Fetch 路由 API(本插件传输层所依赖、同时移除 rpc.handle)的版本,经 npm 逐版本核实;更老的 0.1.0/0.1.1 线宿主无法运行,市场会在安装前直接拦截。另注:市场侧的清单事实有 24 小时缓存(profiles\desktop\.dsh-market\discovery-compatibility-v1.json),发布新版本后若商店显示未刷新,删除该缓存文件并重启 DSH 即可。

升级提示:从 ≤0.2.8 升级请先完全退出 DSH Desktop 再安装,重启后强刷页面(Ctrl+Shift+R)。

🆕 v0.2.0 新增

  • 🗓️ 时间区间(按星期 + 时间段) — 自由勾选星期、设置开始/结束时间,仅在窗口期内执行 RSS 检查与邮件通知
  • ⏯ 跨午夜支持 — 22:00-06:00 这类跨天窗口自动正确处理
  • 🪟 窗口状态实时显示 — UI 上直观显示"窗口内 / 窗口外 / 未启用"
  • 💾 单次保存 — 把"运行设置"的所有字段合并为一个保存按钮
  • 🎛 移出方框的保存按钮 — 时间区间的保存按钮在方框外、右对齐
  • 🌐 移除时区选择器 — 时区统一跟随系统时区
  • ⚡ 5 轮性能优化 — rpcCall 稳定身份、5 个 React.memo、i18n Map 缓存、Fingerprint 差异比对、Slim lastKnownStatus、ConfigStore/StateStore snapshot 缓存、Controller.status() memo 化

🖼 界面预览

📥 安装

先选对你的客户端。 DSH 有两种发行版:

客户端长什么样插件如何被发现
DSH Webdsh web,Node 套)浏览器打开 localhost:9191启动时官方 boot 组合自动发现已安装的 dsh.bundle 插件
DSH DesktopDSH Desktop.exe,Electron 桌面端)系统托盘的窗口重启时官方 boot 组合 + 内置 dshmarket 的 shim-mount 完成发现

两种客户端都提供官方 dsh plugin 命令(desktop 上是 desktop-cli.js,内部把参数转发给 profile 目录里的 pnpm)。安装前先完全退出 DSH Desktop(托盘 → 退出)—— Windows 中 DSH 运行时持有的文件锁会让 pnpm 改名失败。

选哪条路径:

你的情况路径网络要求
本包已发到 npm(v0.2.0 起),任何网络方式一(推荐)npm registry(国内可达)
能直连 GitHub(境外、有代理)方式二codeload.github.com
想用预构建包、不想等 npm方式三github.com Releases
离线 / 开发联调 / 发布前的脚底方式四无(本地 clone)

方式一:npm 安装(推荐;Web / Desktop 通用)

前提:本包已发布到 npm(发布步骤见 PUBLISH.md)。

# DSH Desktop(务必带 @精确版本 + --save-exact,见下方 ⚠)
dsh plugin --profile desktop add -wE "dsh-rss-monitor@0.2.10"

# DSH Web
dsh plugin --profile web add dsh-rss-monitor

完成后启动 DSH Desktop(或刷新 dsh web 页面),设置 → "RSS 监控"。

⚠️ Desktop 专属坑:依赖必须是精确版本。 桌面端的 bundle 加载器只解析 dsh.profile.bundles精确版本的 profile 依赖:pnpm 默认写入的 ^0.2.9 范围值会被静默跳过——装完、重启都不生效,且无任何报错。所以请:

  1. 安装时带 @0.2.9 并加 -E--save-exact);
  2. 装完自查:打开 %USERPROFILE%\.dsh\profiles\desktop\package.jsondependencies 里应是 "dsh-rss-monitor": "0.2.10"没有 ^),且 dsh.profile.bundles 数组里含 "dsh-rss-monitor"
  3. 若版本带 ^,用 pnpm remove -w dsh-rss-monitorpnpm add -wE "dsh-rss-monitor@0.2.10" 重装(需先完全退出 DSH)。

方式二:GitHub 源安装(需直连 GitHub)

dsh plugin --profile desktop add -w github:hgl011091/dsh-rss-monitor

原理:pnpm 从 codeload.github.com 拉取源码 tarball。中国大陆网络实测连不上 codeload(连接被重置) —— 会卡在 fetch 超时或直接失败,届时请改用方式一或方式四。装完请按方式一的 ⚠️ 自查 manifest(Desktop 只认精确版本/路径型 spec)。

方式三:GitHub Release 预构建 tarball

dsh plugin --profile desktop add -w "https://github.com/hgl011091/dsh-rss-monitor/releases/latest/download/dsh-rss-monitor.tgz"

Release 资产在国内的可达性通常好于 codeload,但同样不保证。装完请按方式一的 ⚠️ 自查 manifest。

方式四:本地克隆 + link(离线 / 开发联调 / 发布前脚底)

# 1. 克隆(目录随意;lib/ 构建产物已自包含,无需 npm install)
git clone https://github.com/hgl011091/dsh-rss-monitor.git D:\plugins\dsh-rss-monitor

# 2. 完全退出 DSH Desktop(系统托盘 → 退出;或任务管理器结束所有 DSH Desktop.exe)

# 3. 官方 CLI 安装(内部转发给 profile 里的 pnpm,自动建 junction + 改 manifest)
dsh plugin --profile desktop add -w "link:D:\plugins\dsh-rss-monitor"

# 4. 启动 DSH Desktop → 设置 → "RSS 监控"

升级与卸载:

# 升级(拉新代码后重启 DSH Desktop 即可,junction 指向的是目录本身)
git -C D:\plugins\dsh-rss-monitor pull

# 卸载
dsh plugin --profile desktop remove dsh-rss-monitor

自动化脚本(做齐健康检查 + 清残留 + 退出 DSH + 安装):

irm https://raw.githubusercontent.com/hgl011091/dsh-rss-monitor/main/install-dsh-desktop.ps1 -OutFile install.ps1
.\install.ps1 -PluginPath D:\plugins\dsh-rss-monitor

⚠️ 三条实测教训(都踩过):

  1. 占位路径必须替换。 黏贴 /path/to/... 的话,pnpm 解析失败也会把依赖写到 profile 的 package.json(pnpm 在完成前就落盘),留下一行 link:/path/to/... 并显示"已安装,未生效。"的就是它。清除方法:dsh plugin --profile desktop remove dsh-rss-monitor 或手工删掉那一行。
  2. 脚本改 package.json 必须用 -Encoding utf8NoBOM Windows PowerShell 5.1 的 -Encoding UTF8 写出带 BOM 的文件,DSH 的 JSON.parse 直接拒绝 → DSH Desktop 整个无法启动(报 Unexpected token '锘?)。最好根本别手工改 manifest,交给 pnpm。
  3. 只建 junction 不够。 不改 manifest、不产生"新增"事件,DSH 的 hot-mount 监视器不会挂载它 —— 必须走 dsh plugin add / pnpm add
故障排查:设置页没有"RSS 监控"?
# 1. 看 DSH Desktop 是否真加载了 host 端
Get-Content "$env:APPDATA\DSH Desktop\logs\dsh-$(Get-Date -Format yyyy-MM-dd).log" |
  Select-String "dsh-rss-monitor" | Select-Object -Last 5
# 期望看到 [dsh-rss-monitor-host] monitor restored, interval 5 min
# → 有 = host 正常;没 = junction 没建好,回到第二步

# 2. 看 DSH profile manifest 是不是真的记录了 rss-monitor
Get-Content "$env:USERPROFILE\.dsh\profiles\desktop\package.json" -Raw |
  ConvertFrom-Json | Select-Object -ExpandProperty dependencies
# 期望看到 dsh-rss-monitor: link:D:\plugins\dsh-rss-monitor

# 3. 看 cordis.yml 有没有 include 该
Get-Content "$env:USERPROFILE\.dsh\profiles\desktop\cordis.yml" -Raw
# 应该是带 - id: dsh-rss-monitor 的列表;空就说明 hot-mount 监视器没跑(或之前 boot 失败过)
# 手动补一条也行(DSH 下次启动会合并进 bundle):
@'
- insert:
    - id: dsh-rss-monitor
      name: dsh-rss-monitor
'@ | Set-Content "$env:USERPROFILE\.dsh\profiles\desktop\cordis.patch.yml" -Encoding utf8NoBOM
# 然后再次重启 DSH Desktop

🕹 使用

  1. RSS 源 → "+ 添加 RSS 源",填名称与 URL,可选关键词过滤,先"测试连接"再保存
  2. 邮件通知 → 填 SMTP 主机/端口/账号/密码/收件人,保存后"发送测试邮件"验证(各大邮箱需使用授权码)
  3. 运行设置 → 调整检查间隔与"最新发现 / 检查历史"显示条数;顶部开关启停监控
  4. 概览 → 查看运行状态、最新发现的最新条目与检查历史;支持一键清除(带确认弹框)

🗓️ 时间窗口 (v0.2.0+)

在"运行设置"中可启用"时间区间"功能:

  • 按星期选择:周日~周六任意勾选(不勾选任何天 = 每天)
  • 开始 / 结束时间:设置每天的检查窗口(如 09:0023:00
  • 跨午夜:22:00-06:00 这类跨天窗口自动正确处理
  • 窗口内自动检查:只有在窗口期内,定时器才会真正拉取 RSS;窗口外自动暂停
  • 窗口外状态显示:UI 实时显示"当前在窗口内/外/未启用"

🎛 架构

dsh-rss-monitor/
├─ src/                 # Host/Client 共享层
│  ├─ protocol.mjs      #   协议单一来源:通道名、端点、限值、归一化规则
│  ├─ monitor.mjs       #   定时调度 + 有界并发检查 + 去重窗口
│  ├─ controller.mjs    #   11 个 RPC 端点的业务处理
│  ├─ config-store.mjs  #   配置存储(原子写、规范化)
│  ├─ state-store.mjs   #   运行状态存储(去重/最近/历史)
│  ├─ feed-fetcher.mjs  #   rss-parser 包装 + 缩略图提取
│  ├─ email-notifier.mjs#   nodemailer 包装(验证 + 重试)
│  ├─ schedule-window.mjs # 时间窗口判定(按星期 + 时间段)
│  └─ rpc.mjs           #   RPC 安装:共享 /api 通道下的精确 Fetch 路由(11 条)
├─ plugin-src/host/     # Host 插件入口(inject: connection, credentials) esbuild 构建
├─ plugin-src/client/   # React 设置页(slots/locale/样式/i18n) esbuild 构建
├─ lib/                 # 构建产物:index.js(Host, ESM node22)、client.js(Client, CJS)
└─ test/                # node:test 单元测试套件

🗓 License

MIT

Plugins relacionados