python爬虫 携程 机票 sign transactionID
听说携程网的机票很难搞,这几天尝试了一下,最终还是搞出来了,不需要借助selenium模拟,纯代码硬干。本文目标,获取携程网的机票(国际机票为例)接口中,headers里的两个参数,sign和transactionID.一:transactionID的获取。这个参数直接在以下链接获取:https://flights.ctrip.com/international/sea...
听说携程网的机票很难搞,这几天尝试了一下,最终还是搞出来了,不需要借助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)
更多推荐
所有评论(0)