微信小程序反编译之electron自动更新

微信小程序反编译之electron自动更新

月光魔力鸭

2020-07-08 09:46 阅读 713 喜欢 0 electron autoupdate 微信小程序 反编译

前段时间做了个微信小程序反编译的小东西,不过因为功能不全,没加分包处理,正好处理下加上,又考虑到后续可能的更新情况,准备上手增加下更新功能。

解密文章: 微信小程序解密反编译之node实现 软件获取:https://shop.licran.com/index/detail/a5ec6165-7f4f-4b8e-bf39-51559ed48396.html

小东西

使用electron实现的微信小程序反编译的桌面软件,用来反编译从手机里面拿到的微信小程序的wxapkg 文件。 实现的功能:

功能表现

此处有个gif录制,展现功能

程序更新

目前没有增加自动更新功能,由于昨天才刚接触,只是增加了一个检查更新的主动触发功能。

检查更新

点击检查更新。

额,昨天更新了..我再重新安装个旧版本

更新日志..有点丑,没做美化

由于做的是本地更新,所以进度条没做..目前只做了个进度提醒,下载完成后会自动更新的。

程序更新思路

本来查了下electron的官方API,他有一个autoUpdater模块,结果搜了下文章,全是electron-updater的。这里就说下这个模块的。

首先,这个模块需要配合electron-builder打包来实现的。

大体思路:

上代码

/***
 * 处理程序更新事项
 */
const { autoUpdater } = require("electron-updater");


module.exports = function (mainWindow, ipcMain) {

    // 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写
    let uploadUrl = 'http://localhost:8888/';
    console.log(uploadUrl);
    const message = {
        error: '检查更新出错',
        checking: '正在检查更新……',
        updateAva: '检测到新版本,正在下载……',
        updateNotAva: '现在使用的就是最新版本,不用更新'
    }
    autoUpdater.autoDownload = false
    autoUpdater.setFeedURL(uploadUrl);
    // https://github.com/electron-userland/electron-builder/issues/1254
    // if (process.env.NODE_ENV === 'development') {
    //   autoUpdater.updateConfigPath = path.join(__dirname, 'default-app-update.yml')
    // } else {
    //   autoUpdater.updateConfigPath = path.join(__dirname, '../../../app-update.yml')
    // }
    autoUpdater.on('error', function (error) {
        mainWindow.webContents.send('notify', message.error)
    });
    autoUpdater.on('checking-for-update', function () {
        mainWindow.webContents.send('notify', message.checking);
    });
    autoUpdater.on('update-available', function (info) {
        mainWindow.webContents.send('updateInfo', info)
    });
    autoUpdater.on('update-not-available', function (info) {
        console.log('not availanble');
        console.log(info);
        mainWindow.webContents.send('notify', message.updateNotAva);
    });
    autoUpdater.on('download-progress', function (progressObj) {
        console.log('开始下载数据-----')
        console.log(progressObj)
        mainWindow.webContents.send('downloadProgress', progressObj)
    });
    autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
        ipcMain.on('isUpdateNow', (e, arg) => {
            console.log('开始更新')
            autoUpdater.quitAndInstall()
            mainWindow.destroy()
            // callback()
        })
        mainWindow.webContents.send('isUpdateNow')
    })
    ipcMain.on('downloadUpdate', () => {
        // 下载
        console.log('开始下载')
        autoUpdater.downloadUpdate()
      })
    ipcMain.on('checkUpdate', (event, arg) => {
        autoUpdater.checkForUpdates();
    })
}

前端页面代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>微信小程序反编译工具</title>
    <link rel="stylesheet" href="plugins/index.css">
</head>

<body>
    <div class="header"></div>
    <div class="content">
        <span class="btn" id="btn">选择微信小程序wxpkg</span>
        <span class="btn" style="margin-top:30px;" id="btn2">选择微信小程序分包wxpkg</span>
        <input type="hidden" name="subpath" value="">
        <span class="update"><a href="javascript:;" id="btn3">检查更新</a></span>
    </div>
    <footer class="footer">
        <!-- <p>xxxxx.com</p> -->
    </footer>
</body>

