跳转至

贝壳网页登录说明

本文档用于说明采集贝壳房产的成交记录时所遇到的逆向情况,只记录了主要接口的逆向。

主要包括网页的登录接口逆向、app 成交记录的两个接口的逆向

1. 前提条件

app 逆向部分请在 贝壳找房 app Authorization 逆向说明 文章中查看,js 逆向前准备如下:

  • 配置好逆向环境的手机一台,本文使用的是一加7 pro,具体逆向环境配置篇请查看开发文档中的文章即可。
  • google 浏览器

2. 网页接口登录逆向部分

以下部分为贝壳网页端登录的逆向说明。

登录验证的总流程如下:

image-20220114094843587

对以上图片和对应程序中的代码对应解释如下,网页端登录接口主要有以下请求:

  • 三次 __get_abdr 请求(可只模拟一次)
  • 两次 __get_initialize 请求(也可只模拟一次)
  • __authenticate 请求

注:若出现问题,优先注意以下问题:

  1. 则优先查看加密版本返回是否改变;
  2. 完善缺失的请求;
  3. 完善浏览器环境的信息生成过程。

2.1. __get_abdr 请求

此请求获取了浏览器环境,然后经过了 aes 加密,加密结果作为此请求包的 post 请求参数,响应内容中好多参数用于 __authenticate 登录请求包参数的来源数据。

环境提取的地方为: var T, n = lN[this[b('0x164')]], p = {}, u = 0x0;

image-20220112151400070

对环境值加密后再处理

image-20220112180314730

字段 说明 类型 是否必填 备注
取环境值,并 aes 加密,最后编码等格式处理而得 str
  • 返回结果(只介绍主要参数,其余略):
字段 说明 类型 备注
data 用于登录请求包 sicId 参数的生成 str
key_id 用于登录请求包 sicId 参数的生成 str
sign 用于登录请求包 sicId 参数的生成 str

2.2. __get_initialize 请求

此请求返回登录请求包的 rsa 加密的 key, 加密版本及 loginTicketId 等信息。

此请求的参数直接固定写死即可。

字段 说明 类型 是否必填 备注
{"service":"https://ajax.api.ke.com/login/login/getuserinfo","version":"2.0"} str
  • 返回结果(只介绍主要参数,其余略):
字段 说明 类型 备注
loginTicketId 用于登录请求包标识 str
version 用于登录请求包 password 生成所需加密的版本 str
key 用于登录请求包 password 生成所需 rsa 的 key 值 str

返回的整体内容示例如下:

{
    "authenticationMethods":{
        "customer":[
            {
                "type":"phone-code",
                "allianceMethods":[

                ],
                "initialOptions":{

                }
            },
            {
                "type":"username-password",
                "allianceMethods":[

                ],
                "initialOptions":{

                }
            },
            {
                "type":"oauth",
                "allianceMethods":[

                ],
                "initialOptions":{

                }
            }
        ]
    },
    "loginTicketId":"Ys7AvmXnVtFUxvC7uGsnv78Yf3Z19wkt",
    "publicKey":{
        "version":"1",
        "key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCB81pk1Go/d7K8unYqeB6YyQdDgIRsLji7BxlBfMC2U8/0lyOLxJ6sQb1RmKaILuxN0hRci4zWPfkkPhttWaogq3XABYiDYbx0843ge4D79pG21+qWplw43uHZNs0B6iUChJW1O3DDJPXGwj50L1ySTVt7G7iqsIr9PLZVRSZmQIDAQAB"
    },
    "success":true,
    "supportedAccountSystems":[
        {
            "id":"customer",
            "name":"C端用户",
            "viewStyle":{
                "register-entry":"/register"
            }
        }
    ]
}

2.3. __authenticate请求

此请求返回登录请求包的 rsa 加密的 key, 加密版本及 loginTicketId 等信息。

此请求的参数直接固定写死即可。

字段 说明 类型 是否必填 备注
{"service":"https://ajax.api.ke.com/login/login/getuserinfo","mainAuthMethodName":"username-password","accountSystem":"customer","credential":{"username":self.account,"password":self.pwd,"encodeVersion":self.encodeVersion},"context":{},"loginTicketId":self.loginTicketId,"version":"2.0","srcId":self.srcId_res,"ticketMaxAge":604800} str

以上参数说明如下:

  1. username:账号信息,为手机号
  2. password:账号对应密码
  3. encodeVersion:加密版本信息
  4. loginTicketId:登录标识
  • 返回结果(只介绍主要参数,其余略):

返回结果目前来说都不重要,主要是需要成功登录后的 lianjia_token 值

放入登录成功示例图:

image-20220114101328819

3. 补充

参数获取比较简单,就是稍微麻烦点,参数处理的比较多,用到 aes、rsa 及 base64 等多种处理方式。

  • 可以调试出加密方法和对应配置后,直接用 python 对应加密库实现即可,所以本文并未介绍扣代码和参数定位。

评论

回到页面顶部