Skip to content

修复朋友圈媒体路径凭证错配与打包版 WASM 解密运行时 - #133

Merged
2977094657 merged 2 commits into
LifeArchiveProject:mainfrom
xiaoshengbao:main
Sep 2, 2026
Merged

修复朋友圈媒体路径凭证错配与打包版 WASM 解密运行时#133
2977094657 merged 2 commits into
LifeArchiveProject:mainfrom
xiaoshengbao:main

Conversation

@xiaoshengbao

Copy link
Copy Markdown
Contributor

背景

朋友圈媒体加载存在两个主要问题:

  • 图片 CDN URL 会把 /60/150/200/480 等缩略图路径隐式改写为 /0,但仍携带缩略图 token/key。腾讯 CDN 的路径与凭证绑定,错配后会返回 400。
  • 桌面打包版后端通过 PATH 查找 Node。用户从 Finder 或 Explorer 启动时通常没有开发环境 PATH,WASM helper 无法启动,随后又静默进入不兼容的 Python ISAAC64 fallback,导致图片解密失败。

此外,无有效封面的视频可能把视频下载地址送入图片接口;原始 HTTP 客户端日志也可能记录包含媒体凭证的完整 CDN URL。

修改内容

媒体 URL 与凭证

  • 默认保留 /60/150/200/480 和已有 /0 路径,只规范 HTTPS、token 与 idx=1
  • 仅明确传入 variant=full 时允许请求 /0 原图。
  • 缩略图严格使用 thumb URL/token/key,高清预览严格使用 origin URL/token/key,导出链路复用相同规则。
  • 评论图片不再跨缩略图和原图来源补用凭证。
  • 视频没有图片封面时返回占位状态,不再把视频 URL 发送到图片接口。

打包运行时

  • Electron 启动后端时传入自身绝对路径:WECHAT_TOOL_NODE_EXECUTABLE=process.execPath
  • 使用 WECHAT_TOOL_NODE_MODE=electron-run-as-node,仅在启动 WASM helper 子进程时设置 ELECTRON_RUN_AS_NODE=1
  • 保持 Electron runAsNode fuse 开启,不额外打包 Node sidecar。
  • 源码运行才允许通过 shutil.which("node") 查找 Node。
  • 删除生产链路中的 Python ISAAC64 静默 fallback;WASM runtime 不可用时明确失败。
  • helper 使用持久进程、响应 ID 和线程锁,避免并发请求串线。

错误与日志

  • WASM runtime 不可用返回 503。
  • CDN 返回内容但下载、解密或格式无效返回 502。
  • 只有真实不存在的媒体返回 404。
  • 日志增加媒体来源、尺寸后缀、是否改写、keystream provider、上游状态、响应字节数和诊断 ID。
  • URL、token、key 只记录哈希,不记录原值。
  • 屏蔽 httpx/httpcore 的原始请求日志,并对 Uvicorn access log 中的 url 查询参数整体脱敏。

自动化与打包验收

  • 新增固定加密 JPEG fixture,通过真实 WxIsaac64 WASM 解密并核对 magic bytes 与 SHA-256。
  • 新增缩略图/原图凭证配对、评论图片、视频封面、错误状态、并发 helper、日志脱敏等测试。
  • 新增 Windows x64 与 macOS arm64 无密钥 CI,可在 PR 或手动触发时运行。
  • 扩展 Windows/macOS 最终包 smoke,使用最终应用可执行文件运行 helper,并验证 packaged backend。

验证结果

  • Windows x64:SNS Python 测试 44 项通过,前端测试 116 项通过,桌面运行时与打包契约 46 项通过。
  • Windows x64 Electron 在仅含系统目录的 PATH 下成功运行真实 WASM fixture,不依赖 PATH 中的 Node。
  • macOS arm64:最新媒体与日志聚焦测试 55 项通过,桌面运行时与打包契约 46 项通过。
  • 固定 fixture 解密结果为 image/jpeg
  • keystream SHA-256:a4283a268f8b259572655931aaac1b2e822de7852112284d55bd5d6186e1f657
  • JPEG SHA-256:499a0591e13af2ab06c1807a9faae6adced4092c98d56fc0f288f5b2a2e61b35
  • Nuxt 生产构建通过,git diff --check 通过。

兼容性

  • 不修改数据库格式、媒体缓存格式或现有公开查询参数。
  • 平台范围为 Windows x64 与 macOS arm64。
  • 原图仍通过兼容的 /api/sns/media?variant=full 接口请求。
  • 最终签名安装包仍由现有受保护发布工作流生成并执行 smoke。

@2977094657
2977094657 merged commit 3fdf7e3 into LifeArchiveProject:main Sep 2, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants