硒+铬滑动验证码破解二(某某网站)

  

具体详情见代码,研究网站,随便输入手机号点击获取验证码

  

在自己写代码前参考了一批博客,是把所有验证码图片截取所有验证码图片保存在本地,再对比,感觉方法不行,所以自己写了个破解方法,通过js修改css直接抓取完整图片,因为上一篇写了B站,这里就不一一分析了,直接上代码:

  

破解成功界面

  

硒+铬滑动验证码破解二(某某网站)

  

完整代码:

        # - * -编码:utf - 8 - *   “‘   研究网站:https://account.ch.com/NonRegistrations-Regist   滑块验证码也分两种:   1 .直接给缺口图片,先滑动到缺口找到完整验证码图片,对比有缺口的验证码图片,然后计算缺口坐标,再利用硒移动按钮到指定位置   2 .直接给原图,缺口需要点击出现,直接保存原图,然后对比   “‘   从硒进口webdriver   从selenium.webdriver.support。等进口WebDriverWait   从selenium.webdriver。支持导入expected_conditions EC   从selenium.webdriver.common.by进口   从硒。webdriver进口ActionChains   lxml。html进口etree   从公益诉讼导入图像   从进口睡眠时间   进口稀土,请求   urllib。要求进口urlretrieve   从bs4进口BeautifulSoup      类SliderVerificationCode(对象):   def __init__(自我):#初始化一些信息   自我。左=60 #定义一个左边的起点缺口一般离图片左侧有一定的距离有一个滑块   自我。url=' https://account.ch.com/NonRegistrations-Regist '   自我。chromedriverPath=" C: \程序文件(x86) \谷歌Chrome \程序\ \ chromedriver.exe”   自我。司机=webdriver.Chrome (executable_path=self.chromedriverPath)   自我。等待=WebDriverWait(自我。司机,20)#设置等待时间20秒   自我。电话=" 18516544488 "      def input_name_password(自我):#输入手机号   self.driver.get (self.url)   self.driver.maximize_window ()   自我。inputphone=self.wait.until (EC.presence_of_element_located ((。名字,phoneNumberInput)))   self.inputphone.send_keys (self.phone)         def click_login_button(自我):#点击登录按钮,出现验证码图片   login_button=self.wait.until (EC.element_to_be_clickable ((。ID, getDynamicPwd)))   login_button.click ()   睡眠(1)      def get_geetest_image(自我):#获取验证码图片   #打印(self.driver.page_source)   gapimg=self.wait.until (EC.presence_of_element_located ((。CLASS_NAME, geetest_canvas_bg)))   睡眠(2)   gapimg.screenshot (r/captcha1.png。)   #通过js代码修改标签样式显示图片2   js=' var=document.getElementsByClassName变化(“geetest_canvas_fullbg”);改变[0]。风格="显示:块;“   self.driver.execute_script (js)   睡眠(2)   fullimg=self.wait.until (   EC.presence_of_element_located ((。CLASS_NAME, geetest_canvas_fullbg)))   fullimg.screenshot (r/captcha2.png。)      def is_similar(自我,image1 image2, x, y):   “判断两张图片各个位置的像素是否相同   # image1:带缺口的图片   :param image2:不带缺口的图片   :param x:位置x   y: param y:位置   返回:(x, y)位置的像素是否相同   “‘   #获取两张图片指定位置的像素点   pixel1=image1.load () (x, y)   pixel2=image2.load () (x, y)   #设置一个阈值允许有误差   阈值=60   #彩色图每个位置的像素点有三个通道   如果abs (pixel1 [0] - pixel2 [0]) & lt;阈值和abs (pixel1 [1]——pixel2 [1]) & lt;阈值和abs (   pixel1 [2]——pixel2 [2]) & lt;阈值:   还真   其他:   返回假      def get_diff_location(自我):#获取缺口图起点   captcha1=Image.open (“captcha1.png”)   captcha2=Image.open (“captcha2.png”)   x的范围(自我。离开,captcha1.size[0]): #从左到右x方向   y的范围(captcha1.size[1]): #从上到下y方向   如果没有自我。is_similar (captcha1 captcha2, x, y):   返回x #找到缺口的左侧边界在x方向上的位置      def get_move_track(自我、gap):   跟踪=[]#移动轨迹   当前=0 #当前位移   #减速阈值   中期=差距* 4/5 #前4/5段加速后1/5段减速   t=0.2 #计算间隔   v=0 #初速度   虽然目前& lt;差距:   如果当前& lt;中期:=3 #加速度为+ 3   其他:=3 #加速度为3   v0=v #初速度半   v=v0 + t * #当前速度   移动=v0 * t + 1/2 * * t * #移动距离   当前+=#当移动前位移   track.append(圆(移动))#加入轨迹   返回跟踪      def move_slider(自我、跟踪):   滑块=self.wait.until (EC.presence_of_element_located ((。CSS_SELECTOR, .geetest_slider_button)))   ActionChains (self.driver) .click_and_hold(滑块).perform ()   x在跟踪:#只有水平方向有运动按轨迹移动   ActionChains (self.driver)。move_by_offset (xoffset=x, yoffset=0) .perform ()   睡眠(1)   .perform ActionChains (self.driver) .release()() #松开鼠标      def主要(自我):   self.input_name_password ()   self.click_login_button ()   self.get_geetest_image ()   差距=self.get_diff_location() #缺口左起点位置   差距=差距- 6 #减去滑块左侧距离图片左侧在x方向上的距离即为滑块实际要移动的距离   跟踪=self.get_move_track (gap)   打印(“移动轨迹”,跟踪)   self.move_slider(跟踪)         if __name__==癬_main__”:   springAutumn=SliderVerificationCode ()   springAutumn.main ()

硒+铬滑动验证码破解二(某某网站)