前言
仅作学习交流,非商业用途,如侵删
目标地址 aHR0cHM6Ly93d3cuemhpaHUuY29tL3F1ZXN0aW9uLzYyMDkwNzk5Ng==
一、分析登录流程
- 清除浏览器cookie,刷新页面,找到set-cookie d_c0参数,获取最初始,也最重要的参数(后面用来生成zse96)
- 输入账号密码,点击登录后会出现某盾的滑块,处理后获取ticket参数(滑块加密的算法网上很多,轨迹感觉不校验,我随机的轨迹成功率100%)
- 进行滑块成功校验,这里通过上一步的滑块成功后返回的validate生成一个新的 “ticket”: ‘{“validate”: "’ + ticket + ‘"}’ 这里 ticket 的生成要注意,被加密的字符串中fp 要和申请滑块的fp相同,否则会报错,校验成功后会返回 {success:true}
- 接下来就是提交账号密码,验证,密码并没有被加密处理,下面是提交的参数和一个时间戳加密算法
login_data = {
"client_id": "c3cef7c66a1843f8b3a9e6a1e3160e20",
"grant_type": "password",
"timestamp": 1694077667109,
"source": "com.zhihu.web",
"signature": get_signature(1694077667109),
"username": "+8613845622536",
"password": "11111111",
"captcha": "",
"utm_source": "",
"ref_source": "search",
}
def get_signature(timestamp):
a = hmac.new(b'd1b964811afb40118a12068ff74a12f4', digestmod=sha1)
a.update(b'password')
a.update(b'c3cef7c66a1843f8b3a9e6a1e3160e20')
a.update(b'com.zhihu.web')
a.update(str(timestamp).encode('utf-8'))
signature = a.hexdigest()
return signature
- 接下来将 logind_data urlencode 之后进行和zse96一样的加密处理,生成一个长的加密字符串,作为data参数进行提交验证,完成登录操作
二、登陆成功示例
总结
滑块相关: b,d 请求, acToken, fp, cb, data
登录相关: zse81可固定,zse96, sign_in的formdata, oauth的ticket