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

截图即存 wangzhanchao883/dsh-screenshot-capture

DeepSeek Harnessv0.2.4
wangzhanchao88332 天前有提交已提供中文文档扫描:含敏感能力

DeepSeek Harness 的指哪拍哪截图:悬浮窗拍完直接进 Obsidian 笔记,可加批注、标重点,宿主多模态模型零配置识别(可回落千问),同屏去重,按天合并,晚间 AI 整理。

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-screenshot-capture
npm 源 · dsh-screenshot-capture 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · vision
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 32 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-screenshot-capture @ 0.2.4
✓Node 引擎要求 ^22.0.0 || >=24 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/16 14:09:39

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 48 处,展示前 46 条)
  • 写入本地文件
    clipboard.mjs:39
    mkdirSync(this.workDir, { recursive: true });
  • 读取本地文件
    clipboard.mjs:40
    if (existsSync(this.logPath)) this.offset = statSync(this.logPath).size;
  • 读取本地文件
    clipboard.mjs:40
    if (existsSync(this.logPath)) this.offset = statSync(this.logPath).size;
  • 写入本地文件
    clipboard.mjs:44
    writeFileSync(cfgFile, JSON.stringify({
  • 执行外部命令来自配置/变量
    clipboard.mjs:63
    this.child = spawn(POWERSHELL, args, {
  • 执行外部命令固定命令
    clipboard.mjs:120
    const killer = spawn("taskkill", ["/PID", String(child.pid), "/T", "/F"], {
  • 读取本地文件
    clipboard.mjs:130
    if (!existsSync(this.logPath)) return;
  • 读取本地文件
    clipboard.mjs:131
    const size = statSync(this.logPath).size;
  • 读取本地文件
    clipboard.mjs:135
    const fd = readFileSync(this.logPath);
  • 读取本地文件
    config.mjs:69
    if (existsSync(configPath())) {
  • 读取本地文件
    config.mjs:70
    file = JSON.parse(readFileSync(configPath(), "utf8"));
  • 写入本地文件
    config.mjs:80
    mkdirSync(configDir(), { recursive: true });
  • 写入本地文件
    config.mjs:81
    writeFileSync(configPath(), JSON.stringify(config, null, 2), "utf8");
  • 写入本地文件
    config.mjs:105
    for (const dir of folders) mkdirSync(dir, { recursive: true });
  • 删除本地文件
    core.mjs:49
    try { unlinkSync(path); } catch { }
  • 删除本地文件
    core.mjs:57
    try { unlinkSync(path); } catch { }
  • 删除本地文件
    core.mjs:71
    try { unlinkSync(path); } catch { }
  • 写入本地文件
    core.mjs:112
    appendFileSync(PENDING_OCR_LOG, `${JSON.stringify({ at: new Date().toISOString(), ...payload })}\n`, "utf8");
  • 写入本地文件
    organize.mjs:75
    mkdirSync(join(config.vaultPath, config.knowledgeFolder, cat), { recursive: true });
  • 写入本地文件
    organize.mjs:76
    writeFileSync(notePath, body, "utf8");
  • 读取本地文件
    organize.mjs:99
    if (!existsSync(dir)) return [];
  • 读取本地文件
    organize.mjs:100
    return readdirSync(dir)
  • 读取本地文件
    organize.mjs:112
    if (existsSync(indexPath)) {
  • 读取本地文件
    organize.mjs:113
    text = readFileSync(indexPath, "utf8");
  • 写入本地文件
    organize.mjs:118
    writeFileSync(indexPath, text, "utf8");
  • 写入本地文件
    organize.mjs:123
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    organize.mjs:143
    writeFileSync(path, lines.join("\n"), "utf8");
  • 读取本地文件
    organize.mjs:149
    if (!existsSync(dir)) return [];
  • 读取本地文件
    organize.mjs:150
    return readdirSync(dir)
  • 写入本地文件
    storage.mjs:43
    writeFileSync(path, text, "utf8");
  • 写入本地文件
    storage.mjs:50
    writeFileSync(tmp, text, "utf8");
  • 写入本地文件
    storage.mjs:51
    renameSync(tmp, path);
  • 读取本地文件
    storage.mjs:71
    for (let i = 2; existsSync(dest); i += 1) {
  • 写入本地文件
    storage.mjs:75
    copyFileSync(srcPath, dest);
  • 读取本地文件
    storage.mjs:87
    if (!existsSync(path)) {
  • 写入本地文件
    storage.mjs:88
    writeFileSync(path, NOTE_HEADER.replace("{date}", date), "utf8");
  • 读取本地文件
    storage.mjs:110
    const existing = readFileSync(path, "utf8");
  • 读取本地文件
    storage.mjs:127
    if (!existsSync(path)) return { ok: false, path: null, reason: `笔记不存在(${date})` };
  • 读取本地文件
    storage.mjs:131
    const text = readFileSync(path, "utf8");
  • 读取本地文件
    storage.mjs:176
    return existsSync(path) ? readFileSync(path, "utf8") : "";
  • 写入本地文件
    storage.mjs:185
    renameSync(src, dest);
  • 读取密钥环境变量
    ocr.mjs:37
    const apiKey = config.ocr?.apiKey || process.env.DASHSCOPE_API_KEY;
  • 读取本地文件
    ocr.mjs:74
    const data = readFileSync(imagePath);
  • 读取密钥环境变量
    ocr.mjs:191
    const apiKey = config.ocr?.apiKey || process.env.DASHSCOPE_API_KEY;
  • 读取本地文件
    ocr.mjs:194
    const b64 = readFileSync(imagePath).toString("base64");
  • 发起网络请求
    ocr.mjs:203
    const res = await fetch(endpoint, {
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

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

功能亮点

  • 悬浮窗截图
  • 宿主模型OCR识别
  • 同屏去重

README

由 DeepSeek 最新模型翻译生成
dsh-screenshot-capture · 指哪拍哪(Point-and-Shoot Capture) DeepSeek Harness 插件:截屏即存 —— 监听剪贴板 → 鼠标位置弹出系统级悬浮窗【注释输入框 +「重点」复选框 + 复制截图 / 存文档 / 存图片】→ 图片 + 即时 OCR(默认走宿主自己的多模态大模型,零配置) 写入 Obsidian 按天合并笔记 → 晚间 AI 整理(点选保留 / 保存全部 → 归类 → 双链 → 当日总结 → 归档)。 一个 DeepSeek Harness(DSH)插件,可将截图(或任何复制的图片)转换为 Obsidian 笔记:鼠标旁会弹出一个系统级悬浮窗,让你添加注释 / 标记为重点,然后将图片连同即时 OCR 结果保存到按天合并的笔记中,并可选地在晚间通过 AI 整理当天的条目,包括分类、双链、总结和归档。 OCR 默认使用宿主自己的多模态模型 —— 无需额外 API key —— 并在配置了 key 时回落到通义千问 API。 v0.2.2 新增了宿主模型 OCR、ocr.hostModel 设置,以及变更日志中列出的可靠性修复。
展开完整文档(README 剩余 1 节)
dsh-screenshot-capture · 指哪拍哪(Point-and-Shoot Capture)

DeepSeek Harness 插件:截屏即存 —— 监听剪贴板 → 鼠标位置弹出系统级悬浮窗【注释输入框 +「重点」复选框 + 复制截图 / 存文档 / 存图片】→ 图片 + 即时 OCR(默认走宿主自己的多模态大模型,零配置) 写入 Obsidian 按天合并笔记 → 晚间 AI 整理(点选保留 / 保存全部 → 归类 → 双链 → 当日总结 → 归档)。

一个 DeepSeek Harness(DSH)插件,可将截图(或任何复制的图片)转换为 Obsidian 笔记:鼠标旁会弹出一个系统级悬浮窗,让你添加注释 / 标记为重点,然后将图片连同即时 OCR 结果保存到按天合并的笔记中,并可选地在晚间通过 AI 整理当天的条目,包括分类、双链、总结和归档。
OCR 默认使用宿主自己的多模态模型 —— 无需额外 API key —— 并在配置了 key 时回落到通义千问 API。
v0.2.2 新增了宿主模型 OCR、ocr.hostModel 设置,以及变更日志中列出的可靠性修复。

Awesome DSH Plugin

功能 / Features

- Windows 系统级悬浮窗:检测到新截图(或复制图片)后,在鼠标旁弹出置顶小窗,三键选择;
- 注释 / 重点标记(v0.2.0):弹窗内置注释输入框 +「重点」复选框;勾重点后该条注释以标题一 重点 写入笔记,提示这是重点;
- 存文档:图片入库 + 当天笔记立即生成,OCR 文字 1~5 秒后自动回填;
- 存图片:仅图片入库(#图片 标签);
- 即时 OCR:默认用宿主大模型(DSH 已在用的多模态模型,零配置、不用另申请 key);宿主不可用时自动回落通义千问;两条都不可用会在笔记里写明原因,不影响入库;
- 助手自愈(v0.2.2):常驻的剪贴板助手指令意外退出时,按退避自动重启(2s→30s,最多 5 次)并告警,不再"截图静默失效";
- 同一屏去重(v0.2.2):Windows 截图工具偶尔会把同一屏往剪贴板连写两遍(实测两张只差 1 像素、相隔 3 秒),助手按 32×32 灰度指纹比对,dupWindowMs(默认 6 秒)内的近似同屏只弹一次窗、只存一条;
- 回填不丢字(v0.2.2):笔记被云同步盘 / Obsidian 短暂占用时,写入按 ~4.6 秒退避重试并改走"临时文件 + 原子替换";两次仍失败会把识别结果暂存到 %TEMP%\dsh-capture\pending-ocr.jsonl 并告警;
- 晚间 AI 整理:对当天收件箱条目,点选保留/保存全部 → 归类 → 生成分类笔记 + 双链 → 当日总结 → 归档;
- Web 图形配置界面:DSH 设置 →「截图入库」,改动实时生效。

截图 / Screenshots

DSH 设置 →「截图入库」图形配置界面:

Settings

截图后鼠标旁弹出的系统级悬浮窗(注释 + 重点 + 复制截图 / 存文档 / 存图片):

Floating window

入库后的 Obsidian 按天合并笔记(含 OCR 文字):

Obsidian note

环境要求 / Requirements

- Windows(依赖系统自带 PowerShell 5.1 + WinForms)
- DSH 0.1.7+(Web 设置页依赖 configForms 服务;旧版 DSH 上 host 功能照用、设置页不出现)
- 宿主大模型 OCR:需要 DSH 已加载 llm + attachments 服务,且当前模型在目录里声明了 inputModalities: text, image 。不满足会自动回落千问
- 通义千问 API key(可选,只在回落时用到;通过 DASHSCOPE_API_KEY 环境变量,或插件配置文件)
- Obsidian 库(或任意本地 markdown 目录)

安装 / Install (DSH plugin)

从 npm 安装(若已发布)
dsh plugin --profile desktop add dsh-screenshot-capture

从 GitHub 源安装
dsh plugin --profile desktop add github:wangzhanchao883/dsh-screenshot-capture

或用本地目录(开发时)
dsh plugin --profile desktop add ./dsh-screenshot-capture

重启 DSH 后生效。剪贴板监听与悬浮窗由插件 host 端自动拉起(需要 DSH 运行中)。

首次使用请先在 DSH 设置 →「截图入库」里配置你的 Obsidian 库路径。OCR 默认就能用(走宿主模型)。
未配置 vaultPath 时采集功能会自动停用并告警。

配置 / Configuration

方式一:Web 图形界面 / Web settings (推荐) DSH Web 界面 → 侧栏 设置 → 截图入库 分区,直接改:
- 通用:启用监听、Obsidian 库路径、轮询间隔、冷却时间
- OCR:识别通道(host 宿主大模型(默认) / off 关闭)、宿主模型(留空 = 跟随 DSH 当前默认模型)
- 悬浮窗:横向/纵向偏移、预览最大宽度

面板里不再有千问配置项(v0.2.2 起):宿主模型是默认通道,千问只作为自动回落,key 从 DASHSCOPE_API_KEY 环境变量或 config.json 读取,不需要在界面上填。

改动实时生效(DSH 会热重载本插件,监听器随之重启)。配置写入 profile 的条目 config
(cordis.patch.yml 里 insert[].config),它就是权威值;config.json 只作为下面的 base 层。

⚠️ 面板里显式写过的字段会优先于 config.json。如果你只是想临时试一下,记得改回库根,否则截图会一直存到你选的目录。

方式二:配置文件 / config file (base 层)

%USERPROFILE%\.dsh-screenshot-capture\config.json

{
"enabled": true,
"vaultPath": "D:\\path\\to\\obsidian-vault",
"ocr": { "mode": "host", "hostModel": "", "model": "qwen-vl-plus", "apiKey": "" },
"pollIntervalMs": 200,
"cooldownMs": 2000,
"dupWindowMs": 6000
}

- ocr.mode 三选一:"host"(默认,宿主多模态模型)、"qwen"(通义千问)、"off"(不识别;qwen 面板里不提供,配置里仍兼容);
- ocr.hostModel 留空 = 跟随 DSH 当前默认模型;填了就用指定模型(仍需该模型声明图片输入);
- 千问 key 也可放环境变量 DASHSCOPE_API_KEY(避免明文落盘),只在 host 失败回落时用到;
- dupWindowMs = 同屏去重窗口(毫秒,默认 6000,0 关闭);面板里不提供,需要时改这里。

注意:插件默认不带库路径(为空)。未配置 vaultPath 时,采集功能会自动停用并告警,不会创建任何目录。首次使用请务必在 Web 设置 / config.json 里配置你自己的 Obsidian 库路径。

使用 / Usage

1. 开着 DSH;
2. Win+Shift+S 框选截图(或 Ctrl+C 复制任意图片);
3. 悬浮窗出现在鼠标旁:先在注释框里写注释/评论(可选),需要的话勾选「重点」,再选【复制截图 / 存文档 / 存图片】;
4. 晚上对 DSH 说"整理今天的截图",按提示选择保留条目。

连拍两张也没问题:识别较慢时请求会排队,不会出现笔记里卡在「OCR: 识别中…」。

注释与「重点」标记 / Comments & key points

- 截图时填写的注释会写入当天收件箱该条目下方;
- 勾选「重点」后,注释上方加一行标题一 # 重点 作为醒目提示;
- 晚间整理时,注释与重点标记随条目进入「知识库//」笔记的 ## 重点 小节(未勾重点的纯注释也保留);
- 点「复制截图」不写笔记,忽略输入框内容。

Obsidian 结构 / Output layout

vault/
├── 收件箱/ # 白天截图进(按天合并) │ ├── 2026-08-21.md │ └── attachments/ ├── 知识库// # 晚间整理后,按分类 │ ├── INDEX.md │ └── 20260821_1430_文档.md ├── 总结/ # 当日总结(含双链) └── 归档/ # 已整理的收件箱笔记

目录结构 / Repository layout

dsh-screenshot-capture/
├── index.mjs # host 端入口:导出 Config schema + 注册工具 + 剪贴板监听(watcher 单例、配置热重启、助手自愈) ├── core.mjs # 悬浮窗三键选择的分发处理(串行队列,连拍不丢文字) ├── config.mjs # 默认配置 / config.json 合并 / 运行时入参覆盖(含 Volatile 解包) ├── clipboard.mjs # 拉起 PowerShell 常驻助手并读事件日志 ├── storage.mjs # Obsidian 入库(按天合并、目录结构、OCR 回填与重试) ├── ocr.mjs # 识别:宿主多模态模型(默认) + 通义千问回落 ├── organize.mjs # 晚间 AI 整理(归类 / 双链 / 总结 / 归档) ├── dev-run.mjs # 独立开发入口(不需要 DSH) ├── client.js # 浏览器端:注册 Web 设置页,经 configForms 读写配置 ├── scripts/ │ └── clip-dialog.ps1 # PowerShell 轮询剪贴板 + 弹出系统级悬浮窗 ├── cordis.patch.yml # DSH bundle patch(声明本插件为可安装 host 端 bundle) ├── test/ # 独立测试脚本(注入 vault 路径即可跑,无需 DSH) ├── package.json # dsh.bundle + dsh.client manifest ├── LICENSE # MIT └── README.md

架构速览 / Architecture

- host 端(Node):index.mjs 入口,导出 Config schema(DSH 设置服务据此投影出设置页)+ 注册工具 + 剪贴板监听(watcher 单例、配置热重启、助手异常退出自动重试);clipboard.mjs 拉起 PowerShell 常驻助手并读事件日志;storage.mjs/ocr.mjs/organize.mjs 负责入库/识别/整理。
- 识别通道:默认走宿主 —— ctx.get("attachments").saveImage() 把图片转成 ImageAttachmentRef,再用 ctx.llm.stream({ provider, model, reasoningEffort: "off" }) 收文字(图片块只认 attachment 引用,不塞 base64;是否支持图片看目录里模型的 inputModalities)。宿主不可用时回落千问 HTTP 接口。
- client 端(浏览器):client.js 注册 Web 设置页,经 ctx.configForms.get("") 读写配置(DSH 0.1.7 起,旧的 settingsScope 已被移除)。
- PowerShell:scripts/clip-dialog.ps1 轮询剪贴板 + 弹出悬浮窗,通过 %TEMP%\dsh-capture\events.log 与 Node 通信。

注意:悬浮窗脚本是 Windows PowerShell(Add-Type + WinForms)。请在可控环境下使用,并只安装你信任的代码(本插件无后门,不联网外传剪贴板数据)。

安全说明 / Security

- 本插件不含任何内置密钥;千问 key(可选的回落通道)只从环境变量或配置文件读取;
- 剪贴板图片仅本地处理;识别时才把那一张图片发给识别通道 —— 默认是宿主自己的模型(走 DSH 的模型配置),回落时才是通义千问;
- 仓库代码不含个人路径之外的敏感信息;配置文件里的 vaultPath 等路径是使用者的本地路径,不会写入仓库(仓库默认 vaultPath 为空,首次使用需自行配置,未配置时自动停用采集)。

开发与独立测试 / Development (no DSH needed)

npm run dev # 交互模式(真实弹窗)
npm run dev:auto # 自动模式:检测到截图自动存文档
npm test # 运行存储/整理单测(无需 DSH、无需 API key)

可用环境变量 DSC_VAULT_PATH 覆盖 vault 路径,避免污染真实库。测试说明见 test/README.md。

License

MIT © 2026 wangzhanchao883
预览分享卡片长什么样 ↓wangzhanchao883/dsh-screenshot-capture
分享 · DeepSeek Harness Hub
wangzhanchao883/dsh-screenshot-capture

DeepSeek Harness 的指哪拍哪截图:悬浮窗拍完直接进 Obsidian 笔记,可加批注、标重点,宿主多模态模型零配置识别(可回落千问),同屏去重,按天合并,晚间 AI 整理。

这是你的仓库?认领条目

回到顶部