该文章主要讲述了如何使用Python和Selenium模拟人类操作,破解验证码。首先,通过Selenium模拟操作获取不带缺口的图片,然后获取带缺口的图片,对比两张图片像素点的RGB值,得到缺口位置,最后模拟拖动滑块,通过匀加速匀减速运动来完成验证。
验证码获取网站为 http://www.geetest.com/。
极验滑动验证码比图形验证码的识别难度更大,其原理是将图片拖动到缺口处,然后拼合图像进行验证。该验证码会生成三个加密参数,通过表单提交到后台进行验证。极验验证码还采用了机器学习的方法来识别是否为恶意程序进行识别,并采用防模拟、防伪造和防暴力等方式进行保护,只需要 0.4 秒就可以完成验证,防止资源滥用和盗取。
通常情况下,只要我们的程序不是恶意的,并且遵守爬虫协议,就可以使用该验证码。但是请务必不要给服务器造成负担。
极验滑动验证码的识别思路可以通过模拟人类的操作方式来完成验证。这个过程分为三个步骤:模拟点击验证按钮、识别滑动缺口的位置和模拟拖动滑块。其中,第一步比较简单,第二步则需要使用图像处理技术,通过对比两张图片的像素差异来确定缺口的位置。第三步则需要模拟人类的移动轨迹,而人类移动轨迹是先加速后减速的,因此需要采用一些特殊方法来模拟这个过程,以通过验证。
Ps:动手能力弱的小伙伴可以直接访问www.ttocr.com进行识别
具体的实现过程可以参考以下 Python 代码:
# 注册的用户名和密码
email = ''
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
识别验证码第一步就是模拟点击初始的验证按钮,用显式等待的方法进行获取。
def get_geetest_button(self):
"""
获取初始验证按钮
返回值:按钮对象
"""
button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip')))
return button
在调用位置即可模拟点击:
# 点击验证按钮
button = self.get_geetest_button()
button.click()
接下来识别缺口的位置,首先获取两张图片,进行对比,不一样的位置就是缺口。
获取不带缺口的图片。用selenium选取图片元素得到整个网页的截图然后裁剪即可,代码如下:
def get_screenshot(self):
"""
获取网页截图
:return: 截图对象
"""
screenshot = self.browser.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
return screenshot
def get_position(self):
"""
获取验证码位置
:return: 验证码位置元组
"""
img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_img')))
time.sleep(2)
location = img.location
size = img.size
top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size[
'width']
return (top, bottom, left, right)
def get_geetest_image(self, name='captcha.png'):
"""
获取验证码图片
:return: 图片对象
"""
top, bottom, left, right = self.get_position()
print('验证码位置', top, bottom, left, right)
screenshot = self.get_screenshot()
<