1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > python 携程航班信息查询

python 携程航班信息查询

时间:2020-06-11 07:01:17

相关推荐

python 携程航班信息查询

查询页面

携程链接

第一步找到数据怎么来的

发现航班信息在返回 json 的 routeList 里

看传递的参数

然后只要找到token是怎么来的就好了

可以确定token 是由 app.js 生成的,可以看到这个请求只调用过app.js

到 app.js 里去搜索,在可疑的地方打断点

然后回到页面重新搜索航班

调用了p.getProductToken 函数,传递了三个参数 can bjs Oneway ,分别是出发城市 、到达城市、单程。执行下一步

继续执行

后面就不分析了,后面就把js 扣出来在工具里测试

成功拿到token,然后在python中用execjs 执行js 就可以拿到token,就可以发送请求查询航班。

gettoken.js

function a(e, t) {var n = (65535 & e) + (65535 & t);return (e >> 16) + (t >> 16) + (n >> 16) << 16 | 65535 & n}function i(e, t, n, r, i, o) {return a((l = a(a(t, e), a(r, o))) << (s = i) | l >>> 32 - s, n);var l, s}function o(e, t, n, r, a, o, l) {return i(t & n | ~t & r, e, t, a, o, l)}function l(e, t, n, r, a, o, l) {return i(t & r | n & ~r, e, t, a, o, l)}function s(e, t, n, r, a, o, l) {return i(t ^ n ^ r, e, t, a, o, l)}function u(e, t, n, r, a, o, l) {return i(n ^ (t | ~r), e, t, a, o, l)}function c(e, t) {var n, r, i, c, f;e[t >> 5] |= 128 << t % 32,e[14 + (t + 64 >>> 9 << 4)] = t;var d = 1732584193,p = -271733879,h = -1732584194,m = 271733878;for (n = 0; n < e.length; n += 16) d = o(r = d, i = p, c = h, f = m, e[n], 7, -680876936),m = o(m, d, p, h, e[n + 1], 12, -389564586),h = o(h, m, d, p, e[n + 2], 17, 606105819),p = o(p, h, m, d, e[n + 3], 22, -1044525330),d = o(d, p, h, m, e[n + 4], 7, -176418897),m = o(m, d, p, h, e[n + 5], 12, 1200080426),h = o(h, m, d, p, e[n + 6], 17, -1473231341),p = o(p, h, m, d, e[n + 7], 22, -45705983),d = o(d, p, h, m, e[n + 8], 7, 1770035416),m = o(m, d, p, h, e[n + 9], 12, -1958414417),h = o(h, m, d, p, e[n + 10], 17, -42063),p = o(p, h, m, d, e[n + 11], 22, -1990404162),d = o(d, p, h, m, e[n + 12], 7, 1804603682),m = o(m, d, p, h, e[n + 13], 12, -40341101),h = o(h, m, d, p, e[n + 14], 17, -1502002290),d = l(d, p = o(p, h, m, d, e[n + 15], 22, 1236535329), h, m, e[n + 1], 5, -165796510),m = l(m, d, p, h, e[n + 6], 9, -1069501632),h = l(h, m, d, p, e[n + 11], 14, 643717713),p = l(p, h, m, d, e[n], 20, -373897302),d = l(d, p, h, m, e[n + 5], 5, -701558691),m = l(m, d, p, h, e[n + 10], 9, 38016083),h = l(h, m, d, p, e[n + 15], 14, -660478335),p = l(p, h, m, d, e[n + 4], 20, -405537848),d = l(d, p, h, m, e[n + 9], 5, 568446438),m = l(m, d, p, h, e[n + 14], 9, -1019803690),h = l(h, m, d, p, e[n + 3], 14, -187363961),p = l(p, h, m, d, e[n + 8], 20, 1163531501),d = l(d, p, h, m, e[n + 13], 5, -1444681467),m = l(m, d, p, h, e[n + 2], 9, -51403784),h = l(h, m, d, p, e[n + 7], 14, 1735328473),d = s(d, p = l(p, h, m, d, e[n + 12], 20, -1926607734), h, m, e[n + 5], 4, -378558),m = s(m, d, p, h, e[n + 8], 11, -574463),h = s(h, m, d, p, e[n + 11], 16, 1839030562),p = s(p, h, m, d, e[n + 14], 23, -35309556),d = s(d, p, h, m, e[n + 1], 4, -1530992060),m = s(m, d, p, h, e[n + 4], 11, 1272893353),h = s(h, m, d, p, e[n + 7], 16, -155497632),p = s(p, h, m, d, e[n + 10], 23, -1094730640),d = s(d, p, h, m, e[n + 13], 4, 681279174),m = s(m, d, p, h, e[n], 11, -358537222),h = s(h, m, d, p, e[n + 3], 16, -722521979),p = s(p, h, m, d, e[n + 6], 23, 76029189),d = s(d, p, h, m, e[n + 9], 4, -640364487),m = s(m, d, p, h, e[n + 12], 11, -421815835),h = s(h, m, d, p, e[n + 15], 16, 530742520),d = u(d, p = s(p, h, m, d, e[n + 2], 23, -995338651), h, m, e[n], 6, -198630844),m = u(m, d, p, h, e[n + 7], 10, 1126891415),h = u(h, m, d, p, e[n + 14], 15, -1416354905),p = u(p, h, m, d, e[n + 5], 21, -57434055),d = u(d, p, h, m, e[n + 12], 6, 1700485571),m = u(m, d, p, h, e[n + 3], 10, -1894986606),h = u(h, m, d, p, e[n + 10], 15, -1051523),p = u(p, h, m, d, e[n + 1], 21, -2054922799),d = u(d, p, h, m, e[n + 8], 6, 1873313359),m = u(m, d, p, h, e[n + 15], 10, -30611744),h = u(h, m, d, p, e[n + 6], 15, -1560198380),p = u(p, h, m, d, e[n + 13], 21, 1309151649),d = u(d, p, h, m, e[n + 4], 6, -145523070),m = u(m, d, p, h, e[n + 11], 10, -110379),h = u(h, m, d, p, e[n + 2], 15, 718787259),p = u(p, h, m, d, e[n + 9], 21, -343485551),d = a(d, r),p = a(p, i),h = a(h, c),m = a(m, f);return [d, p, h, m]}function f(e) {var t, n = "",r = 32 * e.length;for (t = 0; t < r; t += 8) n += String.fromCharCode(e[t >> 5] >>> t % 32 & 255);return n}function d(e) {var t, n = [];for (n[(e.length >> 2) - 1] = void 0, t = 0; t < n.length; t += 1) n[t] = 0;var r = 8 * e.length;for (t = 0; t < r; t += 8) n[t >> 5] |= (255 & e.charCodeAt(t / 8)) << t % 32;return n}function p(e) {var t, n, r = "0123456789abcdef",a = "";for (n = 0; n < e.length; n += 1) t = e.charCodeAt(n),a += r.charAt(t >>> 4 & 15) + r.charAt(15 & t);return a}function h(e) {return unescape(encodeURIComponent(e))}function m(e) {return f(c(d(t = h(e)), 8 * t.length));var t}function y(e, t) {return function(e, t) {var n, r, a = d(e),i = [],o = [];for (i[15] = o[15] = void 0, 16 < a.length && (a = c(a, 8 * e.length)), n = 0; n < 16; n += 1) i[n] = 909522486 ^ a[n],o[n] = 1549556828 ^ a[n];return r = c(i.concat(d(t)), 512 + 8 * t.length),f(c(o.concat(r), 640))} (h(e), h(t))}function g(e, t, n) {return t ? n ? y(t, e) : p(y(t, e)) : n ? m(e) : p(m(e))}function gettoken(dcity, acity, flightWay) {var str = dcity + acity + flightWay + "duew&^%5d54nc'KH";var token = g(str);return token}

