微信小程序爬虫解决方案
微信小程序爬虫解决方案
经过多个小程序爬虫的摸索开发,本虫子总结出了一套针对微信小程序的爬虫开发流程。
1.抓包
抓微信包即可,不管是使用VPN方式还是代理方式都行。这边介绍两款VPN抓包工具,安卓下可以使用Packet Capture,IOS下可以使用Stream。抓包的目的是了解目标小程序的请求参数,一般来说,都会带有一些签名字段。
2.反编译
2.1获取微信小程序包
即获取微信小程序编译后的文件,后缀名为.wxapkg。在安卓环境下的路径为 /data/data/com.tencent.mm/MicroMsg/{数字串}/appbrand/pkg/,windows端的路径为 C:\Users{用户名}\Documents\WeChat Files\Applet。安卓端可能会有分包。存在多个小程序包的情况下可以在微信里将小程序删除然后重新打开,最新生成的就是目标小程序的包。
2.2反编译获得源代码
3.寻找签名关键位置
如果代码没有经过混淆,直接搜索关键词,大概率就能找到关键位置。如果经过混淆则需要进行调试。
4.调试
小程序项目一般都通过Webpack进行了打包。参考文章中的分析可知,app.js中的push方法实际上已经在bundle.js中被修改,例如下面两张图所示:
app.js
bundle.js
接下来我们来尝试了解一下小程序项目中一堆匿名方法的入参是什么,以我手头上这个小程序为例,我们在app.js中下一个断点,然后将入参"n"打印一下,不同项目的参数名字不一定相同。如下图
由此我们可以看到,其实n就是bundle.js中的"c"方法:
其他的入参同理可得,这边不再赘述。
5.生成调用方法
到这一步,我们已经拿到了加密代码所在的位置,以及必要的参数,那接下来就是将关键的方法拆分出来,尝试运行。
这里有很关键的一步,由于上文提到的c方法为bundle.js中的内部方法,我们自己构建的js代码并不能直接访问。为了解决这个问题,我们修改bundle.js,将c方法赋值给Object.prototype ,如下图:
然后我们的js代码可以写成这样:
上图代码的具体逻辑取决于需求,由于大部分代码是bundle.js中复制过来的,所以会存在很多我们不需要的代码,这些代码一定要删掉,不然很可能引起其他报错。
接着我们尝试运行一下:
成功了!!!
6.脱离nodejs环境
上文中,我们编写的js文件已经成功地运行,但是由于这样的js代码依赖于node环境,而我们的爬虫可能是java,.net,python等其他语言编写的,因此我们要将其转化为原生的js代码,以求脱离node环境运行。
其实方法也很简单,就是再使用webpack打包一次即可,注意打包的时候去掉console等浏览器才有的对象代码。以我的项目为例,打包后的js文件如下:
很长,但是能用? ????????????????
使用浏览器测试一下:
成功!!!?
webpack打包命令
//全局webpack
npm install webpack webpack-cli -g
//打包工具
npm install webpack webpack-cli --save-dev
//创建webpack.config.js
const { resolve } = require('path')
module.exports={
mode:'development',
//目标js文件
entry:'./sign.js',
output:{
//输出js文件
filename:'echongdian_sign.js',
path:resolve(__dirname,'dist')
},
module:{
rules:[
]
},
}
//最后一步
然后命令行webpack就行了