提前说明下,这个是我在简书上写的笔记,并不是抄袭哈
进入首页后,根据搜索按钮进行搜索,url为:https://www.thepaper.cn/searchResult.jsp
这是一个POST请求,参数为:
inpsearch: 要搜索的内容
codeData: LsF0e2W1esW8kI0H
seeda: gzA1%2BNaOjkJv1TEQV8BlnrOqr2Zg9vWXwjsZTtzbeyA%3D
suuid: e20225ee-f703-43a9-a8b1-c399b3c05712
sckval: 48da52276a132e1f1811b2838ab8b913
上述参数中,codeData和suuid可以直接获取,url为:https://www.thepaper.cn/getCheckCodeData.jsp
发送post请求就可以拿到(见下图)
接下来就是seeda和sckval的获取
利用浏览器调试工具搜索功能,直接搜索seeda,可以看到是在login.js里面生成的。
然后我们会发现,seeda和sckval都是在里面生成的,这里还是比较简单的
打上断点,然后我们发现,codeData和suuid就是我们之前获取的,o.seeda和n的值就是seeda和sckval。
ok,接下来我们看下参数是否是一致的
经比对,发现确实是seeda和sckval的生成逻辑
看生成逻辑可以得出:sckval是对codeData和uuid的组合进行CryptoJS.MD5处理得到的,
seeda是encodeURIComponent 处理s得到的,而s是对codeData进行
CryptoJS.AES.encrypt加密生成的。
幸运的是CryptoJS是node.js的一个包,encodeURIComponent是js自带的方法,都可以直接找到。
分析出方法之后,怎么使用python执行呢
我试过使用AES包去解决,AES.new(key,model,iv) 当model为ECB模式的时候会报错,
就很懵逼,干脆就直接使用pycharm安装node.js环境算了。
安装的过程就不赘述了,大家自行查询就可以啦
安装完了node.js环境之后,就可以在pycharm的Terminal中执行命令,安装这个包了
npm install crypto-js
接下来是改装的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来执行这段代码:
import execjs
# execjs是python执行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]))
测试结果:
经对比,结果一致。请求列表页需要把response-cookie更新进cookie中即可。
|