本文仅供学习交流,如侵删!**##记录一个极限体验滑块验证分析并通过###运行环境-win10,mac-Python3.9-selenium,seleniumwire###分析我在做的一个项目登录时会触发滑块验证最近,长这个样子,可以明显看出是3代极速体验的验证。借助之前写阿里云盾的经验,先用selenium+pyautoui测试一下。详见:阿里云盾滑块验证直接提示被怪物吃掉!!!我们先研究一下官方文档,看看验证的业务逻辑:我以为是极限测试验证访问文档中检测到的selenium,结果手动测试发现可以滑动,也就是说滑动轨道应该触发风控。分析了一波验证规则和原理,就很容易理解其中的原理了。##解决方案####使用selenium请求url,并触发滑块验证`pythondefopen(self):"""loginmodule"""#Locatepasswordloginself.driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div/div/div[1]/div[2]').click()#输入账号用户名='123456'self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div/div/div/div[2]/div[1]/form/div[1]/div/div/input').send_keys(username)时间。sleep(1)#输入密码password='123456789'self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div/div/div[2]/div[1]/form/div[2]/div/div/input').send_keys(password)time.sleep(1)#登录self.driver.find_element_by_xpath('//*[@id="app"]/div/格/格/格/格/格[2]/div[3]/button').click()`####获取验证码图片并计算滑块距离`pythondefget_images(self):"""获取验证码图片:return:位置信息image"""#对于有空隙的图片,使用js定位读取图片data:image/png;base64的数据信息,直接调用识别空隙fullgb=self.driver.execute_script('returndocument.getElementsByClassName("geetest_canvas_bggeetest_absolute")[0].toDataURL("image/png")')#完整图片,使用js定位读取图片data:image/png;base64的数据信息,直接调用识别间隙bg=self.driver.execute_script('returndocument.getElementsByClassName("geetest_canvas_fullbggeetest_fadegeetest_absolute")[0].toDataURL("image/png")')returnbg,fullgbdefget_decode_image(self,location_list):"""解码base64数据theimage"""#提取image_的base64数据_,img=location_list.split(",")#将数据转换为Bytesimg=base64.decodebytes(img.encode())#读取图像new_im:PngImagePlugin.PngImageFile=image.open(BytesIO(img))#new_im.convert("RGB")#new_im.save(filename)returnnew_imdefcompute_gap(self,img1,img2):"""这样计算gapoffset成功率高"""#修改图片为RGB模式img1=img1.convert("RGB")img2=img2.convert("RGB")#计算差异diff=ImageChops.difference(img1,img2)#灰度diff=diff.convert("L")#二进制diff=diff.point(self.table,'1')left=43forwinrange(left,diff.size[0]):lis=[]forhinrange(diff.size[1]):如果diff.load()[w,h]==1:lis.append(w)iflen(lis)>5:returnw`####generateslidingtrack`pythondefget_tracks(self,distance,seconds,ease_func):""":paramdistance:gapposition:paramseconds:time:paramease_func:generationfunction:return:trackarray"""tracks=[0]offsets=[0]fortinnp.arange(0.0,seconds,0.1):ease=ease_funcoffset=round(ease(t/seconds)*distance)tracks.append(offset-offsets[-1])offsets.append(offset)returntracks`####滑动模块`pythondefmove_to_gap(self,track):"""滑动滑块"""print('第一步,点击滑动按钮')slider=self.wait.until(EC.presence_of_elment_located((By.CLASS_NAME,'geetest_slider_button')))ActionChains(self.driver).click_and_hold(slider).perform()time.sleep(1)print('第二步,拖动元素')fortrackintrack:ActionChains(self.driver).move_by_offset(xoffset=track,yoffset=0).perform()#鼠标移动到距离当前位置的距离(x,y)time.sleep(0.0001)`##效果是完美解决**##资源下载https://download.csdn.net/download/qq_38154948/85328666**本文仅供学习交流,如有侵删!**
