Python+selenium破解极验滑块验证码模拟人类行为~

本文介绍了一种使用Python结合selenium来破解极验滑块验证码的方法,通过像素对比和边缘检测确定滑块位置,并模拟人类行为进行滑动,以达到规避检测的效果。文中以带刷网为例展示了验证码滑动的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:

其实本程序还有很多需要完善和改进的地方,后面会进行完善,大家多多包涵

概述

  1. 通过完整图片与缺失滑块的图片进行像素对比,确定滑块位置

  2. 边缘检测算法,确定位置

  3. 规避检测,模拟人的行为进行滑动滑块

实现

-这里以带刷网为例,展示验证码滑动的效果

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/1/2 18:34
# @Author  : huni
# @File    : 验证码2.py
# @Software: PyCharm
from selenium import webdriver
import time
import base64
from PIL import Image
from io import BytesIO
from selenium.webdriver.support.ui import WebDriverWait
import random
import copy

class VeriImageUtil():

    def __init__(self):
        self.defaultConfig = {
            "grayOffset": 20,
            "opaque": 1,
            "minVerticalLineCount": 30
        }
        self.config = copy.deepcopy(self.defaultConfig)

    def updateConfig(self, config):
        # temp = copy.deepcopy(config)
        for k in self.config:
            if k in config.keys():
                self.config[k] = config[k]

    def getMaxOffset(self, *args):
        # 计算偏移平均值最大的数
        av = sum(args) / len(args)

        maxOffset = 0
        for a in args:
            offset = abs(av - a)
            if offset > maxOffset:
                maxOffset = offset
        return maxOffset

    def isGrayPx(self, r, g, b):
        # 是否是灰度像素点,允许波动offset
        return self.getMaxOffset(r, g, b) < self.config["grayOffset"]

    def isDarkStyle(self, r, g, b):
        # 灰暗风格
        return r < 128 and g < 128 and b < 128

    def isOpaque(self, px):
        # 不透明
        return px[3] >= 255 * self.config["opaque"]

    def getVerticalLineOffsetX(self, bgImage):
        # bgImage = Image.open("./image/bg.png")
        # bgImage.im.mode = 'RGBA'
        bgBytes = bgImage.load()

        x = 0
        while x < bgImage.size[0]:
            y = 0
            # 点》》线,灰度线条数量
            verticalLineCount = 
Python配合Selenium滑块验证码自动证的基本流程是这样的: 1. **安装依赖**: 首先,确保已经安装了`selenium`库,可以通过命令行执行 `pip install selenium` 完成安装。此外,还需要相应的浏览器驱动,例如Chromedriver或FirefoxDriver,根据你的浏览器类型选择合适的。 2. **启动浏览器**: 在Python脚本中初始化Selenium,创建一个`webdriver.Chrome()`或`webdriver.Firefox()`实例。为了不显示实际的浏览器窗口,可以设置`options`参数,如 `options.headless=True`。 ```python from selenium import webdriver # 后续加上对应浏览器的选项 options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') driver = webdriver.Chrome(options=options) ``` 3. **导航到登录页面**: 使用`get`方法加载目标登录页面URL。 ```python login_url = "https://your-website.com/login" driver.get(login_url) ``` 4. **找到滑块元素**: 使用`find_element_by_*`方法定位滑块元素,如`find_element_by_id('captcha')`或`find_element_by_xpath('//img[contains(@class, "captcha")]')`等。这里假设滑块是一个图像元素。 ```python captcha_elem = driver.find_element_by_id('captcha') ``` 5. **截取并处理滑块图片**: 用`screenshot_as_png`方法截图滑块,然后使用OpenCV或PIL库对图片进行预处理,包括灰度化、二值化等操作,以便后续的字符识别。 ```python import cv2 import numpy as np # 获取滑块图片 captcha_image = captcha_elem.screenshot_as_png # 读取图片 img = np.array(Image.open(BytesIO(captcha_image))) # 对图片进行预处理 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) ``` 6. **字符识别**: 可能需要借助OCR(Optical Character Recognition)工具,如`tesseract`,将预处理后的图像转为文本。注意这步需要正确配置`tesseract`。 ```python from pytesseract import image_to_string text = image_to_string(binary, lang='eng', config='--psm 11') # psm 11表示去除干扰线 ``` 7. **模拟滑动证**: 根据识别出的文字,计算滑动条的位置并模拟鼠标移动。由于这是一个抽象的概念,具体实现取决于滑块验证码的具体形式。 8. **提交表单**: 输入滑块验证码之后,找到提交按钮或者其他证通过的信号元素,如点击事件。 ```python captcha_input_field = driver.find_element_by_id('captcha_input') # 假设有一个input元素接受验证码 captcha_input_field.send_keys(text) submit_button = driver.find_element_by_css_selector('#submit-button') submit_button.click() ``` 9. **等待证完成**: 证完成后,可能需要等待一段时间让滑块证完成,例如使用`time.sleep()`。 10. **检查登录状态**: 检查登录后的行为或页面内容确认是否登录成功。 11. **关闭浏览器**: 最后,别忘了关闭浏览器会话。 ```python driver.quit() ``` 请注意,滑块验证码的实现往往非常复杂,尤其当涉及到动态加载或实时更新时,上述过程可能不够准确。实际项目中可能需要更精细的处理和错误处理。另外,遵循网站的robots.txt规则以及尊重其反爬虫策略是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值