如何使用Python和Selenium模拟人类操作破解验证码

本文详细介绍了如何使用Python和Selenium模拟人类操作来破解极验滑动验证码。通过获取不带缺口和带缺口的图片,对比像素差异找到缺口位置,再模拟拖动滑块的匀加速匀减速运动来完成验证。具体步骤包括模拟点击验证按钮、识别缺口位置和模拟拖动。提供了一段Python代码作为实现过程的示例。
摘要由CSDN通过智能技术生成

该文章主要讲述了如何使用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()

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值