把 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 的三分类与优先级设计 | 面向邮件,我们面向全通知 |
这不是 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 卡在哪一步。
三条替代路径(按推荐顺序)
- 手机通知镜像:设置 → 蓝牙和其他设备 → 手机连接 → 连安卓手机并允许「访问手机通知」。 之后手机微信的消息会以系统通知形式出现,本程序自动采集。
- 手动补一条:页面左下角展开「手动补一条 / 自己粘一批」。
- 不做的事:破解微信本地数据库读聊天记录 —— 违反用户协议,作品可能被判违规。
这个限制在答辩时主动讲出来是加分项:说明你分得清"读系统通知"和"逆向客户端"的边界, 也知道怎么用系统能力绕过这个限制(Phone Link)。
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 支持 = 三步:
- 在
adapters/里加一个文件,继承Adapter,写patterns / attribution / install_paths / fix_tip - 在
adapters/registry.py的ADAPTERS里登记一行 - 在
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.pypy 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(评委不用装环境,双击就能自己试)