亚航app航班价格抓取

条件:去程日期、回程日期、成人数、儿童数、婴儿数、出发机场、到达机场
结果:符合行程的所有航班信息( 主要包括价格、航班号、起飞机场、到达机场、起飞时间、降落时间、舱位等)

抓包分析


从上面的Headers和Form视图中可以得知,亚航采用的是https post 请求,请求及响应报文是加密的,请求头中wToken也是一个密文。

解密wToken及报文体

通过jeb反编译客户端,搜索wToken关键字,找到位于

ConstantHelper.ॱˋ(r2);

方法已经经过混淆处理过,可读性并不友好。

可以通过标记的方法,对相应变量作注释,还原涉及的功能函数。
经过分析及标记得知:
1):报文体的加解密位于MCrypt类中
2):wToken的计算位于IJAQAVMPSignComponent的avmpSign方法中

还原关键代码

出于对目标app的安全考虑,MCrypt及IJAQAVMPSignComponent的具体实现代码就不公开了,以免对其造成不良影响

编写调用客户端测试

    //请求userSession,后续接口中需要此参数
public static String requestSession(String wTokenServerURL, String deviceID) throws Exception {byte[] reqParams = createUserSessionData(deviceID);String rs = request(wTokenServerURL, "103", deviceID, reqParams);System.out.println("rs---> " + rs);return (String) ((Map) (JSON.parseObject(rs).get("data"))).get("userSession");}//请求航班价格搜索public static String requestFlightSearch(String wTokenServerURL, String userSession, String deviceID, int adultPax, int childPax, int infantPax, String departureStation, String arrivalStation, String departureDate, String returnDate) throws Exception {byte[] reqParams = createFlightSearchData(userSession, deviceID, adultPax, childPax, infantPax, departureStation, arrivalStation, departureDate, returnDate);return request(wTokenServerURL, "302", deviceID, reqParams);}

写一个main方法执行一下

获取 清迈(CNX) - 武汉(WUH) 2020-01-08 1位成人的价格列表:

public static void main(String[] args) throws Exception {String deviceID = "b20be1e49f423119";String wTokenServerURL = "http://[ip]:[port]";String userSession = requestSession(wTokenServerURL, deviceID);System.out.println("userSession:" + userSession);int adultPax = 1;int childPax = 0;int infantPax = 0;String departureStation = "CNX";String arrivalStation = "WUH";String departureDate = DateFormatUtils.format(DateUtils.addDays(new Date(), 2), "yyyy-MM-dd");String returnDate = "";String rate = requestFlightSearch(wTokenServerURL, userSession, deviceID, adultPax, childPax, infantPax, departureStation, arrivalStation, departureDate, returnDate);System.out.println("rs ---> " + rate);}

解密后的返回结果报文:

