2026-08-24 印象笔记误同步微信群文件:348 条笔记撤回与 push_exclude 防线
背景与目标
本人发现印象笔记里多了一批不该出现的东西:微信聊天记录整理出来的 MD 文件被同步发布了上去。原话:
"我发现印象笔记,你把哪些微信聊天记录整理的文件md,都给我发布同步上去了,这个我不需要的。"
任务:查清泄露路径、撤回已同步内容、堵死复发口子。技术栈:kb 知识库工具(Python)、印象笔记 EDAM API、TOML 配置。
过程回顾
排查:泄露路径定位
- 查
kb.toml:[evernote.notebooks]把notes分类映射到「思考-笔记」笔记本,kb/core.py用rglob("*.md")递归索引,sync_evernote.py的 push 只豁免 pull_extra 镜像目录,其余子目录全推。 - 查
kb.db的 sync_map:已推送印象笔记共 1066 条,其中notes/工作/文件提取/(微信群文件批量提取,zhengli 的 wechat_ingest 产出)346 篇 +notes/计划总结/20260730、20260731_信息分析.md(聊天记录分析)2 篇,合计 348 条误推。 - 根因:公文定了"不出本机"(gongwen/ 不配映射),但文件提取、信息分析同属内部材料,却落在
notes/下被整目录带走——配置层面根本没有"排除"这个概念,只有"映射就全推"。
修复:push_exclude 机制
kb.toml新增[evernote] push_exclude = ["notes/工作/文件提取", "*_信息分析.md"](目录前缀 + 文件名 glob 两种规则);kb/config.py加evernote_push_exclude属性 +is_push_excluded()匹配器;kb/sync_evernote.py的_push加排除逻辑,关键设计:命中排除但已推过的条目自动生成 retract 计划——调deleteNote删远端(进废纸篓可恢复)、清 sync_map 的 evernote 字段。排除规则变成声明式单一事实源,加规则跑一次 push 就自清;- dry-run 验证:撤回 348、排除跳过 1、正常增量不受影响;
- 实跑:撤回 348、失败 0,正常新建/更新 18 条;
- 交叉核查 IMA:只上传过 3 条,均不涉及泄露路径,无需处理。
关键踩坑
- 坑 1:TOML 子表吞配置。
push_exclude第一次写在了[evernote.notebooks]段之后,被归进evernote.notebooks.push_exclude子表而不是[evernote]。重读文件时发现,挪回主表。教训:TOML 里 key 的位置决定归属,写在最后一个 section 后面就是最后一个 section 的——改配置后必须重读验证。 - 坑 2(本次的根因):"映射即全推"的默认设计没有排除阀门。当初设计只考虑了"哪些分类要同步",没考虑"同步的分类里哪些子目录不能出去"。内部材料和对外笔记混在一个分类树下,泄露是迟早的事。
最终方案
核心逻辑(kb/sync_evernote.py push 计划循环):
if cfg.is_push_excluded(e["path"]):
sm = kb.get_sync_map(e["path"])
if sm["evernote_guid"]:
plans.append((e, sm, "retract")) # 已误推:删远端+清同步记录
else:
n_excluded += 1 # 未推:跳过
continue
retract 执行用 session.call(session.ns.deleteNote, guid) 进废纸篓(可恢复,比 expungeNote 稳妥),EDAMNotFoundException 视为已删成功。
同步更新:zhengli 技能铁律补一条——文件提取与信息分析属内部材料,走 push_exclude 不上印象笔记。
做得好的地方
- 先用 kb.db 拿实证再动手:直接查 sync_map 拿到 1066/348 的准确数字,没凭印象估;
- 撤回设计成 push 的内生动作而非一次性脚本:以后任何排除规则调整都能自愈,不留运维尾巴;
- deleteNote 而非 expungeNote:撤回进废纸篓,误杀可恢复。
复盘与改进
- 分类分级体系落地时,"级别"只写了 front matter 规范,没接到同步闸门上——P 级分类应直接驱动 push_exclude,这是下一步该做的硬关联;
- zhengli 技能的"公文不出本机"当时只想到 gongwen/,同类材料(文件提取/信息分析)散落在 notes/ 下成了盲区。定边界规则时要按"材料性质"而不是"目录位置"穷举一遍;
- 本人把印象笔记当同步阅读工具,意味着 push 面的任何错配他都会亲眼看到——这是好事,等于多了一道人工巡检。