</html>
<script src="plugins/jquery-1.9.1.min.js"></script>
<script src="plugins/layer/layer.js"></script>
<script>
    const { ipcRenderer, shell } = require('electron')
    ipcRenderer.on('notify',(event,arg)=>{
        layer.msg(arg);
    });
    ipcRenderer.on('updateInfo',(event,arg)=>{
        //进行提示是否更新
        layer.open({
            type : 1,
            title : '软件更新',
            btn : ['确认更新','取消'],
            content : arg.message.replace(/\\\\n/g,'<br />'),
            area : ['80%','80%'],
            yes : function(index){
                layer.closeAll();
                layer.load(1);
                layer.msg('准备下载')
                ipcRenderer.send('downloadUpdate')
            },
            cancel : function(){
            }
        });
    })
    ipcRenderer.on('downloadProgress',(event,arg)=>{
        console.log(arg);
        layer.msg(parseInt(arg.percent)+'%',{shade : 0.3,time:300000});
    })
    ipcRenderer.on('isUpdateNow',(event,arg)=>{
        console.log('下载完毕,准备更新')
        ipcRenderer.send('isUpdateNow');
    })
    ipcRenderer.on('anafail', (event, arg) => {
        layer.closeAll();
        layer.alert('未选择文件', { title: false });
    })
    ipcRenderer.on('openFileSuc',(event,arg)=>{
        console.log(arg);
        layer.load(2);
        ipcRenderer.send('anafile',{filePath : arg})
    })
    ipcRenderer.on('anafail2', (event, arg) => {
        layer.closeAll();
        layer.alert('未选择文件', { title: false });
    })
    ipcRenderer.on('openFileSuc2',(event,arg)=>{
        console.log(arg);
        layer.load(2);
        var folderPath = $('[name="subpath"]').val();
        ipcRenderer.send('anafile2',{filePath : arg,folderPath : folderPath})
    })
    ipcRenderer.on('anasuc', (e, a) => {
        $('input[name="subpath"]').val(a);//将此数据放在分包数据zhong
        layer.closeAll();
        layer.alert('解析完毕,请在原路径查看', { title: false }, function () {
            layer.closeAll();
            shell.showItemInFolder(a);
        });
    });
    ipcRenderer.on('anasuc2', (e, a) => {
        layer.closeAll();
        layer.alert('解析完毕,请在原路径查看', { title: false }, function () {
            layer.closeAll();
            shell.showItemInFolder(a);
        });
    });
    document.getElementById('btn').onclick = function () {
        ipcRenderer.send('openFile');
    }
    document.getElementById('btn2').onclick = function () {
        var subpath = $('[name="subpath"]').val();
        if(subpath == ''){
            layer.alert('请先选择主包后再选择分包');
            return;
        }
        ipcRenderer.send('openFile2');
    }
    document.getElementById('btn3').onclick = function(){
        ipcRenderer.send('checkUpdate');
    }
</script>

注意

在更新的时候会报错,我在项目中新建了一个文件dev-app-update.yml,内容如下:

provider: generic
url: 'http://127.0.0.1:8888/'

等全部调试完毕后,还需要将新版本提交到服务端,并永久提供一个可下载的服务.. 不过考虑到我服务器这小水管,要不要提交到oss呢?? 不知道是否可行,有空验证下看看。

微信小程序反编译软件下载: https://shop.licran.com 可以下载...不过要花钱的哦 ヾ(o◕∀◕)ノヾ

转载请注明出处: https://chrunlee.cn/article/electron-auto-update-of-wxapp.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
目前了解的有两个模块可以实现二维码的模块,一个是node-qrcode ,这个算是比较大众的,不过环境比较复杂,所以...连看都没看;还有一个是小众的 qr-image ,这个比较简单,没有其他环境依赖,安装即可用,因为要实现一个简单的在线二维码生成,就先用这个试试水了
发布自己的nodejs应用后,需要进行管理,目前一般都pm2来进行管理,这里记录下常用的命令。
在通过axios读取页面的时候,经常会碰到gbk的编码,如果不进行转化的话,在获取信息或读取上都会很麻烦。
互联网应用经常需要存储用户上传的图片,比如facebook相册。 facebook目前存储了2600亿张照片,总大小为20PB,每张照片约为80KB。用户每周新增照片数量为10亿。(总大小60TB),平均每秒新增3500张照片(3500次写请求),读操作峰值可以达到每秒百万次
在开发项目过程中,经常需要将开发的项目部署到服务器上,但是每个环境都有每个环境的配置等等,如果每次打包的时候都要去调整(可能删除、替换等),那就很烦人了,这里分享下自己实现的几个简单的小工具(当然这个工具可能只对我自己有用),希望能够帮到你。
为什么要读取图片呢?需求来源于这里。我有一大堆的ppt文件,里面全是图片,想将这些图片全部拿到,然后存储在数据库中,在线上预览,一张张的保存我自然是不乐意的。
最近由于系统需要一些数据进行测试,但是正常的流程都是下载pdf ,打印pdf,然后通过涂写答题卡,将涂写的扫描上传..太麻烦了,想做成简单点,通过程序直接生成..卡在了pdf转图片上,今天抽空找了下库,通过gm可以将pdf转为图片,起码第一步已经实现了,后边的涂学号之前已经做过了。