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 = ["\x75\x6E\x64\x65\x66\x69\x6E\x65\x64",
-
.................
-
])})();
-
-
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