xiecheng.py

import jsonimport requestsimport execjsheaders = {'Host':'','Connection':'keep-alive','Content-Length':'302','User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36','Content-Type':'application/json','Accept':'*/*','Origin':'','Sec-Fetch-Site':'same-origin','Sec-Fetch-Mode':'cors','Sec-Fetch-Dest':'empty','Referer':'/itinerary/oneway/sha-bjs?date=-01-01','Accept-Encoding':'gzip, deflate, br','Accept-Language':'zh-CN,zh;q=0.9'}with open(r"gettoken.js", 'r') as f:content = f.read()ctx = pile(content)dcity = 'can'acity = 'bjs'flightWay = "Oneway"funName = 'gettoken("{}","{}","{}")'.format(dcity, acity, flightWay)token = ctx.eval(funName)post_url = '/itinerary/api/12808/products'paylod = {"flightWay": "Oneway","classType": "ALL","hasChild": 'false',"hasBaby": 'false',"searchIndex": '1',"airportParams": [{"dcity": 'can',"acity": 'bjs',"dcityname": '广州',"acityname": '北京',"date": "-01-05"}],"selectedInfos": None,"army": 'false',"token": token}paylod_json = json.dumps(paylod)res = requests.post(url=post_url, json=paylod, headers=headers).json()if res['data']['routeList'] != None:for data in res['data']['routeList']:if len(data['legs']) > 1:print('中转到达')lowestPrice = data['transitPrice']else:lowestPrice = data['legs'][0]['characteristic']['lowestPrice']for item in data['legs']:if item['legType'] == 'Train':trainNumber = item['trainNumber']trainType = item['trainType']fromStation = item['fromStation']fromTime = item['fromTime']toStation = item['toStation']toTime = item['toTime']train_list ={'HighSpeed': "高铁",'MotorCar': "动车",'InterCity': "城际动车",'Normal': "普通列车"}print(trainNumber, train_list.get(trainType), fromStation['cityName'], fromStation['name'], fromTime,toStation['cityName'], toStation['name'], toTime)print(item['remark'])if item['legType'] == 'Flight':info = item['flight']flightNumber = info['flightNumber']airlineName = info['airlineName']craftTypeName = info['craftTypeName']craftTypeKindDisplayName = info['craftTypeKindDisplayName']departure_cityName = info['departureAirportInfo']['cityName']departure_airportName = info['departureAirportInfo']['airportName']arrival_cityName = info['arrivalAirportInfo']['cityName']arrival_airportName = info['arrivalAirportInfo']['airportName']departureDate = info['departureDate']arrivalDate = info['arrivalDate']print(flightNumber, airlineName, craftTypeName, craftTypeKindDisplayName, departure_cityName,departure_airportName, departureDate, arrival_cityName, arrival_airportName, arrivalDate,lowestPrice)print()else:print('很抱歉,您搜索的航班已售完。')

