dsh-screenshot-classify · 截图即存 · 自动分类
DeepSeek Harness 插件:截屏即存,并按内容自动打类目标签、给文档截图写一句摘要。
监听剪贴板 → 鼠标位置弹出系统级悬浮窗【注释框 +「重点」+ 类目下拉 + 存文档 / 存图片】
→ 图片入库 + 用宿主自己的多模态大模型做 OCR(零配置,不用另申请 key)
→ 等 OCR 出文字后,用本地规则判断这张图是什么内容,把类目写进笔记标题
→ #文档 类再按识别出来的文字写一句摘要 → Obsidian 按天合并
→ 晚间整理时,入库时判好的类目会一路带到知识库文件夹。
A DSH plugin that turns a screenshot into a classified Obsidian note: a floating window next to your mouse (comment / key point / category picker / save-as-document or save-as-image), instant OCR through the host's own multimodal model, local rule-based classification into 18 categories, and a one-line summary for document-type captures.
这是
dsh-screenshot-capture的分支重写版: 采集链路原样保留,新增了分类与摘要。两者不能同时启用(同一个剪贴板会被监听两次,弹两个窗)。
和原插件的区别
| dsh-screenshot-capture | dsh-screenshot-classify | |
|---|---|---|
| 截图入库 / 悬浮窗 / OCR / 晚间整理 | ✅ | ✅ 原样保留 |
| 笔记标题 | ## 14:30 #文档 |
## 14:30 #文档 #学习资料 |
| 判不准时 | — | 额外一行 > 分类: 梗图表情包(弱) |
| 文档摘要 | — | > 摘要: 一道一元一次方程题,要求解出 x。 |
| 弹窗 | 注释 + 重点 + 两键 | 多一个类目下拉(默认「自动」) |
| 晚间整理 | 手动指定分类 | 不指定就沿用入库时判的类目 |
| 配置 | — | 全部沿用原插件那份(dsh-screenshot-capture 命名空间) |
界面
副屏实拍(PrintWindow 抓的真实像素,不是效果图):

四套主题只换配色与头部图标画法,布局和操作完全一致:

主题对比图是 GDI+ 离屏绘制的(所以没有系统标题栏),真机长什么样看上面那张。
功能
- Windows 系统级悬浮窗:检测到新截图(或复制图片)后,在鼠标旁弹出置顶小窗。
- 现代扁平界面(0.2.0 / 0.3.0):白底、圆角自绘按钮、浅色标题栏、雅黑 UI 字体、按 DPI 缩放。
窗口标题「截图分类」,窗内顶部是一条 44px 信息条(
待入库 · 22:19 · 620×1100),不再重复标题。 四套主题(青碧扫描 / 靛蓝取景 / 石墨取景 / 紫罗兰取景)在设置页一键切换;配色固定,不跟随系统深浅主题。 - 快捷键:
1存文档 /2存图片 /Esc忽略。走ProcessCmdKey,焦点在注释框或 下拉里也照样生效。 - 注释 / 重点标记:勾重点后该条以
# **重点**写入笔记。 - 类目下拉:默认「自动」——等 OCR 出来按内容判;也可以当场指定一个类目,此时跳过规则判定。 下拉夹在「重点」复选框与「适应」按钮之间的空隙里,不额外占窗口高度。
- 存文档:图片入库 + 立即占位写入笔记(绝不让截图丢失)→ OCR → 分类 → 摘要 → 回填。
- 存图片:不跑 OCR,只入库 + 尽量判断类目(没有文字时多半判不准,会挂弱标记)。
- 自动分类:18 个类目,纯本地规则,免费、瞬时、离线。详见下面「分类怎么判」。
- 文档摘要:
rules(本地抽取,免费)或host(宿主文本模型写一句人话),默认rules。 - 助手自愈:剪贴板助手意外退出时按退避自动重启(2s→30s,最多 5 次)并告警。
- 同一屏去重:按 32×32 灰度指纹比对,
dupWindowMs内近似同屏只弹一次窗、只存一条。 - 回填不丢字:笔记被同步盘 / Obsidian 占用时退避重试并改走「临时文件 + 原子替换」,
两次仍失败会把结果暂存到
%TEMP%\dsh-capture\pending-ocr.jsonl并告警。 - 晚间整理:点选保留 / 保存全部 → 归类 → 分类笔记 + 双链 → 当日总结 → 归档。
- Web 配置界面:DSH 设置 →「截图分类」。
环境要求
- Windows(依赖系统自带 PowerShell 5.1 + WinForms)
- DSH 0.1.7 ~ 0.2.x(设置页依赖
configForms;更早的 DSH 上采集照用、设置页不出现) - 宿主大模型 OCR:需要 DSH 已加载
llm+attachments服务,且当前模型在目录里声明了inputModalities: [text, image]。不满足会自动回落通义千问 - 通义千问 API key(可选,只在回落时用到)
- Obsidian 库(或任意本地 markdown 目录)
安装
# 方式一:直接从 GitHub 装(推荐)
dsh plugin --profile desktop add github:passing11/dsh-screenshot-classify
# 方式二:本地目录(开发用,改源码即生效)
dsh plugin --profile desktop add /path/to/dsh-screenshot-classify
# 方式三:打包后再装
npm pack
dsh plugin --profile desktop add ./dsh-screenshot-classify-0.3.1.tgz
装完重启 DSH(不是刷新页面),然后:
- DSH 设置 →「截图分类」→ 填 Obsidian 库路径。
- 停用原插件
dsh-screenshot-capture(设置 → 插件,或dsh plugin --profile desktop remove dsh-screenshot-capture)。 不停用的话两个插件会各弹一个窗、同一张图入库两次。 - 截一张图试试。
旧配置不用重填:本插件会读
dsh-screenshot-capture那份设置作为兜底,vaultPath/ocrMode/ 弹窗位置等全部沿用。
配置项
设置页分组:常规 / OCR / 分类 / 摘要 / 弹窗 / 归档。
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
总开关 |
vaultPath |
"" |
Obsidian 库根目录(必填,空则采集停用) |
inboxFolder |
收件箱 |
每日笔记目录 |
attachmentsFolder |
attachments |
图片目录 |
knowledgeFolder |
知识库 |
晚间整理后的分类笔记 |
summaryFolder |
总结 |
当日总结 |
archiveFolder |
归档 |
归档后的每日笔记 |
ocrMode |
host |
host / qwen / off |
ocrHostModel |
"" |
留空自动挑声明了图片模态的模型 |
classifyEnabled |
true |
自动分类总开关。关掉=退回原插件行为 |
classifyMinConfidence |
0.55 |
低于它算「判不准」,加弱标记 |
summarizeMode |
rules |
off / rules / host |
summarizeHostModel |
"" |
host 模式用哪个模型,留空用宿主默认 |
summarizeMaxChars |
120 |
摘要长度上限(20~500) |
dialogTheme |
c1 |
c1 青碧扫描 / c2 靛蓝取景 / c3 石墨取景 / c4 紫罗兰取景 |
dialogPositionMode |
cursor |
cursor / fixed / remember |
dialogAutoCloseSec |
0 |
0=不自动关 |
tagInFilename / moveMode / unknownCategory |
— | 归档相关,与原插件一致 |
配置文件也可手写:%USERPROFILE%\.dsh-screenshot-classify\config.json,
字段见 config.example.json。
分类怎么判
笔记长什么样
## 14:30 #文档 #学习资料

