在网络世界中,极验滑动验证码是常见的人机验证形式之一,通过拖动滑块拼合图像来完成验证。本文将介绍如何使用Python和Selenium库来实现极验滑动验证码的自动识别和验证过程。
准备工作 在开始之前,请确保已经安装好了Selenium库和Chrome浏览器,并且下载了对应版本的ChromeDriver驱动程序。
了解极验滑动验证码 极验滑动验证码的验证方式是通过拖动滑块将图像拼合完成,验证成功后才能继续操作。我们将以极验滑动验证码官网提供的示例为基础进行演示。
实现步骤
- 初始化 首先,我们需要初始化链接地址、创建模拟浏览器对象,并设置登录账户和密码等信息。
python
EMAIL = 'your_email@example.com' PASSWORD = 'your_password'
class CrackGeetest(): def init(self): self.url = 'https://account.geetest.com/login' self.browser = webdriver.Chrome() self.wait = WebDriverWait(self.browser, 20) self.email = EMAIL self.password = PASSWORD
1def crack(self): 2 pass
主程序入口
if name == 'main': crack = CrackGeetest() crack.crack() 2. 模拟登录填写,打开滑块验证 在实例化CrackGeetest对象后调用crack()方法开始模拟登录验证。首先打开登录界面,输入账户和密码,然后点击滑动验证按钮。
python
class CrackGeetest(): # ...
1def open(self): 2 self.browser.get(self.url) 3 email = self.wait.until(EC.presence_of_element_located((By.ID, 'email'))) 4 password = self.wait.until(EC.presence_of_element_located((By.ID, 'password'))) 5 email.send_keys(self.email) 6 password.send_keys(self.password) 7 8def get_geetest_button(self): 9 button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip'))) 10 return button 11 12def crack(self): 13 # 输入用户名密码 14 self.open() 15 # 点击验证按钮 16 button = self.get_geetest_button() 17 button.click() 18 # ...
3. 获取并储存有无缺口的两张图片 获取无缺口的验证图片并保存到本地,然后点击滑块,获取有缺口的验证图片并保存。
python
class CrackGeetest(): # ...
1def get_position(self): 2 img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_img'))) 3 time.sleep(2) 4 location = img.location 5 size = img.size 6 top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size['width'] 7 return (top, bottom, left, right) 8 9def get_screenshot(self): 10 screenshot = self.browser.get_screenshot_as_png() 11 screenshot = Image.open(BytesIO(screenshot)) 12 return screenshot 13 14def get_geetest_image(self, name='captcha.png'): 15 top, bottom, left, right = self.get_position() 16 screenshot = self.get_screenshot() 17 captcha = screenshot.crop((left, top, right, bottom)) 18 captcha.save(name) 19 return captcha 20 21def get_slider(self): 22 slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button'))) 23 return slider 24 25def crack(self): 26 # ... 27 28 # 获取验证码图片 29 image1 = self.get_geetest_image('captcha1.png') 30 # 点击呼出缺口 31 slider = self.get_slider() 32 slider.click() 33 # 获取带缺口的验证码图片 34 image2 = self.get_geetest_image('captcha2.png') 35 36 # ...
4. 获取缺口位置 对比两张图片的像素点,得到缺口位置。
python
class CrackGeetest(): # ...
1def get_gap(self, image1, image2): 2 left = 65 3 for i in range(left, image1.size[0]): 4 for j in range(image1.size[1]): 5 if not self.is_pixel_equal(image1, image2, i, j): 6 left = i 7 return left 8 return left 9 10def is_pixel_equal(self, image1, image2, x, y): 11 pixel1 = image1.load()[x, y] 12 pixel2 = image2.load()[x, y] 13 threshold = 60 14 if abs(pixel1[0]-pixel2[0]) < threshold and abs(pixel1[1]-pixel2[1]) < threshold and abs(pixel1[2]-pixel2[2]) < threshold: 15 return True 16 else: 17 return False 18 19def crack(self): 20 # ... 21 22 # 获取缺口位置 23 gap = self.get_gap(image1, image2) 24 print('缺口位置', gap) 25 # 减去缺口位移 26 gap -= BORDER 27 28 # ...
5. 获取移动轨迹 根据缺口位置获取滑块的移动轨迹。
python
class CrackGeetest(): # ...
1def get_track(self, distance): 2 track = [] 3 current = 0 4 mid = distance * 4 / 5 5 t = 0.2 6 v = 0 7 8 while current < distance: 9 if current < mid: 10 a = 2 11 else: 12 a = -3 13 v0 = v 14 v = v0 + a * t 15 move = v0 * t + 1 / 2 * a * t * t 16 current += move 17 track.append(round(move)) 18 return track 19 20def crack(self): 21 # ... 22 23 # 获取移动轨迹 24 track = self.get_track(gap) 25 print('滑动轨迹', track) 26 27 # ...
6. 按照轨迹拖动,完成验证 根据移动轨迹拖动滑块完成验证。
python
class CrackGeetest(): # ...
1def move_to_gap(self, slider, track): 2 ActionChains(self.browser).click_and_hold(slider).perform() 3 for x in track: 4 ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform() 5 time.sleep
更多内容联系1436423940