亚航app航班价格抓取

亚航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": [
              [
                
### 获取 Zotero 翻译引擎 API 密钥及配置方法 为了在 Zotero 中使用 DeepL (Pro)翻译功能,需要完成以下设置: #### 注册并获取 API 密钥 用户需先访问 DeepL 官方网站注册账户,并通过验证流程获得专属的 API 密钥。此过程通常涉及填写表单以及确认电子邮件地址[^2]。 一旦成功创建账户,在登录后的界面中导航至 **用户中心** 页面,可以找到个人专属的 API 密钥。该密钥用于授权第三方应用调用 DeepL 提供的服务。将其安全保存以便后续配置使用。 #### 配置 Zotero 使用自定义翻译引擎 进入 Zotero 应用程序后,按照以下路径调整偏好设定: 1. 打开菜单栏中的 `编辑` -> `首选项...`; 2. 转到左侧列表里的 “语言” 选项卡; 3. 在这里能够指定外部机器翻译工具及其参数,比如选择启用 DeepL 并输入之前取得的 API Key 值于对应字段之中。 当上述步骤全部完成后,Zotero 就能利用所选服务执行高质量文档内容转换任务了。值得注意的是,某些高级特性可能仅限付费订阅者享有,请依据实际需求评估是否升级计划[^1]。 ```python # 示例伪代码展示如何存储敏感数据(如API Keys) import os def save_api_key(key_value): """Save the provided key into an environment variable.""" os.environ['DEEPL_API_KEY'] = key_value # Example usage of function with placeholder value instead real one. save_api_key('your-deepl-api-key-here') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值