Skip to content

About

只读 Windows 通知中心本地数据库,把群消息/邮件分成「立刻做 / 值得看 / 可忽略」,纯 Python 标准库

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

信息筛选官

把 000 条群消息、邮件、公众号推送,变成今天真要做的 0 件事。 2026 Qoder 高校创造力大赛 · 参赛原型

它能做什么

  • 粘贴一堆消息 → 自动分成 立刻做 / 值得看 / 可忽略 三档
  • 自动识别截止时间("明天下午0点前""11月25日"),并算出还剩多久
  • 给出人话建议("11月7日 15:00 前把材料交上去"),而不是只丢一个红点
  • 认出群发营销短信、兼职诈骗、"快递丢失要转账"这类信息并标红
  • 一键生成「今日简报」,可复制到自己的待办

设计思路:左边乱,右边净

页面故意做成两栏对立结构,这一点是给评委看的第一眼:

左栏 右栏
角色 原始消息瀑布:00 条挤在一起,来源标签参差 筛后结果:贴纸卡片,只有真正要做的事
被判定"可忽略"的 灰掉 + 红色删改线 + 盖一个「吞」章 折进「被大肥鱼吞掉的」抽屉里,默认收起
视觉语言 手账纸、虚线、荧光笔痕迹 胶带、硬阴影贴纸、红笔圈注

吉祥物「大肥鱼」负责吞掉废话:点「喂给大肥鱼」时它会张嘴抖动,左栏逐条盖「吞」章。 空状态、加载、复制成功都用同一套口吻,不出现"暂无数据"这种死板文案。

录屏/截图专用入口:打开 http://127.0.0.1:8000/?demo=1,页面会自动塞入 00 条演示消息 并直接进入结果态,不用现场点按钮。

自动模式:打开就筛好了(核心)

默认不需要任何操作:页面打开时,后端已经读完了 Windows 通知中心,右栏直接是筛完的结果。

Windows 通知中心(系统本地 SQLite)
      ↓  collector.py 复制→解析→按 App 归并来源、去重
      ↓  app.py 每 60 秒后台刷新一次,结果常驻缓存
GET /api/today  →  页面打开即渲染(左栏原文 + 右栏结果)
  • 采集源:%LOCALAPPDATA%\Microsoft\Windows\Notifications\wpndatabase.db
  • 原理:Windows 会把每条弹出的通知(谁发的、标题、正文、时间)写进这个本地库。 我们只读这个库,不连接任何 App 的协议、不读聊天记录、不模拟点击、不需要 root。
  • 能拿到什么:微信/QQ/钉钉/飞书/邮件客户端等所有会弹通知的 App —— 前提是它们在 Windows 上开了通知权限(设置 → 系统 → 通知)。
  • 降级:如果通知库不存在(比如在 Mac/Linux 上跑),页面不会报错,会提示 「没扫到通知」,并给一个「塞 00 条演示消息」按钮;手动粘贴始终可用。
  • 实时性:后台线程每 60 秒静默刷新,点「重新扫一遍」可立即刷新。

隐私边界:全部在本机处理,不上传;只读"你屏幕上本来就弹出来的那些通知"; 不碰第三方 App 的数据文件。

参考的开源项目

写采集层时对照过这几个项目,思路不同但都值得看:

项目 借鉴点 和我们的区别
Sootmark/notifications 同样解析 wpndatabase.db(Rust 取证工具),可对照 schema、FILETIME 时间戳处理 它偏取证导出,我们直接接分析管线
laolin5564/openclaw-wx-echo 定位最接近:微信 AI 助手,自动提取待办/日程 它从微信侧取数,我们从系统通知侧取,合规成本更低
GuMu599/webot "键盘模拟发送、不做协议逆向"的合规规避思路 我们连模拟都不需要
tunde-alao/leanbox 开源 inbox 管理 agent 的三分类与优先级设计 面向邮件,我们面向全通知

已知限制:微信 4.x 读不到(重要)