{"response": {"responseTime": "2020-01-06 14:22:45","responseCode": 1000,"responseMessage": "Success"},"meta": {"cultureCode": "zh-CN","iosVersion": 1,"androidVersion": 1,"iosCompulsory": 1,"androidCompulsory": 1,"countryCacheVersion": 0,"ssrCacheVersion": 0,"stationCacheVersion": 0,"routeCacheVersion": 0},"data": {"SpecialNote": [[""],[""]],"SpecialNote2": [[""],[""]],"FlightSearch": [[{"IsDirectFlight": true,"JourneySellKey": "FD~ 570~ ~~DMK~01\/08\/2020 07:10~WUH~01\/08\/2020 11:35~~","LowestJourneyFare": 1,"JourneyDiscount": 0,"FlightStatus": 1,"ValuePackAvailable": 1,"HaveLowFare": 1,"HavePremiumFare": 1,"ValuePackageTotal": 830,"ValuePackageTotalOffset": -86,"LessThan24Hrs": 0,"LessThan2Hrs": 0,"ValuePackageSsrList": {"Baggage": [[{"SSRCode": "PBAB","Amount": 670,"SsrCodeType": 0},{"SSRCode": "VBPB","Amount": -68.8,"SsrCodeType": 1}]],"Snack": [[{"SSRCode": "VBPM","Amount": 0,"SsrCodeType": 1},{"SSRCode": "VPML","Amount": 120,"SsrCodeType": 0},{"SSRCode": "VGML","Amount": 120,"SsrCodeType": 0}]],"Seat": [[{"SSRCode": "DUSE","Amount": 99,"SsrCodeType": 0},{"SSRCode": "VBPS","Amount": -17.2,"SsrCodeType": 1}]],"Insurance": [[{"SSRCode": "INSV","Amount": 27,"SsrCodeType": 0},{"SSRCode": "VBIN","Amount": 0,"SsrCodeType": 1}]]},"CityIslandTransfer": false,"TotalSegment": 1,"HaveThruflightSegment": false,"RouteAllowOfferValuepack": true,"HaveComplimentaryInsuranceVP": true,"HaveComplimentaryInsurancePremium": true,"HaveVegetarianVP": true,"HaveNonVegetarianVP": true,"IsIndiaBooking": false,"HaveInflightEntertainment": false,"DepartureStation": "DMK","ArrivalStation": "WUH","DepartureDate": "2020-01-08T00:00:00","TotalJourneyAmount": {"FareType": {"1": {"MinAvailableSeats": "7","MobileExclusive": null,"ReservedDisplay1": null,"ReservedDisplay2": null,"MobilePromo": null,"FareStatus": 1,"FareUniqueID": "ID_2_0_1","ADT": {"OriginalFare": 9044,"FinalFare": 9044,"CurrencyCode": "THB"}},"0": {"MinAvailableSeats": "7","MobileExclusive": null,"ReservedDisplay1": null,"ReservedDisplay2": null,"MobilePromo": null,"FareStatus": 1,"FareUniqueID": "ID_2_0_0","ADT": {"OriginalFare": 7964,"FinalFare": 7964,"CurrencyCode": "THB"}}}},"TransitInfo": null,"Segment": [{"AirlineCompany": "Thai AirAsia","ArrivalStation": "WUH","DepartureStation": "DMK","SegmentSellKey": "FD~ 570~ ~~DMK~01\/08\/2020 07:10~WUH~01\/08\/2020 11:35~~","STA": "2020-01-08T11:35:00","STD": "2020-01-08T07:10:00","International": "true","CarrierCode": "FD","FlightNumber": " 570","OpSuffix": " ","SegmentType": 0,"IsThruflightSegment": false,"DepartureCountryCode": "TH","ArrivalCountryCode": "CN","DepartureTimeZone_UtcOffset": "+0700","ArrivalTimeZone_UtcOffset": "+0800","STD_UTC": "2020-01-08 00:10:00","STA_UTC": "2020-01-08 03:35:00","EstimatedTime": "3 \u5c0f\u65f6 25 \u5206\u949f ","Fare": [{"ClassOfService": "P","RuleNumber": "AAB1","FareBasisCode": "P01H00","FareSequence": "53","FareClassOfService": "P","FareApplicationType": "Route","ProductClass": "EC","FareSellKey": "0~P~ ~AK~P01H00~AAB1~~0~53~~X","AvailableCount": "7","Status": "Active","PaxFare": {"ADT": {"PaxType": "ADT","PaxDiscountCode": "","FareDiscountCode": "","TotalFare": 7964,"ServiceCharges": [{"CurrencyCode": "THB","Amount": "7214.0000","ChargeCode": "","ChargeType": "FarePrice","TicketCode": ""},{"CurrencyCode": "THB","Amount": "750.0000000","ChargeCode": "","ChargeType": "Tax","TicketCode": ""}]}}},{"ClassOfService": "PF","RuleNumber": "AAB1","FareBasisCode": "PF1F00","FareSequence": "52","FareClassOfService": "PF","FareApplicationType": "Route","ProductClass": "HF","FareSellKey": "0~PF~ ~AK~PF1F00~AAB1~~0~52~~X","AvailableCount": "7","Status": "Active","PaxFare": {"ADT": {"PaxType": "ADT","PaxDiscountCode": "","FareDiscountCode": "","TotalFare": 9044,"ServiceCharges": [{"CurrencyCode": "THB","Amount": "8294.0000","ChargeCode": "","ChargeType": "FarePrice","TicketCode": ""},{"CurrencyCode": "THB","Amount": "750.0000000","ChargeCode": "","ChargeType": "Tax","TicketCode": ""}]}}}],"Legs": [{"DepartureStation": "DMK","ArrivalStation": "WUH","STD": "2020-01-08T07:10:00","STA": "2020-01-08T11:35:00","CarrierCode": "FD","FlightNumber": " 570","DepartureStationName": "\u66fc\u8c37 - \u5eca\u66fc","ArrivalStationName": "\u6b66\u6c49","LegsEstimatedTime": "3H25M"}],"StationDisplay": ["DMK","WUH"],"InftAvailability": 10}],"FareProductClassList": {"lowfare": 0,"premiumflex": 1}},{"IsDirectFlight": true,"JourneySellKey": "FD~ 572~ ~~DMK~01\/08\/2020 15:55~WUH~01\/08\/2020 20:20~~","LowestJourneyFare": 0,"JourneyDiscount": 0,"FlightStatus": 1,"ValuePackAvailable": 1,"HaveLowFare": 1,"HavePremiumFare": 1,"ValuePackageTotal": 830,"ValuePackageTotalOffset": -86,"LessThan24Hrs": 0,"LessThan2Hrs": 0,"ValuePackageSsrList": {"Baggage": [[{"SSRCode": "PBAB","Amount": 670,"SsrCodeType": 0},{"SSRCode": "VBPB","Amount": -68.8,"SsrCodeType": 1}]],"Snack": [[{"SSRCode": "VBPM","Amount": 0,"SsrCodeType": 1},{"SSRCode": "VPML","Amount": 120,"SsrCodeType": 0},{"SSRCode": "VGML","Amount": 120,"SsrCodeType": 0}]],"Seat": [[{"SSRCode": "DUSE","Amount": 99,"SsrCodeType": 0},{"SSRCode": "VBPS","Amount": -17.2,"SsrCodeType": 1}]],"Insurance": [[{"SSRCode": "INSV","Amount": 27,"SsrCodeType": 0},{"SSRCode": "VBIN","Amount": 0,"SsrCodeType": 1}]]},"CityIslandTransfer": false,"TotalSegment": 1,"HaveThruflightSegment": false,"RouteAllowOfferValuepack": true,"HaveComplimentaryInsuranceVP": true,"HaveComplimentaryInsurancePremium": true,"HaveVegetarianVP": true,"HaveNonVegetarianVP": true,"IsIndiaBooking": false,"HaveInflightEntertainment": false,"DepartureStation": "DMK","ArrivalStation": "WUH","DepartureDate": "2020-01-08T00:00:00","TotalJourneyAmount": {"FareType": {"1": {"MinAvailableSeats": "7","MobileExclusive": null,"ReservedDisplay1": null,"ReservedDisplay2": null,"MobilePromo": null,"FareStatus": 1,"FareUniqueID": "ID_2_1_1","ADT": {"OriginalFare": 11774,"FinalFare": 11774,"CurrencyCode": "THB"},"INF": {"CurrencyCode": null,"FinalFare": null,"OriginalFare": null}},"0": {"MinAvailableSeats": "7","MobileExclusive": null,"ReservedDisplay1": null,"ReservedDisplay2": null,"MobilePromo": null,"FareStatus": 1,"FareUniqueID": "ID_2_1_0","ADT": {"OriginalFare": 10694,"FinalFare": 10694,"CurrencyCode": "THB"},"INF": {"CurrencyCode": null,"FinalFare": null,"OriginalFare": null}}}},"TransitInfo": null,"Segment": [{"AirlineCompany": "Thai AirAsia","ArrivalStation": "WUH","DepartureStation": "DMK","SegmentSellKey": "FD~ 572~ ~~DMK~01\/08\/2020 15:55~WUH~01\/08\/2020 20:20~~","STA": "2020-01-08T20:20:00","STD": "2020-01-08T15:55:00","International": "true","CarrierCode": "FD","FlightNumber": " 572","OpSuffix": " ","SegmentType": 0,"IsThruflightSegment": false,"DepartureCountryCode": "TH","ArrivalCountryCode": "CN","DepartureTimeZone_UtcOffset": "+0700","ArrivalTimeZone_UtcOffset": "+0800","STD_UTC": "2020-01-08 08:55:00","STA_UTC": "2020-01-08 12:20:00","EstimatedTime": "3 \u5c0f\u65f6 25 \u5206\u949f ","Fare": [{"ClassOfService": "U","RuleNumber": "AAB1","FareBasisCode": "U01H00","FareSequence": "53","FareClassOfService": "U","FareApplicationType": "Route","ProductClass": "EC","FareSellKey": "0~U~ ~AK~U01H00~AAB1~~0~53~~X","AvailableCount": "7","Status": "Active","PaxFare": {"ADT": {"PaxType": "ADT","PaxDiscountCode": "","FareDiscountCode": "","TotalFare": 10694,"ServiceCharges": [{"CurrencyCode": "THB","Amount": "9944.0000","ChargeCode": "","ChargeType": "FarePrice","TicketCode": ""},{"CurrencyCode": "THB","Amount": "750.0000000","ChargeCode": "","ChargeType": "Tax","TicketCode": ""}]},"INF": {"ServiceCharges": null}}},{"ClassOfService": "UF","RuleNumber": "AAB1","FareBasisCode": "UF1F00","FareSequence": "52","FareClassOfService": "UF","FareApplicationType": "Route","ProductClass": "HF","FareSellKey": "0~UF~ ~AK~UF1F00~AAB1~~0~52~~X","AvailableCount": "7","Status": "Active","PaxFare": {"ADT": {"PaxType": "ADT","PaxDiscountCode": "","FareDiscountCode": "","TotalFare": 11774,"ServiceCharges": [{"CurrencyCode": "THB","Amount": "11024.0000","ChargeCode": "","ChargeType": "FarePrice","TicketCode": ""},{"CurrencyCode": "THB","Amount": "750.0000000","ChargeCode": "","ChargeType": "Tax","TicketCode": ""}]},"INF": {"ServiceCharges": null}}}],"Legs": [{"DepartureStation": "DMK","ArrivalStation": "WUH","STD": "2020-01-08T15:55:00","STA": "2020-01-08T20:20:00","CarrierCode": "FD","FlightNumber": " 572","DepartureStationName": "\u66fc\u8c37 - \u5eca\u66fc","ArrivalStationName": "\u6b66\u6c49","LegsEstimatedTime": "3H25M"}],"StationDisplay": ["DMK","WUH"],"InftAvailability": 10}],"FareProductClassList": {"lowfare": 0,"premiumflex": 1}}]],"LowestFareArr": [{"2020-01-09": 10694,"2020-01-07": 5759,"2020-01-08": 7964}],"JourneyDisplay": [["DMK","WUH"]],"FareDiscountAvailable": 0,"MemberDiscountApply": false,"userCurrencyCode": "CNY","displayCurrencyCode": "CNY","exchangeRate": "0.242372000000000000","departureCurrencyCode": "THB","AustraliaSpecialNote": [],"IsUSBooking": false,"IsPHBooking": false,"IsPHDomestic": false,"captchaVerification": 0}
}

