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

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

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Selenium 和 Webdriver 来解决滑动验证码的问题,你需要模拟一个真实的用户操作。下面是一些基本步骤: 1. 打开目标网站并输入用户名和密码; 2. 等待页面加载完成; 3. 找到滑动验证码的元素,获取其位置信息; 4. 找到滑块元素,并获取其位置信息; 5. 使用 `ActionChains` 类来模拟用户的拖动操作,将滑块拖动到正确的位置; 6. 检查验证码是否成功通过。 下面是一份示例代码,你需要根据实际情况进行调整: ```python from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time # 打开网站 driver = webdriver.Chrome() driver.get("http://www.example.com") # 输入用户名和密码 username_input = driver.find_element_by_id("username") password_input = driver.find_element_by_id("password") username_input.send_keys("your_username") password_input.send_keys("your_password") driver.find_element_by_id("submit").click() # 等待页面加载 time.sleep(5) # 找到验证码元素 slider = driver.find_element_by_id("slider") slider_bg = driver.find_element_by_id("slider_bg") # 获取元素位置信息 slider_location = slider.location slider_bg_location = slider_bg.location # 计算滑块需要移动的距离 distance = slider_bg_location['x'] + slider_bg.size['width'] - slider_location['x'] - slider.size['width'] # 模拟滑动操作 action = ActionChains(driver) action.click_and_hold(slider).perform() action.move_by_offset(distance, 0).perform() action.release().perform() # 检查验证码是否通过 if "验证成功" in driver.page_source: print("验证码通过") else: print("验证码未通过") # 关闭浏览器 driver.quit() ``` 需要注意的是,有些网站会对滑块进行一些加固,例如添加滑动速度限制、滑块位置随机等,这些都需要你自己去适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值