1. 寻找x-for-with位置
2. 寻找加密函数
3. 将某团原有的js扣出来
4. 本地调试
5. 模拟请求
1. 寻找加密参数
1) 打开网址
2) 打开F12打开浏览器自带的调试工具
3) 打开network
4) 发现加密参数X-FOR-WITH。 (观察发现这个值是一个base64编码后的值)
2. 尝试使用全局搜索搜素 X-FOR-WITH
无任何发现
3. 直接将鼠标放在initiator上面 会弹出一个和函数调用栈, 将鼠标放在第一个上面 然后 美化后在刚跳进去的函数处打一个断点,紧接着一直单步跟进
4. 当 r 为 send的时候(原生js 发送ajax的一个函数), 会发现一个 _() 函数, 这个函数就是要找的X-FOR-WITH值, p(w) 中的 p就是加密函数
5. 将鼠标放在 函数 p上 跟进去
经过分析 函数v 为验证浏览器环境的, 可以直接删掉
e 是 w对象
r为 将js对象转为Json后的键值对
t是一个定值 jvzempodf8f9anyt
6. 将 releasex.util.convertStringToBytes 扣下来
也是同理, 直接鼠标放上去 将整个相关的代码全部扣下来并将函数重命名为 convertStringToBytes因为这个js代码是经过混淆的, 如果不改的话变量名可能会被覆盖
改写后代码
convertStringToBytes = function(e, r) {
if (r == null || r.toLowerCase().replace(/ |-/g, "") == "utf8") {
var t = []
, n = 0;
e = encodeURI(e);
while (n < e.length) {
var i = e.charCodeAt(n++);
if (i === 37) {
t.push(parseInt(e.substr(n, 2), 16));
n += 2
} else {
t.push(i)
}
}
return t
} else if (r.toLowerCase() == "hex") {
var t = [];
for (var n = 0; n < e.length; n += 2) {
t.push(parseInt(e.substr(n, 2), 16))
}
return t
}
return null
}
7. 接下来的也是同样的操作, 缺什么 扣什么
放一张最后结果图
var p = function(e) {
e.cts = (new Date).getTime();
var r = JSON.stringify(e);
var t = "jvzempodf8f9anyt";
var n = convertStringToBytes(t);
var i = convertStringToBytes(t);
var o = convertStringToBytes(r);
var a = pad(o);
var hhh = new cbc(n,i);
var c = hhh.encrypt(a);
var f = SSSS(c); //这个猜测是base64编码
return f
};
function get_X_for_with(){
e = {"ts":new Date().getTime(),"cts":new Date().getTime(),"brVD":[410,722],"brR":[[1536,864],[1536,824],24,24],"aM":"","code":"20210729168280281-2174383-KDImDDUAqcpoETAdtyJuO"}
X_for_with = p(e)
return X_for_with
}
console.log(get_X_for_with())
8. 模拟请求
不过现在好像不校验这个值了
import requests
import execjs
with open( r'my.js','r', encoding="utf-8") as f:
jscode = f.read()
js = execjs.compile(jscode)
X_FOR_WITH = js.call('get_X_for_with')
url = f"https://ihotel.meituan.com/hbsearch/HotelSearch?utm_medium=pc&version_name=999.9&cateId=20&attr_28=129&uuid=531BC18D2CCA7A4264BD2EED5B29F49F475A5D4274997789A20C6AC03E3FF4FA%401627460965606&cityId=1&offset=40&limit=20&startDay=20210728&endDay=20210728&q=&sort=defaults&X-FOR-WITH={X_FOR_WITH}"
data = requests.get(url).json()["data"]["searchresult"]
for d in data:
print(d)