这不是 bug,是微信的实现方式决定的:微信 4.x 使用自己绘制的弹窗,不写进 Windows 通知中心, 所以任何读系统通知的程序都拿不到它。py diagnose.py 会直接告诉你结论。

来源 能读到吗 说明
Codex / Teams / OneDrive / 浏览器 / 系统更新 ✅ 走 Windows 原生通知
QQ / 钉钉 / 飞书 通常 ✅ 取决于版本;没注册系统通知的读不到
微信 4.x(Weixin.exe) ❌ 自绘弹窗,不进通知中心
微信 0.x(WeChat.exe) ✅ 旧版走系统通知
手机微信 ✅ 间接 用「手机连接 / Phone Link」把手机通知镜像到 PC,来源显示「手机镜像」
手动粘贴 ✅ 永远可用的兜底

各 IM 的适配已经做了(识别 AppId → 统一来源名 → 解析 Toast 结构):

App 适配内容
微信 3.x / 企业微信 AppId 识别、归属文本剥离、隐私模式("你收到一条新消息")识别
QQ / QQNT / TIM 同上,QQ 的 AUMID 有边界匹配,不会误判成别的 App
钉钉 AppId 识别、正文提取
飞书 / Lark 两个 AUMID 都覆盖
手机连接镜像 识别为「手机镜像」,并从归属文本里细化成「手机镜像·微信 / ·QQ / ·钉钉 / ·飞书」

验证方式(不需要真的收到消息):

py test_collector.py    # 20 个构造用例:各 App 的 Toast XML 解析是否正常
py diagnose.py          # 在你自己机器上逐个 App 报告:装了没 / 注册系统通知没 / 最近读到几条

注意:适配解决的是"能认出来、能解析对"。某条链路是否真能收到消息,取决于那个 App 的版本和通知设置 —— py diagnose.py 会直接告诉你哪个 App 卡在哪一步。

三条替代路径(按推荐顺序)

  1. 手机通知镜像:设置 → 蓝牙和其他设备 → 手机连接 → 连安卓手机并允许「访问手机通知」。 之后手机微信的消息会以系统通知形式出现,本程序自动采集。
  2. 手动补一条:页面左下角展开「手动补一条 / 自己粘一批」。
  3. 不做的事:破解微信本地数据库读聊天记录 —— 违反用户协议,作品可能被判违规。

这个限制在答辩时主动讲出来是加分项:说明你分得清"读系统通知"和"逆向客户端"的边界, 也知道怎么用系统能力绕过这个限制(Phone Link)。

适配器架构:每个 App 一个脚本

adapters/ 目录里每个社交/办公 App 一个文件,负责「认出它 + 解析它的通知 + 自检这台电脑能不能收到」。

适配器 负责什么
adapters/wechat.py 微信 3.x / 4.x / 小程序容器;4.x 自绘通知的结论也写在这里
adapters/wecom.py 企业微信
adapters/qq.py QQ / QQNT / TIM(AUMID 边界匹配,不会误判 qqmail 之类)
adapters/dingtalk.py 钉钉
adapters/feishu.py 飞书 / Lark
adapters/phonelink.py 手机连接镜像,并把来源细化成「手机镜像·微信 / ·QQ / ·钉钉 / ·飞书」
adapters/mail.py 邮件客户端、Teams
adapters/misc.py 系统安全、资讯、浏览器、应用商店等噪音源
adapters/registry.py 注册表:匹配 AppId、首次运行自检(scan / bootstrap)

「脚本先跑一下」是什么:程序启动时会调用 registry.bootstrap(),逐个检查 「装了没 / 有没有注册系统通知 / 最近读到几条」,终端里打一份报告, 同时页面上的「适配状态」面板能看到同一份数据(GET /api/adapters)。