亚航app航班价格抓取相关推荐

  1. 亚马逊标题自动抓取_如何为您的家人提供自动Amazon礼品卡津贴

    亚马逊标题自动抓取 When your kids move away to go to school, they'll probably phone home every once in a whil ...

  2. 亚马逊标题自动抓取_15分钟内开始使用Amazon Web Services和全自动资源调配

    亚马逊标题自动抓取 在等待一个新项目时,我想学习一些有用的东西. 而且由于在许多项目中我们需要评估和测试正在开发的应用程序的性能,而很少有足够的硬件来生成实际负载,因此我决定学习更多有关按需在云中按需 ...

  3. 嘘,我已经瞒着开发解锁APP日志文件抓取及分析啦!

    ------·今天距2020年87天·------ 这是ITester小栈第49次推文 大家好,我是coco小锦鲤 经过之前的APP系列 我们知道了APP的测试流程 也列举了APP通用测试用例 还解答 ...

  4. 「docker实战篇」python的docker-打造多任务端app应用数据抓取系统(下)(35)

    上次已经把python文件挂载到虚拟机上了,这次主要设置下虚拟机通过docker容器的方式. 运行 python 代码运行 >启动一个crt的会话 docker run -it -v /root ...

  5. app评论如何抓取_可能是史上最独一无二的中国高铁APP——高铁通

    这个图标很像钢铁侠的APP就是我们今天要推荐的产品,高铁通. 如果你是中国高铁的爱好者,那么你一定会非常喜欢这款产品,这可能是第一款带有实时雷达和完整高铁线网图的APP. 开发初衷是非常喜欢一款航班雷 ...

  6. 图解Fiddler如何抓手机APP数据包过滤抓取

    近期公司需要按照安卓app去开发h5项目,但是后端人手紧缺,没人整理接口文挡,就只能自己抓接口. 在网上自己学习,然后整理了我所用到的,以便日后自己还要使用方便查看,在此记录.需要的胖友们也可以查看 ...

  7. JAVA实现美团电影价格抓取(附代码)

    各位老大好,我是烤鸭: 最近在研究爬虫,看到有意思的是美团的电影票价,普通的抓取是抓不到的. 例如网址:http://bj.meituan.com/shop/105355906?mtt=1.movie ...

  8. 京东app优惠券python抓取_如何使用fiddler抓取京东app的领券链接

    Fiddler不但能截获各种浏览器发出的HTTP请求, 也可以截获各种智能手机发出的HTTP/HTTPS请求.Fiddler能捕获IOS设备发出的请求,比如IPhone, IPad, MacBook. ...

  9. 京东app优惠券python抓取_京东app商品信息爬取

    抓取目标: 我们的抓取目标是京东商城的App电子商品信息,并将信息保存到MongoDB数据库中. 抓取商品信息的id号.标题.单价.评价条数等信息 准备工作和抓取分析 准备工作: 安装app抓包工具C ...

