一次成功的wx指数接口调用,一次失败的wx指数接口调用

一次成功的接口调用

本来只是做一个wx指数接口的调用,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指数的企图最终失败了。

最后

所以,最后,哪位大佬介绍一个授权平台?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值