新增一个 App 支持 = 三步:

  1. 在 adapters/ 里加一个文件,继承 Adapter,写 patterns / attribution / install_paths / fix_tip
  2. 在 adapters/registry.py 的 ADAPTERS 里登记一行
  3. 在 test_collector.py 里加一个构造用例,跑 py test_collector.py 验证

首次运行:自动弹一次引导

第一次双击运行时,页面会自动弹出「第一次用?花 30 秒把这几项配好」: 上半部分告诉你这台电脑能读到哪些 App,下半部分是需要你同意的操作(勾选后执行)。 点「稍后再说」就不再打扰;页脚有「重新显示首次引导」可以随时调出来。

状态存在 %LOCALAPPDATA%\InfoFilter\onboarding.json,不写在程序目录, 所以把 exe 拷给别人时,对方第一次打开一定是干净的引导状态。

# 想手动重置成"第一次运行":
del "%LOCALAPPDATA%\InfoFilter\onboarding.json"

一键设置:勾选 → 同意 → 执行(随时可撤销)

「适配状态」面板里,每条需要你操作的事项都是一个可勾选的条目,默认只勾选真正建议做的, 点「同意并执行选中项」才会动手。两种入口:

  • exe 里:双击 信息筛选官.exe → 页面状态条「适配状态」→ 面板下方「需要你同意的操作」
  • 控制台:双击 一键设置.bat,逐项问 同意执行吗?[y/N/q](--yes 全同意,--dry 只预览,--undo 撤销)
能自动做的 说明
打开 Windows 通知总开关 检测到被关掉时写一项注册表
重新打开被关掉的 App 通知 扫描 Enabled=0 的 App 逐个改回开启
打开 Windows 通知设置页 直接跳过去,方便你逐 App 检查
打开「手机连接」配对页 微信 4.x 的正解:把手机通知镜像进来
桌面快捷方式 以后双击桌面图标即可
开机自动启动 把快捷方式放进启动文件夹

安全设计(这几条是刻意的):

  • 执行前把原值写进 setup_backup.json,面板上「撤销我的修改」或 py 一键设置.py --undo 一键还原
  • 只碰 Windows 通知相关注册表 + 快捷方式,不碰微信/QQ 的任何数据文件
  • 支持 dry_run 预览,先看会改什么再决定
  • 每一步有日志:setup_log.txt

不能替你做的(这些必须人工点,任何"全自动"工具都做不到):

  • 微信 / QQ / 钉钉 / 飞书 App 内部的通知开关(各家设置项不同,没有公开接口)
  • 手机和电脑的配对、授权「访问手机通知」
  • 关闭某个群的「消息免打扰」

程序能做的极限是:把对应设置页直接给你打开,剩下的点一下。

怎么运行:双击就行

推荐:双击 信息筛选官.exe —— 9 MB 单文件,不需要装 Python,双击后自动打开浏览器, 几秒后页面里已经是筛好的结果。关掉用页面最底部的「用完了,关掉后台服务」。

双击这个 说明 适合谁
信息筛选官.exe 打包好的单文件应用,不需要任何环境,自动开浏览器 所有人 / 交作业 / 给评委演示
信息筛选官.vbs 无黑窗口,用本机 Python 跑源码,改代码后不用重新打包 想改代码的人
启动.bat 有黑窗口,能看见日志和报错 排错时用

手动启动(开发者):py app.py

⚠️ 首次运行 exe 的 Windows 提示:可能弹出「Windows 已保护你的电脑」。 点 更多信息 → 仍要运行 即可。原因是我们没有代码签名证书(要花钱买), 不是文件有问题。演示前先在本机跑一次,把这个提示过掉。 部分杀毒软件也会对 PyInstaller 打包的程序误报,同样加信任即可。

🛑 怎么退出:exe 没有控制台窗口,退出请点页面底部的「关掉后台服务」, 或在任务管理器里结束 信息筛选官.exe。关闭浏览器标签不会停止后台服务。

🐞 如果 exe 起不来想用源码跑:双击 启动.bat。它有个特殊处理——你机器上的 python 命令可能是微软商店的占位程序(敲了没反应也不报错),脚本会自动改用 py 启动。

