需求调研
中秋到了,又到了在家庭群发祝福语的时候了,如何发,才能成为家里老人面前最精彩的那一人,深深的困扰着橡皮擦,知道我发现了下面这个小程序,有解了!
这风格简直太熟悉了,四大姑三大姨不一直在发送这些【美丽的】图片么,当打开图片的详情之后,发现下图更加确定了,我必须要采集一下这个小程序。
需求分析
通过简单的抓包,提炼需求如下所示:
抓取封面图,重点为获取接口响应数据
抓取详情页文案,解码加密参数
接下来就是对该小程序进行抓包,得到如下内容:
请求的地址是:
https://www.ezhizhu.com/app/index.php?i=35&t=0&v=1.1.0&from=wxapp&c=entry&a=wxapp&do=listdata&&m=tc_bestgood
复制代码
但是请求参数中包括了一个 sign
参数,碰到这种情况使用普通手段已经无法解决了,需要使用解包手段。PC 端小程序解包程序使用 小锦哥 小程序工具
。
解包实战
点击目标 PC 端目标小程序,然后在本地找到 __APP__.wxapkg
文件。该文件在微信文件管理的目录中。
进入到该目录之后,跳转到 WeChat Files
文件中,然后寻找 Applet
文件夹。
小程序文件夹在新版本的微信中以 wx
开头,然后进入文件夹得到一个数字目录,进入即可找到 APP.wxapkg
文件。
① 使用小程序工具进行解密
安装小程序解包工具之后,按照下图选择对应文件,然后选择解密后的保存路径,点击开始解密即可。
解密之后的文件如下所示。
拿到该文件之后,就可以对其反编译操作,图示如下。
反编译成功出现下述弹窗。
此时在目标目录出现一个文件夹,进入即可发现相应的代码文件。
下图是解包之后的源码。
② 分析源码
接下来打开源码文件,很容易就分析到其目标数据,顺带也可以看到其加密参数 sign
的来源,即 a.Data.sign
。
简答查找源码,得到 sign
的加密函数,如下所示。
Sign: function() {
var t = Math.round(new Date().getTime() / 1e3), a = this.md5("taichengagressor@2018#Y2MyZTlmYmUxMWY5MjJkODg4MTM2ODQ2MjE3MTFmZWI5OTg=#" + t);
this.Data.sign = a, this.Data.timestamp = t;
},
复制代码
将其转换为对应的 Python 代码时,得到如下内容:
import requests
import time
import hashlib
headers = {
"Host": "www.ezhizhu.com",
"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 MicroMessenger/7.0.4.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF"
}
t = int(time.time())
a = hashlib.md5(("taichengagressor@2018#Y2MyZTlmYmUxMWY5MjJkODg4MTM2ODQ2MjE3MTFmZWI5OTg=#"+str(t)).encode('utf8')).hexdigest()
data = {
"timestamp": t,
"sign": a,
"page":1
}
复制代码
接下来编写完整的请求代码:
import requests
import time
import hashlib
headers = {
"Host": "www.ezhizhu.com",
"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 MicroMessenger/7.0.4.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF"
}
t = int(time.time())
a = hashlib.md5(("taichengagressor@2018#Y2MyZTlmYmUxMWY5MjJkODg4MTM2ODQ2MjE3MTFmZWI5OTg=#"+str(t)).encode('utf8')).hexdigest()
data = {
"timestamp": t,
"sign": a,
"page":1
}
def r():
res = requests.post(
'https://www.ezhizhu.com/app/index.php?i=39&t=0&v=1.1.0&from=wxapp&c=entry&a=wxapp&do=listdata&&m=tc_bestgood',data = data,headers=headers,verify=False)
print(res.text)
if __name__ == '__main__':
r()
复制代码
运行代码,得到下图所示内容:
当看到 JSON 响应串时,任务已经完成。
总结
写到这里,该小程序已经对我们已经没有秘密可言了,剩下的就是简单的 Python 代码处理数据了,本文的重点应放在小程序解包与反编译上,如果掌握了本部分内容,后面所有的小程序都可以使用相同的手法解决,拿它的接口。
评论