一次成功的接口调用
本来只是做一个微信指数接口的调用,python代码如下:
urllib3.disable_warnings()
page = SessionPage()
state = page.post(url='https://search.weixin.qq.com/cgi-bin/wxaweb/wxindex',
json={
"openid": "xxxxxxxxxxx",
"search_key": "xxxxxxxxxxxx",
"cgi_name": "GetMultiChannel",
"query": ["母亲节"],
"start_ymd": "20210422",
"end_ymd": "20230518"
},
headers={
'Host': 'search.weixin.qq.com',
'referer': 'https://servicewechat.com/wxc026e7662ec26a3a/42/page-frame.html',
'user-agent': 'Mozilla/5.0 (Linux; Android 7.1.2; SM-G9810 Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile Safari/537.36 MMWEBID/3687 MicroMessenger/8.0.27.2220(0x28001B36) WeChat/arm32 Weixin NetType/WIFI Language/zh_CN ABI/arm32 MiniProgramEnv/android',
'Content-Type': 'application/json'
}, show_errmsg=True,
verify=False)
print('state:' + str(state))
print('响应:' + page.html)
代码很简单,根据Charles的拦截,把参数拼装上去,请求直接就成功了!
一次失败的接口调用
正当我高兴的时候,再发一次请求,响应变成了:{"code":-10000,"msg":"auth failed."},失败了!
不可置信,多试几次,一直都auth failed,确信,确实是失败了!
所以就开始找失败的原因。
多次比对Charles的参数,发现请求里面的search_key是个动态参数,会定时变化。
所以以下内容就是研究search_key为啥会变,怎么变的内容。
逆向源码
wx指数数据来源于wx指数这个小程序,所以得逆向wxapkg,到源码里面探究一番。
在模拟器上找到对应小程序wxapkg包,拖出来后,用wxappUnpacker解包出来,发现一大堆错误。
主要就是app.json配置错误,Error: xxx.js、 _typeof3 is not a function等错误,逐个解决后,用wx开发工具打开源码,查看对应代码:
i = require("./login"),
r = i.checkLogin
! function a(h) {
return r().then(function (r) {
h && n.setId();
var l = t(t({
openid: r.openid,
search_key: r.search_key
}, n.data), e);
n.log("➡️", "request\n", l), n.timestamp = Date.now(),
wx.request({
url: "https://search.weixin.qq.com/cgi-bin/wxaweb/".concat(n.cgi),
data: l,
method: "POST",
header: {
"Content-Type": "application/json"
},
success: function (t) {
......
可以看出,请求的参数search_key来源于r.search_key,r来源于i.checkLogin,i来源于login,找到login.js,其中的checkLogin定义如下:
checkLogin: function () {
var n = wx.getStorageSync(e);
return n ? new Promise(function (e) {
e(JSON.parse(n));
}) : r();
}
所以,参数里面的search_key是从缓存里面获取的一个值,其存储地方为:
return wx.login({
success: function (o) {
! function t() {
return wx.request({
url: "https://search.weixin.qq.com/cgi-bin/searchweb/weapplogin",
data: {
appid: "appidxxxxxxxxxxxxxxxxxx",
js_code: o.code
},
success: function (o) {
var r = o.data,
u = void 0 === r ? {} : r;
try {
0 == u.errcode ? (wx.setStorageSync(e, JSON.stringify(u.data)), c = 0, i = null,
n(u.data)) : a(u, "weapplogin", t);
} catch (n) {
a(n, "weapplogin", t);
}
},
fail: function (n) {
a(n, "weapplogin", t);
}
});
}();
},
所以,这个存储的值来源于cgi-bin/searchweb/weapplogin接口的响应,而这个接口需要传入appid和js_code两个参数,appid好说,js_code来源于wx.login的code,这就不好搞了。
翻了半天,没有看到对wx.login()进行描述的详细内容,但是根据互联网上的一些帖子,说这块已经有成熟的wx授权平台了,可以通过其平台获取code,而无需调用wx.login()。
所以,通过接口调用wx指数的企图最终失败了。
最后
所以,最后,哪位大佬介绍一个授权平台?