案例链接:aHR0cHM6Ly93d3cudG91dGlhby5jb20vP3dpZD0xNjU3ODU1MTI2MDMz
一、页面分析
1、话不多说,直接抓包。发现我们想要的内容就在这接口,对应的参数可以看到signature签名。
二、参数分析
1、我是采用的直接搜索_signature,断住后可以看出来加密的参数就是我们访问的url地址,x()函数返回的内容就是加密结果了。
2、定位到了加密位置我们来看一下具体的加密过程,步进过后,我们可以发现一个相对比较绕的或者与三木表达式。其实归根到底就是一顿才做过后,把window.byted_acrawler.sign()方法赋值给了r
依依拆开进行分析:
2.1、 将window.byted_acrawler赋值给n,如果n = null 的话就返回True ,显然这里n=False
2.2、 如果n= void 0 则返回True,其实在js中void 0代表的就是undefined,这里返回也是False
2.3、 将n对象中的sign方法赋值给r,如果n.sign=null 则返回True,这里等于False
2.4、 三目表达式如果 r != undefined 则返回的内容就是r.call(n, o) 否则就返回 undefined,显然这里是要执行方法然后拿到加密结果的。
这里的r.call(n,o) = r.call(对象,参数),对于js中的call方法第一个参数是必须要被执行的对象,接下来是参数。大体类似于python的execjs库,具体请自行百度。
2.5、 搞明白了这些,我们在控制台亲自模拟一遍加密过程,可以来出来是和正常加密的结果一致的
2.6、我们步进到加密方法内部一探究竟,发现他会跳转到acrawler.js里面
三、本地调试
1.将整个复制保存出来,方法webstrom中,然后我们在创建一个html的页面进行调试。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>点赞收藏并转发</title>
</head>
<body>
<script src="acrawler.js"></script>
<script>
url = 'https://www.kengnidian.com'
let result = window.byted_acrawler.sign({url:url})
console.log('加密结果:' + result)
</script>
</body>
</html>
2.查看加密结果,虽然和原生生成的对比长度短了点,但是不影响正常使用。
四、本地js调试
1.在本地直接执行
glb = "undefined" == typeof window ? global : window
首先在js代码的头部,我们可以看到他检测了一下window环境,如果window不存在的话global就为全局变量,否则window为全局变量。要知道window是浏览器常使用的全局变量,global是nodejs常使用的,他这里就是在检测你的环境是否是浏览器。
所以我们要在头部给一个window对象=global,也可以使用导入jsdom模块使用dom补充window。两种方法自选
2.执行报错,缺少doucument.referrer环境,我们到实际环境中进行查找后补全。
3.执行报错,缺少sign()方法,经推导排查后找到是第二个jsvmp的位置出现了问题,这里再一次检测了,我们本地的运行环境。
解决方案:
我们将此jsvmp拆开来,分为三部分观察会清晰一点,在arr数据这里,头部有一个检测exports特征的三木运算符,这个特征是只有在node环境才会有的,我们到浏览器中调试是等于undefined,我这里是分别在本地和浏览器打印后,将这个长度为36的数组对比查看发现的。这里我们直接吧他改成void 0即可。
报错位置
本地
浏览器
4.调试报错,缺少href,这里我是直接把浏览器的location直接拔了下来。
5.调试报错,缺少ua,这里也是一样
6.全部补齐后运行出来结果了,确认可以正常使用
7.但是相对于浏览器的有点短,后来通过两位大神指点,补充了cookie得到了长度一样的结果
最终python调用,拿到正常数据,感谢你的观看!希望本文对你有所帮助!