听说携程网的机票很难搞,这几天尝试了一下,最终还是搞出来了,不需要借助selenium模拟,纯代码硬干。

 

本文目标,获取携程网的机票(国际机票为例)接口中,headers里的两个参数,sign和transactionID.

 

一:transactionID的获取。

这个参数直接在以下链接获取:

https://flights.ctrip.com/international/search/oneway-xmn-sin?depdate=2020-01-02&cabin=c_f&adult=1&child=0&infant=0

在response中直接提取transactionID,之后需要这个ID去获取sign值.

 二:sign的获取。

全局搜索,找到sign的生成位置:

这段js所在的位置,是:https://webresource.c-ctrip.com/ResFltIntlOnline/R4/assets/list.js

可以看到,sign的最后获取,需要_.a对象,同时调用了update和digest两个函数。

先打断点查看e.get("transactionID")  和 t是什么值:

 

可以看到这里update的参数就是transactionID+起飞城市三字码+到达城市三字码+日期。

同时可以看到,这里的 _.a调用的是函数c.

这里的c函数是包含在另一匿名函数中,并且相对应的函数还挺多

 

 

但这里面的c函数 并没有见到update和digest函数,

于是又是一顿断点调试,最终发现代码运行到a函数中,并且有完整的update和digest函数

 

继续调试后就会发现,这里几乎各个函数中都有的e参数,它是变化的,并不是最外面的那个函数中的固定的数组,这就很蛋疼,无法像往常那样直接给予构造。于是回到了代码逻辑。

发现,所有的原有e数组,都传入了该脚本的前一百多行进行循环赋值。

那么,只要断点找出最后完成赋值的_.a对象(必然地该对象包含了update和digest函数),然后带入我们得到的transaction+t

就可以运行最后sign值的表达式:(new _.a).update(e.get("transactionID") + t).digest("hex")

 

在整个构造的过程中,还是缺乏了很多对象和方法,还需要调用到获取transactionID时,得到的response中的部分参数,当然,在处理的过程中,优先进行手动赋值,等到正式项目中再另行获取后传入即可。

 

以上就是sign的破解思路。

纯属个人爱好,不做任何数据的抓取。

破解技术交流,欢迎勾搭。

更多粉丝可见的文章,欢迎点击关注。

 

QQ:  MTE2NTY3MzkzNg==      (base64)

 

 

 

 

 

 

 

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