后来感觉不对劲,拿着字符串去md5加密,好家伙

就是md5加密…我还是经验太少了

import jsonimport requestsimport hashlibheaders = {'Host':'','Connection':'keep-alive','Content-Length':'302','User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36','Content-Type':'application/json','Accept':'*/*','Origin':'','Sec-Fetch-Site':'same-origin','Sec-Fetch-Mode':'cors','Sec-Fetch-Dest':'empty','Referer':'/itinerary/oneway/sha-bjs?date=-01-01','Accept-Encoding':'gzip, deflate, br','Accept-Language':'zh-CN,zh;q=0.9'}dcity = 'can'acity = 'bjs'flightWay = "Oneway"str = "{}{}{}duew&^%5d54nc'KH".format(dcity,acity,flightWay)token = hashlib.md5(str.encode(encoding='UTF-8')).hexdigest()print(token)post_url = '/itinerary/api/12808/products'paylod = {"flightWay": "Oneway","classType": "ALL","hasChild": 'false',"hasBaby": 'false',"searchIndex": '1',"airportParams": [{"dcity": 'can',"acity": 'bjs',"dcityname": '广州',"acityname": '北京',"date": "-01-05"}],"selectedInfos": None,"army": 'false',"token": token}paylod_json = json.dumps(paylod)res = requests.post(url=post_url, json=paylod, headers=headers).json()if res['data']['routeList'] != None:for data in res['data']['routeList']:if len(data['legs']) > 1:print('中转到达')lowestPrice = data['transitPrice']else:lowestPrice = data['legs'][0]['characteristic']['lowestPrice']for item in data['legs']:if item['legType'] == 'Train':trainNumber = item['trainNumber']trainType = item['trainType']fromStation = item['fromStation']fromTime = item['fromTime']toStation = item['toStation']toTime = item['toTime']train_list ={'HighSpeed': "高铁",'MotorCar': "动车",'InterCity': "城际动车",'Normal': "普通列车"}print(trainNumber, train_list.get(trainType), fromStation['cityName'], fromStation['name'], fromTime,toStation['cityName'], toStation['name'], toTime)print(item['remark'])if item['legType'] == 'Flight':info = item['flight']flightNumber = info['flightNumber']airlineName = info['airlineName']craftTypeName = info['craftTypeName']craftTypeKindDisplayName = info['craftTypeKindDisplayName']departure_cityName = info['departureAirportInfo']['cityName']departure_airportName = info['departureAirportInfo']['airportName']arrival_cityName = info['arrivalAirportInfo']['cityName']arrival_airportName = info['arrivalAirportInfo']['airportName']departureDate = info['departureDate']arrivalDate = info['arrivalDate']print(flightNumber, airlineName, craftTypeName, craftTypeKindDisplayName, departure_cityName,departure_airportName, departureDate, arrival_cityName, arrival_airportName, arrivalDate,lowestPrice)print()else:print('很抱歉,您搜索的航班已售完。')

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。