◆

wxapkg-unpack:微信小程序反编译与样式还原

2026-09-19 04:000

wxapkg-unpack:小程序反编译

想 1:1 复刻某个小程序的样式,或者参考它的交互写法时,让 agent 从本机微信缓存里找到对应的 .wxapkg,解密解包,再把样式还原成可读的 WXSS。

2026-10-06 起,这项能力并入 wechat-mp skill:脚本在 wechat-mp/scripts/wxapkg/,说明在 wechat-mp/references/wxapkg-unpack.md,触发词不变。

本能力基于开源项目 wux1an/wxapkg。上游 v2 只有 GUI,这里复用它的 wechat Go 包,包成命令行工具,并补上「按页面文字找小程序」和 WXSS 还原两项能力。

仅供学习研究,或复刻你有权使用的设计。不要分发解出来的源码,也不要用它绕过授权。

用法

直接说目标即可:

  • 「反编译一下这个小程序,页面上有『xxx』这句话」
  • 「解包刚才打开的那个小程序,把样式抠出来」
  • 「照着 xx 小程序 1:1 复刻这个页面」

agent 会依次做这几步:

  1. 你先在电脑版微信里打开目标小程序,把要参考的页面都点一遍,分包也会被缓存下来。
  2. 定位 wxid:用页面上看得见的文字搜索缓存包,找不到时就按修改时间列出最近打开的几个。
  3. 解包:按 wxid 自动取最新版本目录,解密后解到临时目录,JS/HTML/JSON 默认会美化。
  4. 还原 WXSS:生成 app.wxss、pages/**/*.wxss、components/**/index.wxss。

首次运行需要本机有 git、go(1.25 及以上)和 node。脚本会自动拉取上游代码,编译到 ~/.cache/vft-kit/wxapkg/,之后直接复用。

解出来的东西怎么看

解出来的是编译产物,不是原始工程,各类信息分散在下面几个位置:

想要什么去哪找
页面列表、tabBar、窗口配置app-config.json
样式还原出的 .wxss 文件
页面逻辑、data、文案、事件app-service.js 里每个 define("pages/xxx/xxx.js", ...)
页面结构(WXML)已编译成 $gwx 函数,没法直接读;根据 data 和 WXSS 类名推断结构,再对照截图
图片素材assets/ 等原路径

拆逻辑、导出数据

解包后再跑一次 split-service.mjs,把 app-service.js 按模块拆到 _modules/,城市表、话术、文章这类纯数据模块直接导出成 _data/*.json。移植数据时从 JSON 生成代码,不要让模型手抄长段中文,手抄会漏字改字。

新版基础库把每页样式放在 pages/**/x.html 里,extract-wxss.mjs 已同时扫描这些文件;如果还原结果是 restored 0,先确认用的是最新脚本。

复刻到 Taro / H5 的要点

  • 先搬设计 token:app.wxss 里 body{--ink:...} 这类变量就是整套配色,直接改成 CSS 变量使用。
  • 单位:原包用 vw 的可以原样照搬;用 rpx 的,按目标项目的设计稿宽度换算。
  • 标签选择器要改写:wx-view、wx-text、wx-button 在目标项目里不存在,要改成 class 或普通元素选择器。
  • 按钮边框:原包一般会重置 wx-button::after{border:0},Taro H5 的 <button> 默认带边框,复刻时要同样重置样式,或者换成 view。
  • 原包里 @media (min-width:600px) 的大屏兜底样式也一起搬过来。

踩坑

现象原因 / 处理
列表里找不到目标小程序缓存还没生成或目录没探测到。重新打开小程序;仍然找不到就让 agent 手动指定缓存根目录
用文字搜不到这句文案可能是接口下发的,没写在包里。改用标题、按钮、tab 名这类固定文字搜索
报「加密文件」解密密钥就是 wxid,传入的路径里缺了 wxid,需要显式指定
同一个小程序有多个版本默认取修改时间最新的那个版本目录;要指定旧版本就直接给版本目录
clone 或编译超时设置代理后重试,Go 依赖可用 GOPROXY=https://goproxy.cn,direct
上游有更新让 agent 带 --rebuild 重新拉取并编译

另外,解包产物、截图这类中间文件都放在临时目录,不要放进项目源码目录。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEwxapkg-unpack:微信小程序反编译与样式还原加载中