携程国际机票sign破解

1.全局搜索大法:

直接搜索对应的时间,定位到最后结果返回的请求。

发现请求头headers sign为变化状态以及参数 transactionID为变化状态(transactionID前面请求响应结果)。


transactionID为变化状态(transactionID前面请求响应结果)。

2.逆向回推法,先往上找找看看哪里设置了这两个变化参数。

发现:https://flights.ctrip.com/international/search/api/flightlist/oneway-tpe-szx?depdate=2020-09-14&cabin=y_s&adult=1&child=0&infant=0&containstax=1&v=0.9164251641244324 返回结果有transactionID。

参数分析:

oneway -> 单程    tpe -> 台北三字码    szx -> 深圳三字码  depdate->起始时间  cabin->仓位类型 adult -> 成人    child->小孩   infant->婴儿    v ->时间戳刷新缓存 (一般情况直接忽略)

3.接着查找 哪一个请求最早有sign .

发现 https://flights.ctrip.com/international/search/api/search/batchSearch?v=0.026341469001777362

这个请求最早出现 sign ,且无源头查找sign,初步定义为 Js 动态生成 。

4. 堆栈跟踪法

一步步来,直接点进去,全局搜索大法。

逆向思维,倒推法,看到sign 就是 n ,那么n 是:

n = sessionStorage.getItem(i)) || (n = (new a.a).update(r).digest('hex'), sessionStorage.setItem(i, n)sesessionStorage  本地存储的 name/value 键值对。get方法取键 i 为真.且 n 为新new了一个对象把r进行md5  并且以键值对(i,n)设置回sessionStorage

简单啊,就是r进行了md5.

r是????

var r = e.transactionID + t,  不就是transactionID  + t

t 是 ????

var n = e.departureCityCode,r = e.arrivalCityCode,a = e.departureDate;t += n + r + a

英文学的好,很重要。

departureCityCode -> 起始三字码arrivalCityCode -> 到达三字码     departureDate ->出发日期

Ca,这么简单啊… t 就是 String(起始地三字码+降落的三字码+出发时间)

Sign  =  md5(transactionID  +起始地三字码+降落的三字码+出发时间)

分析完毕。over!

5.模拟请求,发现该网站自己一直发请求,直到拿到结果。

6.代码展示:

# encoding:utf-8
"""
@author Codeoooo
"""import re
import json
import hashlib
import requestsfrom fake_useragent import UserAgent
from requests import RequestExceptionclass CtripSpider:def __init__(self, depCode, arrCode, date, adult=1, child=0, infant=0):self.depCode = depCodeself.arrCode = arrCodeself.date = dateself.adult = adultself.child = childself.infant = infantself.headers = {'User-Agent': UserAgent().random}def getTransactionId(self):"""获取transactionId and Params"""url = 'https://flights.ctrip.com/international/search/oneway-{}-{}?depdate={}&cabin=y_s&adult={}&child={}&infant={}'.format(self.depCode, self.arrCode, self.date, self.adult, self.child, self.infant)transactionId, data = None, Nonefor _ in range(3):try:response = requests.get(url, headers=self.headers)data = re.findall(r'GlobalSearchCriteria =(.+);', response.text)[0].encode('utf-8')transactionId = json.loads(data).get("transactionID")return transactionId, dataexcept:continuereturn transactionId, datadef getSign(self, transactionId):sign_value = transactionId + self.depCode + self.arrCode + self.date# 进行md5加密_sign = hashlib.md5()_sign.update(sign_value.encode('utf-8'))headers = {'origin': "https://flights.ctrip.com",'sign': _sign.hexdigest(),'transactionid': transactionId,'Host': "flights.ctrip.com",'content-type': "application/json;charset=UTF-8",}self.headers.update(headers)# 请求并获取响应,获取源代码def get_information_page(self, data):""":return:"""while True:try:requests.packages.urllib3.disable_warnings()res = requests.post(url="https://flights.ctrip.com/international/search/api/search/batchSearch",headers=self.headers,data=data,proxies=None,timeout=5)except RequestException:# todo 请求抛错未处理 可能为代理网路延迟问题# time.sleep(random.randint(1, 3))continueexcept Exception as e:# 其他未知错误print(e)else:# res.encoding = 'utf-8'# print(res.json())if res.json().get("data").get("context").get("searchCriteriaToken"):return res.json()def main(self):transactionId, data = self.getTransactionId()if transactionId:self.getSign(transactionId)return self.get_information_page(data)else:# print("账号被封禁")returnif __name__ == '__main__':spider = CtripSpider("tpe", "bjs", "2020-09-14")print(spider.main())

携程国际机票sign破解相关推荐

  1. python爬虫爬取携程国际机票航班信息,返回json串

    # -*- coding: utf-8 -*- import requests, json import hashlib import re# 此处的参数是json 出发三字码,达到三字码,出发时间, ...

  2. 携程国内机票token

    携程国内机票token破解 1. 直接上搜索大法 定位到最后的结果为 products 这个接口里 2.参数中发现token,尝试发现其换日期token不变,换出发地|目的地 token发生改变. ​ ...

  3. 微信小程序体验(1):携程酒店机票火车票

    在 12 月 28 日微信公开课上,张小龙对微信小程序的形态进行了阐释,小程序有四个特定:无需安装.触手可及.用完即走.无需卸载. 由于携程这种订酒店.火车票和机票等工具性质非常强的服务,非常符合张小 ...

  4. python中飞机票购买程序_「最低折扣机票查询」Python 爬取携程所有机票找出最低折扣机票,让你无忧回家过年 - seo实验室...

    最低折扣机票查询 前言 对于平时出行大多数人都是选择坐高铁,当然了如果这是对于距离比较近的行程是最划算的,如果对于路途长远的人言,提前购买飞机票价格可能比高铁票更加的便宜,如果我们可以爬取机票数据并分 ...

  5. 干货 | 数据为王,携程国际火车票的Sharding-Sphere之路

    作者简介 瑞华,携程高级后端开发工程师,关注系统架构.分库分表.微服务.高可用等. 一.前言 随着国际火车票业务的高速发展,订单量快速增长,单数据库瓶颈层面的问题逐渐显露,常规的数据库优化已无法达到期 ...

  6. 和你一起分析网站 - 之携程(机票价格)

    前几天在网上看到有人说不清楚怎么爬携程的机票价钱,然后自己去大概看了一下,大概知道是怎么回事,现在和大家分享一下分析的过程. 准备工作 我用到Chrome浏览器,Python里的requests库作为 ...

  7. python 携程_请教两个关于使用 python 爬去哪儿,携程等机票网站的问题

    初学 python . 近期公司由于业务原因,需要想办法获取到携程与去哪儿的机票信息. 于是我尝试用 python+urllib 对这两个网站上的信息进行抓取. 去哪儿的爬虫代码如下:(初学 pyth ...

  8. payload数据传输,携程查机票接口

    网络报文中的payload 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如数据量的大小.校验位等,这样就相当于给已经分批的原始数据加一 ...

  9. Python 爬取携程所有机票

    打开携程网,查询机票,如广州到成都. 这时网址为:http://flights.ctrip.com/booking/CAN-CTU-day-1.html?DDate1=2018-06-15 其中,CA ...

最新文章

  1. Linux之tee命令
  2. 超赞的PyTorch资源大列表,GitHub标星9k+,中文版也上线了
  3. PL/Sql循序渐进全面学习教程(下)(ZT)
  4. mysql 提升 权限_如何使用MySQL提升权限
  5. Linux 内存管理之vmalloc
  6. 采用批处理命令对文件进行解压及采用SQLCMD进行数据库挂载
  7. bzoj 3123 可持久化线段树启发式合并
  8. 【分享】迅为iTOP4412开发板-Android系统屏幕旋转设置
  9. 决策树准确率低原因_决策树算法
  10. CUDA驱动版本与运行版本不匹配问题详解
  11. cjson构建_利用cJSON解析和创建JSON字符串
  12. matlab中beta是什么软件,软件版本中的beta是什么意思?
  13. TCP三次握手(详解)
  14. android wifi分享文件下载,WiFi文件共享
  15. Java交换二叉树的左右子树_二叉树左右子树交换
  16. 为什么全球最好的大学大半在美国?看看美国的孩子是怎么念书的 ~~
  17. Java中的位移操作 、
  18. java程序填空题输出汤姆猫_《Java语言程序设计(新)》地大模拟
  19. C#dll的生成和使用
  20. Windows Server 2012改造成Windows8的方法(新增解决网络卡)

热门文章

  1. Fabric-samples asset-transfer-basic 链码部署与升级(Fabric 2.4.4)
  2. 协众信息 平面设计师必修的纸张和印刷知识
  3. validation使用
  4. window10 wls2 安装docker
  5. es5 js日期格式化
  6. 参数缺省和函数重载讲解
  7. 一本python学习的好书
  8. 可以做个关于微软公司的波特五力分析吗
  9. Rk3399全接口板 高性能高扩展全能型介绍
  10. 【操作系统】几种常用调度算法