写在前面:
其实本程序还有很多需要完善和改进的地方,后面会进行完善,大家多多包涵
概述
-
通过完整图片与缺失滑块的图片进行像素对比,确定滑块位置
-
边缘检测算法,确定位置
-
规避检测,模拟人的行为进行滑动滑块
实现
-这里以带刷网为例,展示验证码滑动的效果
#!/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 = 0 while y &