滑块验证码的破解方法主要有两种:获取一张完整的背景图和一张有缝隙的图片,将两张图片在像素上一一对比,找出不同的坐标。得到一张有间隙的图片和一张需要验证的小图片,对两张图片进行极化和归一化,确定小图片在图片中间的坐标。之后,我们将使用初中的物理知识。使用直线加速模拟人的手动操作,本次将使用第二种方法。第一种方法比较简单。废话不多说,直接上代码:下面使用headless浏览器获取滑块验证小图defget_image1(self,driver):"""获取滑块验证间隙小图:paramdriver:chrome对象:返回:小间隙图像"""canvas=driver.find_element_by_xpath("//div[@id='xy_img']").get_attribute("style")image_data=re.findall("data:image/jpg;base64,(.*?)\"\)",canvas)[0]#打印(图像数据)binary_image_data=base64.b64decode(image_data,'-_')file_like=BytesIO(binary_image_data)image=Image.open(file_like)返回图片一般来说这张小图是独立的,很容易获取,图片如下:获取滑块验证的背景图片!!!这个背景图片页面一般会乱序返回图片,然后通过重新排序图片js,破解很费时间,而且每个js的排序算法都不一样,所以不能复用.这里有一个trick,直接拿一个screenshot当前浏览器,截取指定范围的图片。defget_image2(self,driver):"""获取滑块验证码backgroundimage:paramdriver:chromeobject:return:backgroundimage"""driver.save_screenshot('yanzhengma.png')#通过图片获取坐标值元素节点#element=driver.find_element_by_id("bgImg")#left=元素。位置['x']#顶部=元素。location['y']#右=元素。位置['x']+元素。size['width']#bottom=element.location['y']+element.size['height']#通过绘图软件直接获取对应图片的坐标值left=359top=238right=658bottom=437#print((left,top,right,bottom))im=Image.open('yanzhengma.png')im=im.crop((left,top,right,bottom))returnim的图片如下如下:轨迹计算方法defget_track(self,distance):"""根据offset获取运动轨迹:paramdistance:offset:return:movementtrack"""#运动轨迹track=[]#当前位移current=0#减速阈值mid=distance*4/5#计算间隔t=0.2#初始速度v=0whilecurrent
