js逆向解析技巧
一、总结
一句话总结:
1、chrome浏览器的使用--js断点调试 找到js加密的关键部位
2、使用execjs或者pyV8等比较主流的python调用js模块
以对美团店铺抓取时需要破解的_token加密为准。
二、js逆向解析技巧
转自或参考:js逆向解析技巧--selenium_JavaScript_weixin_34235457的博客-CSDN博客
https://blog.csdn.net/weixin_34235457/article/details/91469725
下面内容以对美团店铺抓取时需要破解的_token加密为准。
1. chrome浏览器的使用--js断点调试
以美团为例,点进美团的美食页面,使用f12打开开发者工具。清空当前产生的各种请求,然后点击下一页,会发现重新生成大量的请求。切换到xhr页面观察是否通过ajax进行的请求,我们发现getPoiList开头的请求返回了我们需要的结果。
然而观察该请求所携带的参数我们发现,大多数参数是可以通过找规律的办法得到解决的,但_token这个参数是被加密过得,我们无法获取到它的值,这就需要通过反编译来解决问题。
通常情况下,我们可以全局搜索_token来看是否能找到对其进行加密的js,但有的时候,数据的整个键值对都是被加密过得(参考知乎登陆的加密),我们无法通过键找到对应值得加密算法。这时候可以尝试搜索请求url中的关键部分来定位加密部位。
我们可以看到,根据getPoiList我们找到了_token的的值为d,d又是通过Rohr_Opt.reload(p)方法进行加密得到想要的结果的。
我们在这个位置打上断点,再次执行下一页,当执行到reload时,我们进入找到了_token的加密js,打上断点继续观察就可以看到加密的整个流程了,如果你是js高手,可以尝试解密js,然后用python重写,这样结果的性能会好一些,但我这里使用了python直接调用js的方法进行加密。
以上就是js加密的关键部位了。到这里chrome的断点调试完成。
2. python实现js代码的调用
通常来讲,使用execjs或者pyV8是比较主流的python调用js模块,但因为我两者都安装失败了,暂时没法使用,因此使用selenium的execute_script方法进行js调用。首先,我们将其改造成一个html文件rohr.html,并且为其添加一个可被外界调用的返回函数ssss,如下:
-
<html>
-
<head>
-
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
-
<title>Checkbox</title>
-
<script type="text/javascript">
-
var Rohr_Opt = new Object;
-
Rohr_Opt.Flag = 100007;
-
Rohr_Opt.LogVal = "rohrdata";
-
-
(function() { var _$_543c = ["x75x6Ex64x65x66x69x6Ex65x64",
-
.................
-
])})();
-
-
function ssss(url){
-
return Rohr_Opt.reload(url);
-
}
-
</script>
-
</head>
-
<body></body>
-
</html>复制代码
使用python对其进行调用:
-
from selenium import webdriver
-
import os
-
-
file_path = 'file:///' + os.path.abspath('rohr.html')
-
print(file_path)
-
browser = webdriver.Chrome()
-
browser.get(url=file_path)
-
jv = "https://bj.meituan.com/meishi/api/poi/getPoiList?cityName=北京&cateId=0&areaId=0&sort=&dinnerCountAttrId=&page=3&userId=&uuid=7dc6d913fda1472c8d42.1552289338.1.0.0&platform=1&partner=126&originUrl=https://bj.meituan.com/meishi/pn3/&riskLevel=1&optimusCode=1"
-
data = browser.execute_script('return ssss()', jv) # 这里使用execute_script调用了ssss函数,并传入参数jv
-
print(data) # data即我们加密后的_token
-
browser.close()复制代码
第一行是rohr.html文件的绝对路径,第二行即我们所需要的_token的加密结果
转载于:https://juejin.im/post/5c893dd36fb9a049a712adc5