用途与实际影响
这项功能怎样使用
为什么需要它
只复制屏幕截图或一堆媒体会丢失账号、对象、时间、回复与原消息关系;只有文件存在也不能证明清单、状态和媒体仍是一套。
举个实际例子
我明确要求“把昨晚这段聊天、回复关系和当前能打开的语音做成保全包”。完成后会得到消息、清单和媒体目录;打不开的图片、视频或文件仍留着关系和缺口,只有整包写完整才正式出现,不会把半成品交给我。
最后我会得到什么
得到一份包含所选聊天、回复关系和当前能打开附件的材料包,另有清单说明缺什么。已有包可独立核对是否仍完整;部分附件缺失会保留实际消息与缺口。
可直接使用
文字、附件与清单能一一对上时,才称这份包可独立核对。
需要确认
某张图或语音打不开时仍保留消息和缺口,不把附件空白说成整段聊天不存在。
当前不可用
目标已有内容或文件身份、数量不符时不覆盖,也不宣布保全成功。
从哪里开始
要求给一段重要聊天做可核对的独立保全或验真。
需要准备什么
- 明确账号、对象与需要保全的时间窗口
- 是新保全、验真已有包还是补缺失媒体
从开始到拿到结果
- 1
系统核对并处理
按选定范围保存文字、关系、可用媒体和清单;发布前核对文件数、内容指纹与增量状态。
- 2
交付与接续
交回完整、部分或待恢复的真实状态;已有导出可离线验真,缺媒体可定向补,不把生成成功当源内容完整。
技术实现与依据
这里保留实现、关键条件、精确入口、历史记录和验证结果。
保全包、原子目录、联系人/朋友圈验真、路径 containment(隔离处置) 和媒体派生关系均有合成回归关键规则与设计选择
preserve 只由明确保全请求触发,不把普通问答自动升级成证据包。
保全包与 sync 导出是两种产品:前者有界自包含,后者可持续增量。
原始消息先保存;当前可打开的 SILK 语音保留原件,WAV 只是带来源哈希的派生文件。
preserve 只物化当前本机媒体;export-context 是另一个面向 AI 的有序阅读包,两者不能用同一份 verify-export 结果互证。
verify-export 不需要账号配置或源数据库,可以在恢复后独立验真。
任何错误都以列表返回,不能用其余文件通过来掩盖一个不一致。
本模块用到的名词
- Self-contained bundle(自包含保全包)
- 离开源数据库后仍能理解账号、对象、时间、消息、回复、媒体与缺口。
- .incomplete
- 尚未完成的候选目录;只有验证后才可替换正式目标。跨两个目录重命名不是全局原子,已知中断按事务恢复,未知旧目录不自动删除。
- Path containment(路径约束)
- 清单里的每个文件都必须解析在导出根内,不能借相对路径或链接逃出。
- Independent verification(独立验真)
- 不打开微信源,只依赖导出本身重算身份绑定、文件和关系。
专业定义
preserve 只在用户明确要求时生成自包含窗口;verify-export 不读源数据库,独立重算联系人或朋友圈 v1 导出的身份、文件、数量、哈希和媒体关系。
解决什么
解决截图式保全缺关系、半完成目录冒充成品、导出文件被替换、state/manifest(清单) 串档和派生媒体失去来源。
当前怎样实现
- preserve 先调用 context 得到账号、对象、窗口、消息、引用和 gaps。
- 包先在具名候选目录写完并验证,再发布;替换已有归档复用明确事务恢复。packageCreated=true和exit0不等于全部所选内容可用,status=partial、delivery与hasMore必须独立读取。
- 媒体记录 messageNativeId、mediaId、kind、locatorSha256、bytes、sha256 与 derivedPaths。
- verify-export 只接受 wechat-direct-contact-export.v1 与 wechat-direct-moments-export.v1,不把 preserve 当增量导出。
- 验真限制所有相对路径留在导出根,拒绝反斜杠、冒号、..、绝对路径和符号链接逃逸。
执行流程
- 1
确认用户明确要求保全或验证哪一个现有导出。
- 2
保全先取得有界聊天和精确媒体;验证先读取导出 manifest(清单)。
- 3
逐个核对账号、对象、范围、记录数、文件大小和 SHA-256。
- 4
检查媒体文件、消息关系与语音派生来源。
- 5
保全全部写入临时目录后一次发布;验证汇总全部错误。
- 6
返回成功清单哈希,或失败字段和可恢复动作。
边界
- 保全目标必须由用户明确点名且尚不存在。
- verify-export 不接受 preserve 目录,因为两者合同不同。
- 媒体不可用时保留 gap,不从其他目录补同名文件。
- 保全成品含真实私人内容,只留本机,不进入网站或 PUBLIC(公开) Git。
失败与恢复
- 目标或 .incomplete 已存在
- 拒绝覆盖,先由用户判断旧目录用途。
- 保全过程任一步失败
- 清理本轮 .incomplete,原目标仍不存在,不留下半成品。
- 导出路径越界或符号链接逃逸
- verify-export 返回路径错误,不读取外部文件。
- 哈希、大小、数量、账号或派生关系不一致
- 返回 failed 和完整 errors,不局部判 PASS。
真实入口
wechat_cli.py · command_preserve有界自包含保全和原子目录发布。
wechat_cli.py · command_verify_export联系人/朋友圈导出独立验真合同。
tests/test_wechat_cli.py · preservation消息、媒体、语音派生和 manifest(清单) 回归。
tests/test_public_commands.py · verify-export路径、身份、哈希、数量和派生关系回归。
如何验证
- test_explicit_preservation_bundle_is_self_contained 验证保全自包含。
- test_verify_export_accepts_contact_and_moments_without_writes 验证两类导出。
- test_verify_export_rejects_fixed_file_symlink_escape 验证路径逃逸失败。
- test_verify_export_rejects_cross_account_state 与媒体关系测试验证绑定。
与其他模块的关系
保全消费“聊天上下文”和“回复与媒体”;verify-export 验证“具名增量归档”和“朋友圈缓存”的正式输出,但不替代源端重放。
