携程国际机票sign破解
携程国际机票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破解相关推荐
- python爬虫爬取携程国际机票航班信息,返回json串
# -*- coding: utf-8 -*- import requests, json import hashlib import re# 此处的参数是json 出发三字码,达到三字码,出发时间, ...
- 携程国内机票token
携程国内机票token破解 1. 直接上搜索大法 定位到最后的结果为 products 这个接口里 2.参数中发现token,尝试发现其换日期token不变,换出发地|目的地 token发生改变. ...
- 微信小程序体验(1):携程酒店机票火车票
在 12 月 28 日微信公开课上,张小龙对微信小程序的形态进行了阐释,小程序有四个特定:无需安装.触手可及.用完即走.无需卸载. 由于携程这种订酒店.火车票和机票等工具性质非常强的服务,非常符合张小 ...
- python中飞机票购买程序_「最低折扣机票查询」Python 爬取携程所有机票找出最低折扣机票,让你无忧回家过年 - seo实验室...
最低折扣机票查询 前言 对于平时出行大多数人都是选择坐高铁,当然了如果这是对于距离比较近的行程是最划算的,如果对于路途长远的人言,提前购买飞机票价格可能比高铁票更加的便宜,如果我们可以爬取机票数据并分 ...
- 干货 | 数据为王,携程国际火车票的Sharding-Sphere之路
作者简介 瑞华,携程高级后端开发工程师,关注系统架构.分库分表.微服务.高可用等. 一.前言 随着国际火车票业务的高速发展,订单量快速增长,单数据库瓶颈层面的问题逐渐显露,常规的数据库优化已无法达到期 ...
- 和你一起分析网站 - 之携程(机票价格)
前几天在网上看到有人说不清楚怎么爬携程的机票价钱,然后自己去大概看了一下,大概知道是怎么回事,现在和大家分享一下分析的过程. 准备工作 我用到Chrome浏览器,Python里的requests库作为 ...
- python 携程_请教两个关于使用 python 爬去哪儿,携程等机票网站的问题
初学 python . 近期公司由于业务原因,需要想办法获取到携程与去哪儿的机票信息. 于是我尝试用 python+urllib 对这两个网站上的信息进行抓取. 去哪儿的爬虫代码如下:(初学 pyth ...
- payload数据传输,携程查机票接口
网络报文中的payload 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如数据量的大小.校验位等,这样就相当于给已经分批的原始数据加一 ...
- Python 爬取携程所有机票
打开携程网,查询机票,如广州到成都. 这时网址为:http://flights.ctrip.com/booking/CAN-CTU-day-1.html?DDate1=2018-06-15 其中,CA ...
最新文章
- Linux之tee命令
- 超赞的PyTorch资源大列表,GitHub标星9k+,中文版也上线了
- PL/Sql循序渐进全面学习教程(下)(ZT)
- mysql 提升 权限_如何使用MySQL提升权限
- Linux 内存管理之vmalloc
- 采用批处理命令对文件进行解压及采用SQLCMD进行数据库挂载
- bzoj 3123 可持久化线段树启发式合并
- 【分享】迅为iTOP4412开发板-Android系统屏幕旋转设置
- 决策树准确率低原因_决策树算法
- CUDA驱动版本与运行版本不匹配问题详解
- cjson构建_利用cJSON解析和创建JSON字符串
- matlab中beta是什么软件,软件版本中的beta是什么意思?
- TCP三次握手(详解)
- android wifi分享文件下载,WiFi文件共享
- Java交换二叉树的左右子树_二叉树左右子树交换
- 为什么全球最好的大学大半在美国?看看美国的孩子是怎么念书的 ~~
- Java中的位移操作 、
- java程序填空题输出汤姆猫_《Java语言程序设计(新)》地大模拟
- C#dll的生成和使用
- Windows Server 2012改造成Windows8的方法(新增解决网络卡)