3.4 KiB
3.4 KiB
协议文件校验误报修复(1.4.17)
结论与原因
此前性能优化引入了兼容性回归。安装版 1.4.16 使用 Python 3.12.14;在本机 Windows 上,同一份未变化的 WXWork.exe,Path.stat().st_ctime_ns 返回创建时间,而 os.fstat().st_ctime_ns 返回变更时间。跨接口比较导致错误提示“企业微信文件在校验期间发生变化,请重新检测”。Python 3.11.9 没有表现出相同差异,所以此前仅使用 3.11 的源代码回归未发现问题。
真实文件修复前复现记录:real-before.json;修复后:real-after-python312.json、real-after-python311.json。两种运行时得到相同 SHA256。
修复
C:\wechat_rpa\wecom_native_sender.py:统一通过只读打开文件后使用fstat获取身份;计算哈希期间保持原句柄打开,再打开路径核对身份,消除跨接口字段差异。- 保留卷、文件 ID、长度、修改时间、变更时间核对,实际变更/替换仍会拒绝。
- 保留同轮只读检测复用;真正发送前仍完整校验,PID 重用与账号切换不会绕过检查。
- 原文件备份:
C:\wechat_rpa\backups\protocol-file-identity-20260917\wecom_native_sender.py。 C:\kefu\wechat_rpa不包含此原生协议模块,没有为它复制新增协议功能。
验证
- Python 3.12.14:105 项协议相关隔离测试全部通过,0 失败、0 错误、0 跳过。
- Python 3.11.9:同样 105 项全部通过。
- 其中新增 8 项覆盖真实 Windows 临时文件时间差异、跨接口元数据差异、同长度/时间文件替换、哈希中修改、只读缓存、PID 重用、发送前重新校验。
- 独立复核也在两种运行时各通过这 8 项。
- Python 3.12 完整本机只读检测:企业微信 5.0.11.6018、当前登录账号、当前账号消息库均已核对,错误列表为空,耗时约 2.48 秒。见
source-probe-python312.json。 - 当前安装版数据目录缺少此账号的首次发送及回执记录,因此状态仍为
native_validation_required;本次不发送消息、不伪造回执、不启动监听、不修改任务队列。
安装包
- 1.4.17 使用生产构建环境 Python 3.12.14 打包,包含
python312.dll。 - 生产打包自检通过;独立检查冻结 PYZ 确认包含本次
fstat修复,冻结函数在 Python 3.12 的临时文件哈希测试通过,UI 资源匹配,没有混入私有配置。 - 主程序 SHA256:
dceb8289a6d5d8a9fb5b6e14ce7acd5a1dd82399f3ea3e1d74ae0cb24cc7ac19。 - 打包后真实验证:用新 EXE 的
--protocol-diagnostics隐藏运行只读诊断,退出码 0,错误列表为空,企业微信版本/当前登录/消息库均核对通过。协议构建校验约 2.33 秒;包含额外模块静态扫描的完整深度诊断共 10.69 秒,不能与普通按钮检测耗时直接对比。结果见frozen-protocol-diagnostics.json。 - 打包版同样保留缺少真实回执时的首次发送验证要求。
- 安装包:
C:\wechat_rpa\releases\甄AI客服-安装包-v1.4.17.exe。 - 安装包 SHA256:
ec11843342b3f136ff1d017489bbc388ac55818b026731c1d413d1be2e8d8165。 - 本次没有关闭用户当前 1.4.16 程序,没有替换正在使用的安装目录,也没有发布到服务器。退出旧版后安装 1.4.17,再点击“检测本机协议”;如提示首次发送验证,需按当前账号完成真实验证。