用途与实际影响
这项功能怎样使用
为什么需要它
文件去重不应抹掉表情在对话里出现多次的语境,找到本地路径也不意味着图片可解码。来源、出现位置、实际字节和质量必须分别保留。
举个实际例子
我说“把这段讨论和其中的图片交给另一个项目继续看”。它给出有序消息页、原回复和能打开的图片或表情;读不到的附件明说原因,有下一页就沿原查询继续,而不是替我猜图里写了什么。
最后我会得到什么
交回按消息顺序阅读的聊天和实际能打开的图片、语音或文件;每个附件都能回到原消息。打不开或不知来源的项目保留缺口,不拿文件名猜内容。
可直接使用
消息与附件的实际内容核对后,一起交给需要继续工作的项目。
需要确认
某条回复或附件缺失时,交回仍可读的部分、缺口和下一页位置,不冒充全历史。
当前不可用
来源或附件身份不能核对时只停这部分,不拼造地址或泄露解密材料。
从哪里开始
问一句“可以”回复了谁,或某个语音和文件属于哪条消息。
需要准备什么
- 选定会话
- 想核对的回复原话或附件线索
从开始到拿到结果
- 1
系统核对并处理
按真实消息顺序连接引用目标、发送者与附件;打不开的媒体保留位置和失败说明,不从邻近文件猜。
- 2
交付与接续
交回可继续阅读的小窗口或档案包;回复目标不明时保留未知。
技术实现与依据
这里保留实现、关键条件、精确入口、历史记录和验证结果。
当前源码已核对,137项/32子测试保留9月7日证据;本轮没有打开真实微信媒体、访问 CDN 或重做归档关键规则与设计选择
context 只查本机;显式 export-context / media-open 才可物化同条表情自带的原生 CDN,--local-only 可禁止。sync-contact 与 preserve 不自动向远端补表情。
图片按消息 MD5 与 hardlink.db 精确定位;V1/V2 DAT 使用身份一致的既有保护配置在进程内解码,密钥不进入包、终端或 Git。
表情保留 PNG/GIF 等真实格式和每次出现。WXGF 依赖现有 ffmpeg/ffprobe,只在分区与帧数可证明时转成 PNG 或保持动作的 GIF。
VoiceInfo 保留 SILK,按需派生 WAV;通话事件仍只是状态。视频和文件仅在原生 MD5 索引找到实际本机文件时交付。
openable=null、materializable=true 表示找到候选但尚未证明可读;实际成功才能升级。requiresNetwork 说明是否需要原生远端物化。
转账正文按原生结算子类型投影,红包单独识别;程序解释消息格式,不代替支付平台的现实结算核对。
本模块用到的名词
- Materialization(物化)
- 从已绑定原生来源取得实际可读文件;找到路径只是候选,不能先宣布打开成功。
- Occurrence(出现位置)
- 同一张图或表情在不同消息中各有语境,字节可以复用,位置和关系不能被去重抹掉。
- WXGF
- 微信图像封装;复杂分区或透明度关系未证明时保持缺口,不把首帧冒充完整动图。
专业定义
一条消息的意思常在它引用的文字和附件里。现在可把有序消息、真实可读媒体及缺口交给 AI;HTML 只是可选查看方式。
解决什么
解决引用失联、媒体占位冒充已读、动图丢动作、发送方向错误和跨项目交付只剩 HTML 的问题。
当前怎样实现
- wechat_source.py 负责原生引用、分片 Name2Id、消息类型投影和账号绑定 locator(原件定位记录);长 serverId/nativeId 始终以字符串返回。@openim 文字与非文字方向优先取当前分片的本人原生身份。
- wechat_media.py 沿消息原生索引定位与物化;wechat_image.py 校验 DAT 解码和图片,wechat_wxgf.py 验证封装分区、视频流与帧数,不猜完整动画。
- 表情远端只使用同条消息已有地址,并核对原生 MD5、声明大小和图片解码;失败保留原 gap,不搜索替代图片。
- export-context 使用与 context 相同的范围、锚点和游标,将实际媒体写入新目录,重复字节可复用,每次消息位置不去重。
- wechat_render.py 可选生成引用同一媒体的 HTML;AI 默认读取 JSON/Markdown 与媒体文件,不需要浏览器、服务或源数据库 locator(原件定位记录)。
- repair-media只对一个明确账号/contact/output归档补本地媒体或派生WAV,--message-id/--kind进一步收窄;不重扫聊天、不请求CDN,不改原增量游标。单语音派生失败单独记录,不抹掉已可用消息与其他附件。
执行流程
- 1
固定账号、对象和查询窗口
- 2
按原生消息顺序读取正文与引用
- 3
验证每条媒体的原生来源
- 4
按请求进行本地或原生表情物化
- 5
核对实际格式、字节与质量
- 6
生成新阅读包并保留逐项缺口
- 7
有后续内容时沿原游标继续
边界
- 媒体含义必须实际阅读后由消费项目与 AI 判断。
- 不扫描模糊文件名、不搜索或拼造媒体地址。
- 阅读包不携带源数据库 locator(原件定位记录)、私有 URL 或解密参数。
- 输出与同名 .incomplete 必须不存在;已有内容不自动接管或覆盖。
- 转写、说话人归属和媒体库入库均属于另外明确的任务。
失败与恢复
- 原生 MD5、大小或实际格式不匹配
- 拒绝该媒体并保留原消息和 gap;不以相邻文件或网络搜索替换。
- WXGF 多分区或透明度关系不能证明
- 返回不可解缺口,不静默裁成一帧。
- 只找到缩略图
- 按 thumbnail 质量交付,不标成 original。
- 阅读包只有部分内容可读
- 返回 partial、每项失败和 continuation;失败回执的 retryable / nextAction 不扩大账号、聊天或写入范围。
真实入口
wechat_source.py原生消息、引用、身份、转账与红包投影
wechat_media.py / wechat_image.py / wechat_wxgf.py原生定位、DAT与WXGF物化和字节验证
wechat_render.py / wechat_cli.py阅读包、可选HTML与范围化CLI(命令行工具)
tests/test_reading_package.py / test_context_paging.py / test_sender_identity.py有序交付、分页和分片身份回归
如何验证
- 9月7日合成套件137项与32个子测试通过,覆盖图片、动画、原生媒体、阅读包、分页、发送方向及归档完整性。
- 没有读取真实微信正文或媒体,没有访问表情 CDN,没有执行个人归档或媒体库入库。
与其他模块的关系
聊天上下文确定最小范围;本模块交付其中真正可读的消息、引用和媒体。长期归档及独立保全继续使用各自的状态与验真合同。