最新文章

  1. 2019年首期“医工结合科研创新支持计划”项目申报获批:医工携手 强校强国...
  2. Java8中的HashMap分析
  3. 数据库MYSQL学习系列二
  4. 关于 TCP 并发连接的几个思考题与试验
  5. [armv9]-ARM最新架构为memcpy/memset底层的实现提供新的指令
  6. 对KVC和KVO的理解
  7. 创业一定要取个好名字,才容易实现人生逆袭
  8. 神秘黑客攻陷密码管理器 Passwordstate 部署恶意软件,发动软件供应链攻击
  9. 利用nginx+lua+redis实现反向代理方法教程
  10. Codeforces 1062E 题解
  11. JavaWeb中的问题 ---- Servlet和Jsp
  12. 21次课(安装软件包的三种方法、rpm包介绍、rpm工具用法、yum工具用法、 yum搭建本地仓库)...
  13. canon iPF 系列保养墨盒清零方法
  14. Ubuntu 14.04LTS下如何安装搜狗拼音输入法
  15. 程序猿生存指南-45 迁徙的鸟
  16. visual Paradigm如何创建BPMN图?
  17. excel中统计某个字符的数量
  18. mysql 设置的黑名单_在SQL中实现多条件任意组合黑名单的方法
  19. Telegram-“只能给双向联系人发送消息”的错误信息
  20. Java并发包中那些值得学习的并发工具类(空谈误国,实干兴邦,代码示范,抛砖引玉)

热门文章

  1. css怎么随着鼠标移动,利用CSS sprites制作随着鼠标移动的动画背景
  2. Axure 点图片外区域即隐藏_多年后终迎换代,新奔腾B70——颜值即是正义!_搜狐汽车...
  3. 抖音号永久封禁了怎么解封
  4. 因数据迁移导致跨库连接失效的解决办法
  5. 边云协同的优点_关于边缘计算和边云协同,看这一篇就够了
  6. 为什么php打开网页空白的_PHP网站打开空白的三个原因和对应的解决办法
  7. 内外部函数和内存模型
  8. color a dir/s_小米手表Color运动版详细评测 比标准版加量减价在哪里?|屏幕|小米手表color|小米手表|小米|续航...
  9. 经典游戏----飞机大战
  10. AtCoder Beginner Contest 190 E.Magical Ornament