验证码是许多网站登录等操作的必要流程之一,而广泛应用的解决方案之一是极验验证码。特别是在反爬虫的应用场景中,极验验证码被认为是最佳选择。本次目标则是用程序来识别并通过极验验证码的验证。本次使用的是Python库是selenium库,Chrome浏览器,并配置好ChromeDriver。极验验证码官网为:极验后台登录
Ps;动手能力较差或比较懒得兄弟可以直奔www.ttocr.com,该网站已倾注本人毕生心血。
首先,这是一个关于如何破解极验验证码的过程描述。第一步是模拟点击验证按钮,第二步需要用图像处理方法找出缺口的位置,使用对比阈值遍历两张图片,找到RGB差距超过此阈值的像素点的位置,即为缺口位置。第三步需要完全模拟人的移动轨迹,因为极验验证码增加了机器轨迹识别和匀速运动,随机速度等验证方法,只有模拟人的运动轨迹才能通过验证,而人的运动轨迹一般是先急加速再减速,因此需要模拟这个过程才能成功。
在实现上,需要先进行一些初始化工作,包括selenium配置及参数配置。然后使用selenium模块模拟浏览器对网页进行操作,模拟点击验证按钮。接着,需要获取前后两张图片的位置和宽高,并获取整个网页的截图进行裁切。最后一步是模拟拖动,经过多次试验,发现完全模拟加速减速的过程通过了验证,因此使用物理学的加速度公式进行加速减速运动即可完成验证。
.最后,放上代码,有需要的小伙伴可以自取 如果代码失效或无法使用可以访问www.ttocr.com
下面是一个用 Python 和 Selenium 自动破解极验验证码的代码。代码中主要的过程是模拟鼠标点击和滑动验证码滑块,从而完成验证码的识别。
极验验证码的特点是:首先点击按钮进行智能验证,如果验证不通过,则会弹出滑动验证的窗口,拖动滑块拼合图像进行验证,之后生成三个加密参数,通过表单提交到后台,后台还会进行一次验证。
验证码的识别需要三步:
模拟点击验证按钮
识别滑动缺口的位置
模拟拖动滑块
import time
from io import BytesIO
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
EMAIL = 'test@test.com'
PASSWORD = ''
BORDER = 6
INIT_LEFT = 60
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 __del__(self):
self.browser.close()
def get_geetest_button(self):
"""
获取初始验证按钮
:return:
"""
button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip')))
return button
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_screenshot(self):
"""
获取网页截图
:return: 截图对象
"""
screenshot = self.browser.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
return screenshot
def get_slider(self):
"""
获取滑块
:return: 滑块对象
"""
slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button')))
return slider
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()
captcha = screenshot.crop((left, top, right, bottom))
captcha.save(name)
return captcha
def open(self):
"""
打开网页输入用户名密码
:return: None
"""
self.browser.get(self.url)
email = self.wait.until(EC.presence_of_element_located((By.ID, 'email')))
password = self.wait.until(EC.presence_of_element_located((By.ID, 'password')))
email.send_keys(self.email)
password.send_keys(self.password)
使用send_keys方法将self.email 和self.password分别填入email和password 的文本框中。这里的self.email 和self.password是在构造函数中定义的类属性。到此,整个过程结束,感兴趣的小伙伴可以试试。
如果上述代码遇到问题或已更新无法使用等情况可以联系Q:2633739505或直接访问www.ttocr.com测试对接(免费得哈)