【Python爬虫】【js逆向】某团酒店x-for-with参数分析

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)
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值