> OCR: 测试题目: 3x + 2 = 8,解得 x = 2
> 分类: 学习资料(弱)
> 摘要: 一道一元一次方程题,要求解出 x。
今天上课随手拍的。
- 标题行第二个
#标签就是类目 —— 在 Obsidian 里点它能直接筛出这一类。 - 弱判定不动标题行,只在 OCR 下面加一行
> 分类: …(弱)。 这样「标签检索」永远干净,而「这条别太信」的信息也不丢。 - 摘要跟在分类行后面,晚间整理时单独成
## 摘要一节。
18 个类目
聊天记录 / 支付账单 / 购物 / 游戏截图 / 问答社区 / 社交媒体 / 视频播放 / 学习资料 / 文档票据 / 交友社交 / 地图出行 / 代码开发 / 二次元 / 梗图表情包 / 时政新闻 / 生活日常 / 文字梗 / 摄影
文字梗 是诚实兜底:有文字、但推不出更具体场景的图都进这里(段子、神回复、长文分享、
网友评论截图)。这类图既不是「梗图」(没夸张图画)也不是「生活日常」,硬塞进哪个都是撒谎。
打分(和 dsh-photo-organizer 同一套)
| 线索 | 权重 |
|---|---|
App 包名(com.tencent.mm 等 35 个) |
4.0 |
| 特征短语命中 1 个 | min(raw,1.2) × 0.35,不记理由 |
| 特征短语命中 ≥2 个不同词 | raw + 0.8 + 0.35 × min(hits-2,4) |
| 正则(如「据…报道」) | 2.0 |
| 竖屏截图形态 | 7 个截图类各 +0.5 |
| 文字 > 400 字 | 4 个文档类各 +0.4 |
| 文字 < 40 字 | 只给「梗图表情包」+0.7 |
| 相机直出 | 摄影 2.2(有字)/ 2.5(无字) |
| 米哈游系包名 | 游戏截图 3.0 |
证据强度(比置信度更值得看)
分数高不等于判得准。每条判定都带一个 evidence:
evidence |
含义 | 置信度 | 能不能信 |
|---|---|---|---|
strong |
包名 / 正则 / ≥2 个关键词 | 0.5~1.0 | 可以信 |
camera |
相机直出 | 0.8 | 可以信 |
weak |
只有形态学(文字长短之类) | 0.3~0.4 | 这是猜 |
fallback |
一条规则都没命中 | 0.2 | 承认推不出来 |
manual |
弹窗里人工指定 | 1.0 | 你说的算 |
置信度也按证据给,不按分数给:weak 一律压到 0.3~0.4,fallback 固定 0.2。
这样「判不准」在笔记里看得见,而不是假装很确定。
四条踩过的坑(别再犯)
- 不要写裸的时间正则。
\d{1,2}[::]\d{2}看着无害,但手机截图状态栏右上角永远有 「16:12」,OCR 一定读出来 —— 实测单独命中 922 张,把「生活日常」顶到 21%。要时间线索, 必须带上「人怎么用它」的上下文。 - 形态学不能选类目。 早先「文字 < 40 字」同时给「梗图表情包」和「二次元」各 +0.7, 982 张的冠军由类目表声明顺序决定 —— 等于用「字少」宣布「这是动漫」。
- 目录先验不能对有文字的图生效。 「从 B 站存的图」回答不了「画面画的是什么」。 降权到 0.4 也没用:那些图往往一条文本规则都不命中,0.4 照样独赢(实测 2310 张全判二次元)。 本插件干脆不用目录——截图落在哪个目录跟画面无关。
- 无文字不能平均分给三个类目。 早先「没文字 → 摄影/二次元/梗图各 +1.4」,冠军又由声明顺序 决定,无文字截图会莫名变成「摄影」。现在没文字就承认没证据,走兜底或由真线索接手。
摘要(可选)
| 模式 | 做什么 | 花钱 |
|---|---|---|
off |
不写摘要 | 0 |
rules(默认) |
本地抽取式:从 OCR 文字里挑信息量最大的那句 | 0 |
host |
把 OCR 文字交给宿主文本模型,让它写一句人话 | 很少(只喂文字,不喂图片) |
- 摘要永不抛错:模型挂了就降级到
rules并打一条 warn,不影响截图分类。 - 只对
#文档做。#图片不跑 OCR,没有文字可总结。 - OCR 失败(笔记里写的是
(识别失败:…))时跳过 —— 那串字不值得总结。
Obsidian 结构
<vault>/
├── 收件箱/2026-11-13.md # 当天所有截图,按时间块合并
├── attachments/ # 图片
├── 知识库/
│ ├── 学习资料/
│ │ ├── 20261113_1430_文档.md
│ │ └── INDEX.md
│ └── …
├── 总结/2026-11-13.md # 当日总结(链接全部保留条目)
└── 归档/2026-11-13.md # 整理后的收件箱笔记
晚间整理时,类目优先级:当晚手动指定 > 入库时判定的 > 未分类。 也就是说入库时判好的类目会一路带到知识库文件夹,不会被抹平成「未分类」。
工具
| 工具 | 作用 |
|---|---|
screenshot_status |
状态:监听是否运行、vault 路径、今天收了几条 |
screenshot_inbox_list |
列出某天收件箱里的条目(时间 / 类型 / 类目 / OCR / 摘要) |
screenshot_inbox_organize |
晚间整理:保留指定条目 → 知识库 + 索引 + 总结 + 归档 |
典型流程:
screenshot_inbox_list # 看今天有什么
screenshot_inbox_organize keep=["14:30","14:32"] # 保留这两条
开发与测试
不需要 DSH 也能跑(node_modules 里的 @deepseek-ai/* 只在装进 DSH 时才需要):
npm test # 9 个 JS 套件:format/storage/reasoning/autoclose/config-shape/
# single-instance/settings-reload/classify/summarize
npm run test:window # 悬浮窗自动关闭
npm run test:window:layout# 悬浮窗布局(含类目下拉的位置断言)
npm run test:window:keys # 快捷键 1/2(14 项,反射调 ProcessCmdKey)
npm run test:window:category # 类目回传(12 项,真选中 + 真点按钮)
npm run test:classify # 分类规则(48 项)
npm run test:summarize # 摘要(46 项)
PowerShell 套件共 11 个、338 项断言,跑法:
Get-ChildItem test\test-*.ps1 | ForEach-Object {
powershell -NoProfile -ExecutionPolicy Bypass -STA -File $_.FullName
}
这些测试会真的弹出窗口。模拟指针优先挑一块非主屏,只有一块屏时才退回主屏 —— 你正在用的那块屏不该被测试弹窗打断。测试期间窗口会短暂出现在副屏上,几秒后自己关掉。
必须
-STA:WinForms 弹窗在 MTA 下起不来。
test-dialog-keys.ps1不用SendKeys—— 在后台/无交互桌面上它根本不返回,测试会 挂死。改为直接反射调DscFastForm.ProcessCmdKey,绕过的是「键怎么从桌面走到窗体」 那一段(那是 Windows 的职责),我们自己的分支逻辑照样被完整执行。
test-single-instance需要往~/.dsh/dsh-screenshot-capture/写锁文件。 在受限沙箱里会 跳过并说明原因,而不是把「环境不允许」报成「锁坏了」。
安全说明
- 图片与文字只在本机流转。OCR 走宿主大模型时,图片会发给你当前配置的模型提供方;
介意的话把
ocrMode设成off(那就没有文字可分类,只剩#图片)。 - 摘要同理:
rules完全本地,host会把 OCR 文字发出去。 - 弹窗传来的类目字符串先过白名单才采信 —— 它最终会变成笔记标题里的
#标签, 不认识的类目当没指定处理。
License
MIT
No comments yet. Be the first to write one.