本文没有任何技术含量

1. 获取cookies:BAIDUID

通过访问百度首页,获取名为BAIDUID的cookies

2. 获取token

使用GET方法访问https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt={tt}&class=login&gid={gid}&logintype=dialogLogin&callback=bd__cbs__tesnqc以获取token

URL中需要本地构建的参数为:

  • tt:重新构建单位为毫秒的时间戳

  • gid:一串随机字符,但并非完全随机,构建过程:

    遍历xxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx

    如果字符为x,则将其替换为一个随机16进制整数

    如果字符为y,生成一个随机16进制整数m,在m的基础上构建新的16进制整数n,其中n=3&m|8,用n替换y

正常情况下返回值形如以下形式,自行提取其中token(我已经刷新登录过了,你拿到这个token也不关我事了(~ ̄▽ ̄)~)

bd__cbs__tesnqc({
    "errInfo": {
        "no": "0"
    },
    "data": {
        "rememberedUserName": "",
        "codeString": "",
        "token": "ff67252f39c3bd8e66d60658a561a261",
        "cookie": "1",
        "usernametype": "",
        "spLogin": "rate",
        "disable": "",
        "loginrecord": {
            'email': [],
            'phone': []
        }
    }
})

3. 获取cookies:UBI

使用GET方法访问https://passport.baidu.com/v2/api/?loginhistory&token={token}&tpl=mn&apiver=v3&tt={tt}&gid={gid}&callback=bd__cbs__splnc1

URL需要提供的参数:

  • token:由第二步获得

  • tt:重新构建单位为毫秒的时间戳

  • gid:与第二步中的gid相同即可

4. 获取验证码

使用GET方法访问https://passport.baidu.com/v2/api/?logincheck&token={token}&tpl=mn&apiver=v3&tt={tt}&sub_source=leadsetpwd&username={username}&isphone={is_phone}&dv={dv}&callback=bd__cbs__sehp6m

其中需要提供的参数

  • token:由第二步获得

  • tt:重新构建单位为毫秒的时间戳

  • username:用户名

  • is_phone:是否是手机

  • dv:暂时不知道参数含义,未填写也没有任何不正常的反馈

正常情况下返回值形如以下形式,提取其中codeString和vcodetype即可

bd__cbs__sehp6m({
    "errInfo": {
        "no": "0"
    },
    "data": {
        "codeString": "jxGcd07c114a7d1c10302ab14514301947f79fe4307e4047e0e",
        "vcodetype": "4aa0VVFeQMtUCx++z8kZZLjNrDxZr8g5i1e0TorX1ypp0buwY8JyrFu+o0LtbZXR39eXbblAadHnorRW+xEXArd7My5ujN4pQF51",
        "userid": "",
        "mobile": ""
    }
})

5. 获取公钥

使用GET方法访问https://passport.baidu.com/v2/getpublickey?token={token}&tpl=mn&apiver=v3&tt={tt}&gid={gid}&callback=bd__cbs__9t0drq其中需要处理的参数有

  • token:由第二步获得

  • tt:重新构建单位为毫秒的时间戳

  • gid:与第二步中的gid相同即可

正常情况下返回值形如以下形式,提取其中pubkey和key即可

bd__cbs__9t0drq({
    "errno": '0',
    "msg": '',
    "pubkey": '-----BEGINPUBLICKEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4EXZxz7729M8svJXkc7TkvNJL\nKl0VbEBv2ddSHI6Dr29llVoue2ORQcDIBWpa8Zj1qEOotZC+n6DFzyW\/ht3qveJq\nf32mByZB2ZGpBhRZr1mtyS9IF8ob\/jgsyKQeUXcHcAcZIkLR6zIvjhNh8a1csrOp\nDMoszvCdtnU0L2xdDwIDAQAB\n-----ENDPUBLICKEY-----\n',
    "key": 'YGlquFQPU2twyzAObfKslWyr8ABzJq9Y'
})

6. 正式登录

使用POST方法访问https://passport.baidu.com/v2/api/?login,提交的表单形式如下

    "staticpage": "https://www.baidu.com/cache/user/html/v3Jump.html"
    "charset": "UTF-8"
    "token": {第二步中获取的token}
    "tpl": "mn"
    "subpro": ""
    "apiver": "v3"
    "tt": base.get_time_stamp()
    "codestring": self.code_string
    "safeflg": "0"
    "u": "https://www.baidu.com/"
    "isPhone": ""
    "detect": "1",
    "gid": {第二步中创建的gid}
    "quick_user": "0"
    "logintype": "dialogLogin"
    "logLoginType": "pc_loginDialog"
    "idc": ""
    "loginmerge": "true"
    "splogin": "rate"
    "username": {你的用户名}
    "password": {你使用RSA加密后的密码}
    "verifycode": verify_code
    "mem_pass": "on"
    "rsakey": {第五步中获取的key}
    "crypttype": "12"
    "ppui_logintime": "10797"
    "countrycode": ""
    "dv": ""
    "callback": "parent.bd__pcbs__r6aj37"

需要注意的是,小弟只用自己账号测试过,没有用手机号码登录过,使用手机账号可能需要处理少数参数,请自行处理