某当网登录滑块【协议+OCR】

📅 2026/7/20 13:13:20
某当网登录滑块【协议+OCR】
一、观察接口特征获取密钥接口。第一个接口getRankey请求载荷分析响应值分析2.获取滑块图片接口。 跳过isShowSlide接口直接看getSlidingVerifyCode接口因为返回值无重要信息请求载荷里面含requestId大概率就是第一次分析的接口中返回回来的响应值很明显能看见返回了很多重要信息可见这里是验证码的核心接口因为含有背景和滑块图的地址。验证滑块接口。滑动滑块分析滑块验证接口checkSlidingVerifyCode请求载荷响应载荷对比失败和成功登录验证接口。accountLogin二、定位每个接口的sign值生成位置并分析其加密逻辑直接全局搜索sign直接点进去断点观察接着对r进行了一次编码但得到的新r没有变化可以不用管对r进行了标准的MD5加密将md5加密后的字符串传入Y函数断点跟进Y函数内部可以看见是一个AES对称加密算法上帝视角后面的sign值都走的这个逻辑因为后面都是要挨个断点调试的所以就能看出来。所以我们直接将这个AES加密过程拿到本地js文件中保存下来方便后续纯nodejs调用。三、定位checkSlidingVerifyCode接口中的point_json还是直接全局搜索point_json定位到point_json生成位置就是将滑块到缺口的横纵坐标对象和getSlidingVerifyCode接口返回的encryptKey值当参数传给Y函数进行加密。注意x的值浏览渲染比例是350所以它除的是350而我们拿到的图片比例要除以408。四、理清逆向思路我们发现关键有4个接口getRankey接口获取密钥 rankey值 和 requestId值getSlidingVerifyCode接口获取滑块、背景图片encryptKey、token和y值checkSlidingVerifyCode接口获取 checkCode 值accountLogin接口做最后的登录处理每个接口请求载荷中均需要时间戳模拟直接上time库permanent_id均从cookie中直接取值后3个接口中的requestId值均从第一个接口的返回值中拿每个接口的sign值都是将该接口的请求参数拼接后经过md5加密再和rankey值一起除getRankey接口传空字符串传入Y函数也就是AES对称加密函数加密得到的值checkSlidingVerifyCode接口中的point_json值就是将明文密码和’qrcode_pssw0rdK’传入Y函数的返回值五、代码展示importrequests,time,hashlib,execjs,jsonfromddddocrimportDdddOcrclassSpider():def__init__(self):self.cookies自己复制cookieself.headers自己的headerself.ocrDdddOcr()withopen(./main.js,r,encodingutf-8)asf:self.ctxexecjs.compile(f.read())defget_rankey_requestId(self):urlhttps://login.dangdang.com/api/customer/loginapi/getRankeytsint(time.time()*1000)data{t:f{ts},ct:pc,permanent_id:self.cookies[__permanent_id],requestId:,sign:dxuL7I267hpFvpCnlF0IvrEpJz3GO2NkHMGo2A5LdukezDpDPhqo7lqMpklKBlS}# 检测了ct开头params_datafctpcpermanent_id{data[permanent_id]}t{ts}signself.ctx.call(aes,hashlib.md5(params_data.encode()).hexdigest(),)data[sign]sign resrequests.post(url,headersself.headers,cookiesself.cookies,datadata)print(res.json())returnres.json()[rankey],res.json()[requestId]defget_VerifyImage(self,rankey,requestId):urlhttps://login.dangdang.com/api/customer/loginapi/getSlidingVerifyCodetsint(time.time()*1000)data{t:f{ts},ct:pc,permanent_id:self.cookies[__permanent_id],requestId:requestId,situation:login,}params_datafctpcpermanent_id{data[permanent_id]}requestId{requestId}situationlogint{ts}signself.ctx.call(aes,hashlib.md5(params_data.encode()).hexdigest(),rankey)data[sign]sign responserequests.post(url,headersself.headers,cookiesself.cookies,datadata).json()slide_urlresponse[data][slideImg]bg_urlresponse[data][bgImg]encryptKeyresponse[data][encryptKey]yresponse[data][y]tokenresponse[data][token]print(response)returnslide_url,bg_url,encryptKey,y,tokendefget_move_x(self,slide_url,bg_url):slide_bytesrequests.get(slide_url).content bg_bytesrequests.get(bg_url).content resself.ocr.slide_match(slide_bytes,bg_bytes,simple_targetTrue)ifres:gap_xres[target][0]print(f缺口x坐标:{gap_x})returngap_xelse:print(识别失败)defcheckSlidingVerifyCode(self,x,y,encryptKey,requestId,token,rankey):urlhttps://login.dangdang.com/api/customer/loginapi/checkSlidingVerifyCodetsint(time.time()*1000)data{t:f{ts},ct:pc,permanent_id:self.cookies[__permanent_id],requestId:requestId,situation:login,verifyToken:token,slide_cost_time:108,need_new_verifydata:0,sign:uPjqm2GFKsc2NxfEE5oZreAFgvmlZB9RTsNNgUXJAZ6TUiQS9ClQ8w02BLTquYMj}t{x:x/408,y:y}point_jsonself.ctx.call(aes,json.dumps(t,separators(,,:)),encryptKey)data[point_json]point_json params_datafctpcneed_new_verifydata0permanent_id{data[permanent_id]}point_json{data[point_json]}requestId{requestId}situationloginslide_cost_time108t{ts}verifyToken{token}signself.ctx.call(aes,hashlib.md5(params_data.encode()).hexdigest(),rankey)data[sign]sign responserequests.post(url,headersself.headers,cookiesself.cookies,datadata)print(response.json())returnresponse.json()[data][checkCode]deflogin(self,requestId,token,checkCode,rankey):urlhttps://login.dangdang.com/api/customer/loginapi/accountLogintsint(time.time()*1000)username123456789psw123456passwordself.ctx.call(aes,psw,qrcode_pssw0rdK)data{t:f{ts},ct:pc,permanent_id:self.cookies[__permanent_id],requestId:requestId,username:username,password:password,autokey:off,token:token,check_code:checkCode,check_code_type:1,}params_datafautokeyoffcheck_code{checkCode}check_code_type1ctpcpassword{data[password]}permanent_id{data[permanent_id]}requestId{requestId}t{ts}token{token}username{username}signself.ctx.call(aes,hashlib.md5(params_data.encode()).hexdigest(),rankey)data[sign]sign responserequests.post(url,headersself.headers,cookiesself.cookies,datadata)print(response.json())if__name____main__:sSpider()# 第一个接口拿密钥rankey,requestIds.get_rankey_requestId()# 第二个接口拿图片地址encryptKeyy和tokenslide_url,bg_url,encryptKey,y,tokens.get_VerifyImage(rankey,requestId)# ocr识别 x 距离xs.get_move_x(slide_url,bg_url)# 第三个接口获取checkCode值checkCodes.checkSlidingVerifyCode(x,y,encryptKey,requestId,token,rankey)# 第4个接口直接登录s.login(requestId,token,checkCode,rankey)结语本文仅供学习使用如有侵权立即删除。