202006携程酒店价格参数解密,携程订酒店


  之前听朋友说携程的加密有点变态,就去研究了一下,果然变态。废话不多说,进入正题。

  以爬取携程酒店详情页为例,进入详情页,打开调试模式,首先看看Xhr (XMLHttpRequest)请求,寻找请求数据接口;携程的码农夫很鸡贼,它将数据放在html里面的两个属性里面,不注意就会忽略;

  分析参数可以看到,每次请求变化的是key这个参数,全局搜素key,很遗憾,携程混淆比较厉害,key有很多个;根据URL通过hoteldetail/rooms全局找,很好只找到了数个,全部打上断点。一步步走下去,适当地跳过中间函数,可以看到这个,很明显执行了一个js,找到请求这个js的接口,打印window[e]即window.___casf3,找到了酷似key值的值,随后验证,的确是它。接下来只需要破解这段js。

 

  第一次调试报错了,回忆了一下,运行这个之前还定义了一个函数,加上。接着调试,就正常了。但是接着就吐了,这循环一个接着一个,几万个循环,太变态了。不过,也搞懂了每次循环的流程以及关键的几个地方。

 

  终于出结果了,但是比对了一下,第二位以及划线后面不一样。然后拿这js到携程的官网执行,答案正确了。

  然后跳到执行的最后找到存储结果的一个object,发现有几个地方不一样,比如m.ctrip.com   和localhost:63342,但是关键点并不能通过手动拿到,想了想就先用console.log,看输出的差异,在根据输出找到关键点,终于发现这个差异是取了window.location.host值,在取值的地方替换了一下,就拿到了正确的结果。

  但是在用python去执行时发生了尴尬的一幕:函数的输入需要window对象,简单设置window执行js并不行,因为代码里会去验证window对象的真假;然后根据NodeJs以及jsdom包去模拟window对象,很遗憾也不行,看了一下,原因应该在于require函数,遗憾的是,混淆这个函数的尝试失败了,可能关键点不在这个地方,或者require函数无法重写。然后就换了一个方向,既然假的不行,就搞个真的去执行它,使用selenium是一个不错的思路,它也对selenium做了检测,不过这个再走一次上面的流程就好了。划线后面的字符串是根据前面的字符串以及浏览器信息生成的,只要搞定前面的再有点耐心就能搞定。

  这里面有几个关键的地方(其他的地方也重要):

 

 

 

 

  

相关内容

    暂无相关文章

评论关闭