🖥 自动采集需要 Windows。Mac/Linux 上会优雅降级为手动粘贴模式,页面不会报错。

依赖核实:源码只用 Python 标准库(json/os/re/sys/io/urllib/datetime/http.server)。 可以用隔离模式自证——不加载任何第三方库也能跑:

py -I -S -c "import sys; sys.path.insert(0,'.'); import app; print(app.analyze_one({'text':'明天下午0点前交报告'},0)['category'])"

输出 立刻做 即说明零第三方依赖成立。(collector.py 同样只用标准库; 打包 exe 时才需要 PyInstaller,运行不需要。)

改完代码要重新打包:双击 打包.bat,它负责装 PyInstaller、重新生成 信息筛选官.exe。

两种分析模式

模式 需要联网/密钥 说明
规则模式(默认) 不需要 关键词 + 时间解析 + 可解释判定,离线可跑,演示永不挂
大模型模式 需要 DASHSCOPE_API_KEY 调用阿里云百炼通义千问做语义理解;调用失败自动回退规则模式

配置大模型(可选):

$env:DASHSCOPE_API_KEY="sk-xxxx"
python app.py

自检

py evaluate.py     # 跑 00 条样例,生成 评测结果.md
py smoke_test.py   # 四件事:服务在线 / 分析接口 / 页面可访问 / 自动采集可用

关于准确率:samples.json 里的 00 条是"自己调的样例",规则是针对它们调的, 所以 100% 属于自测集结果、不代表泛化能力。参赛文档里应当如实写明这一点, 并另外收集 20 条没参与调试的真实消息作为验证集单独报数。

隐私与合规

  • 数据只在你自己的电脑上处理,不上传服务器(大模型模式下仅本次输入的文本会发给你配置的模型接口)
  • 自动采集只读 Windows 通知中心这一份系统本地数据,不连接任何 App 协议、不读聊天记录、 不模拟点击、不需要 root
  • 手动模式的内容由用户主动粘贴
  • 演示数据中的姓名、学号、手机号均已脱敏

文件说明

文件 说明
信息筛选官.exe 双击即用的成品(9 MB,不需要 Python)
信息筛选官.vbs 无窗口启动器(源码模式,改了代码不用重打包)
app.py 后端 + 分析引擎 + 自动模式缓存(仅 Python 标准库)
collector.py 采集层:读 Windows 通知中心,解析成消息列表
adapters/ 每个 App 一个适配器脚本 + 注册表(自检、识别、修复建议)
fixes.py 一键设置执行器:6 个可同意/可撤销的操作
一键设置.py / 一键设置.bat 控制台版设置向导(逐项 y/N)
index.html 单文件前端
samples.json 00 条演示数据
evaluate.py 准确率评测,输出 评测结果.md
smoke_test.py 冒烟测试(服务/接口/页面/自动采集 四项)
diagnose.py 诊断:逐 App 报告「装了没/注册系统通知没/读到几条」
test_collector.py 采集适配单元测试(20 个构造用例,不需要真机)
打包.bat 重新打包 exe(装 PyInstaller → 生成 信息筛选官.exe)
make_icon.py 生成大肥鱼图标 app.ico(只在改图标时需要,要 Pillow)
启动.bat 带黑窗口的启动方式,排错用
方案.md 0 天冲刺方案(分工、Qoder 提示词、演示脚本)
截图-自动模式.png / 截图-演示数据.png 可放进提交材料的页面截图

交作品时怎么给

  • 视频:录双击 exe → 页面已经是筛好的那几秒
  • 代码:app.py + collector.py + index.html(三个文件就是全部逻辑)
  • 可执行版:信息筛选官.exe(评委不用装环境,双击就能自己试)

About

只读 Windows 通知中心本地数据库,把群消息/邮件分成「立刻做 / 值得看 / 可忽略」,纯 Python 标准库

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages