進入首頁后闪幽,根據(jù)搜索按鈕進行搜索,url為:https://www.thepaper.cn/searchResult.jsp
這是一個POST請求感挥,參數(shù)為:
inpsearch: 紅旗h5
codeData: LsF0e2W1esW8kI0H
seeda: gzA1%2BNaOjkJv1TEQV8BlnrOqr2Zg9vWXwjsZTtzbeyA%3D
suuid: e20225ee-f703-43a9-a8b1-c399b3c05712
sckval: 48da52276a132e1f1811b2838ab8b913
上述參數(shù)中淌实,codeData和suuid可以直接獲取冻辩,url為:https://www.thepaper.cn/getCheckCodeData.jsp
發(fā)送post請求就可以拿到(見下圖)
接下來就是seeda和sckval的獲取
利用瀏覽器調(diào)試工具搜索功能猖腕,直接搜索seeda,可以看到是在login.js里面生成的恨闪。
然后我們會發(fā)現(xiàn)倘感,seeda和sckval都是在里面生成的,這里還是比較簡單的
打上斷點咙咽,然后我們發(fā)現(xiàn)老玛,codeData和suuid就是我們之前獲取的,o.seeda和n的值就是seeda和sckval钧敞。
ok,接下來我們看下參數(shù)是否是一致的
經(jīng)比對蜡豹,發(fā)現(xiàn)確實是seeda和sckval的生成邏輯
看生成邏輯可以得出:sckval是對codeData和uuid的組合進行CryptoJS.MD5處理得到的,
seeda是encodeURIComponent 處理s得到的溉苛,而s是對codeData進行
CryptoJS.AES.encrypt加密生成的镜廉。
幸運的是CryptoJS是node.js的一個包,encodeURIComponent是js自帶的方法愚战,都可以直接找到娇唯。
分析出方法之后,怎么使用python執(zhí)行呢
我試過使用AES包去解決凤巨,AES.new(key,model,iv) 當model為ECB模式的時候會報錯视乐,
就很懵逼,干脆就直接使用pycharm安裝node.js環(huán)境算了敢茁。
教程鏈接參考:https://blog.csdn.net/weixin_45081575/article/details/105223948
安裝完了node.js環(huán)境之后佑淀,就可以在pycharm的Terminal中執(zhí)行命令,安裝這個包了
npm install crypto-js
這個命令是為了給node.js環(huán)境安裝crypto-js彰檬,這里面有CryptoJS
接下來是改裝的js代碼
const CryptoJS = require("crypto-js"); //引入crypto-js
function bs(codeData,suuid) {
var t = {};
var e = CryptoJS.lib.WordArray.random(16).toString(CryptoJS.enc.Hex)
, i = CryptoJS.enc.Utf8.parse(codeData);
md = CryptoJS.mode.ECB;
var s = CryptoJS.AES.encrypt(codeData, i, {
iv: CryptoJS.enc.Hex.parse(e),
mode: md,
padding: CryptoJS.pad.Pkcs7
});
seeda = encodeURIComponent(s);
var n = CryptoJS.MD5(codeData + suuid).toString();
return [n,seeda] // 返回列表中n就是sckval伸刃,seeda就是seeda
}
然后使用python來執(zhí)行這段代碼:
import execjs
# execjs是python執(zhí)行js的一個包,使用pip install pyexecjs即可安裝
with open('1.js','r',encoding='utf-8') as r:
js = r.read()
jsdm = execjs.compile(js)
result = jsdm.call('bs','AKaqtzq2BMBN3ywv','c6163de3-5af1-492f-bd49-80de9cd65628')
print("seeda:{}".format(result[1]))
print("sckval:{}".format(result[0]))
測試結果:
經(jīng)對比逢倍,結果一致捧颅。請求列表頁需要把response-cookie更新進cookie中即可。