票房接口获取

实时票房接口获取

票房接口:https://piaofang.maoyan.com/dashboard-ajax

前言

当我们想根据某眼的接口获取票房信息的时候,发现它的接口处的参数是加密的,如下图:

在这里插入图片描述
红色框框的参数都是动态变化的,且signKey明显是加密的一个参数。对于这种加密的参数,我们需要从它们的js文件中找到加密方式,因此我们需要找到signKey所在的位置。

解决方案

1.找到veri.js

在这里插入图片描述
如上图所示,首先需要根据这个路径找到veri.js文件,signKey这个参数就出现在这个里面。这个的具体做法是Edge浏览器的开发者界面,然后找到源代码的部分,这样就可以找到这个文件所在的位置了。

2.找到signKey所在位置

如图所示,signKey的位置位于veri.js中,找到它的快捷方法为:
(1)打开veri.js文件
(2)按下Ctrl+f,然后搜索signKey,这样就能找到它的位置了。
在这里插入图片描述

3.分析它所处的这个函数的内容

可以找到请求参数里面的几个变量,这说明我们找到的文件没有错。包含的参数分别是:

  • timeStamp:时间戳
  • User-Agent:代理
  • index
  • channelId:通道id
  • sVersion:版本号

这些都是请求参数里面包含的。
在这里插入图片描述

index参数的获取

因为我们发现index的获取方式中含有一个我们不知道的参数o(250),则我们将其中的o(250)在控制台输出,如下图,得到字符串floor:
在这里插入图片描述
这说明Math[o(250)]其实是一个向下取整的函数,故index的获得方式就是:

Math.floor(1e3 * Math.random() + 1)

将它用Python实现就是:

math.floor(1000 * random.random() + 1)
signKey参数的获取

通过调式(加断点),可以发现signKey的值是由这个语句获得的:
在这里插入图片描述
而这个语句中含有另一个参数d和o(262),对于o(262),可以在控制台得到它的值,如下图所示:
在这里插入图片描述

对于参数d,我们继续寻找,发现d的产生位置:

在这里插入图片描述

然后d是和变量i相关的,i的定义如下:
在这里插入图片描述
然后在调试的时候可以知道d的值其实是一段变量i中的key和value的字符串,如图:
在这里插入图片描述
而i在还有一个变量key我们是不知道的,但是由于key的值是由o(260)产生的,则我们可以将它看出一个常量,控制台输出如下:
在这里插入图片描述

由此跟d相关的变量我们都可以知道了,跟它相关的变量如下:

  • User-Agent:代理
  • timeStamp:时间戳
  • index
  • channelId
  • method
  • sVersion
  • key
    由此可以生成跟d相关的字符串了,d的格式:
method=Get&index=123&...

d产生后,我们再回到生成signKey的位置:

在这里插入图片描述
此时需要注意是先对d进行了一些字符串替换,然后进行到加密函数中去的

继续调式,进入到加密函数当中:
在这里插入图片描述

这是一个md5加密的过程。

我们先对该函数进行验证,看是否会生成所需要的signKey:

在这里插入图片描述

以上图的d作为输入,得到结果如下:
在这里插入图片描述

最后的结果是一致的,说明就是这个函数。

综上所述,获取signKey的步骤为:

  • 将变量i中的参数全部获取
  • 将i中参数的key和value进行拼接,形成字符串d
  • 将d输入到加密函数中进行加密
  • 得到signKey

到此,signKey的获取也就结束了,那么接口破解也就完成了。

运行结果

在这里插入图片描述

关键代码

完整代码请前往:地址

def getIndex(self):
     return math.floor(1000 * random.random() + 1)

 def getD(self):
     # d是各种参数的组合,包括timeStamp,User-Agent,index,channelId,sVersion以及key
     self.pay_loads['index'] = self.getIndex()
     self.pay_loads['timeStamp'] = int(time.time() * 1000)
     logger.info('timeStamp:' + str(self.pay_loads['timeStamp']))
     d = 'method=GET&timeStamp=' + str(self.pay_loads['timeStamp']) + '&User-Agent=' + self.pay_loads['User-Agent'] + '&index=' \
         + str(self.pay_loads['index']) + '&channelId=' + str(self.pay_loads['channelId']) + '&sVersion=' + str(self.pay_loads['sVersion']) + \
         '&key=' + self.key
     # 找出目标字符串中的所有空白字符并用空格代替
     d = d.replace(r'/\s+/g'," ")
     return d

 # 得到signKey
 def getSignKey(self):
     md5 = hashlib.md5()
     d = self.getD()
     md5.update(d.encode('utf-8'))
     signKey = md5.hexdigest()
     self.pay_loads['signKey'] = signKey
     logger.info("signKey:" + signKey)

总结

本部分关键点在于找到请求参数所在文件的位置,然后逐步顺腾摸瓜即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzl2040

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值