一.滑块验证码方案
1.背景
项目中有时验证码是滑块滑动拼图形式验证的,这种验证码该如何完成验证呢?
2.思路
-
1.获取完整验证码背景图片及缺口验证码图片
-
2.匹配缺口照片在完整照片的位置
-
3.机器模拟人工滑动轨迹
-
4 判断拼图是否成功,若成功,跳转其它页面;若失败,滑块拼图递归循环调用
二.豆瓣示例
1.完整验证码背景图片及缺口验证码图片
完整验证码背景图片
缺口验证码图片
其中缺口图片全图如下,需要把缺口图片扣出来。
缺口图片原图
缺口图片扣图后的结果图片
示例代码如下:
`image = Image.open(io.BytesIO(response.content)) image.save(SliderCaptchaDemo.FULL_SLIDER_IMAGE) # 获取验证码x,y轴坐标 crop_point = (71, 248) # 获取验证码的长宽 crop_size = (61, 61) # 设备分辨率为2 scale = 2 rangle = (crop_point[0] * scale, crop_point[1] * scale, crop_point[0] * scale + crop_size[0] * scale, crop_point[1] * scale + crop_size[1] * scale ) verification_image = image.crop(rangle) # verification_image = verification_image.convert('RGB') # 保存我们截取的验证码图片,并读取验证码内容 verification_image.save(SliderCaptchaDemo.SLIDER_IMAGE)`
2.完整示例代码
` import numpyfrom selenium import webdriverfrom selenium.common import NoSuchElementExceptionfrom selenium.webdriver import ActionChainsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver import Chromefrom selenium.webdriver import ChromeOptionsfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesfrom selenium.webdriver.safari.options import Optionsimport timeimport requestsfrom PIL import Imageimport ioimport cv2 class SliderCaptchaDemo(object): URL = "https://accounts.douban.com/passport/login" BK_IMAGE = 'bk_image.png' FULL_SLIDER_IMAGE = "full_slider_image.png" SLIDER_IMAGE = "slider_image.png" TIME_OUT = 20 def __init__(self): option = ChromeOptions() # 解决滑块无法滑动的问题 option.add_experimental_option('excludeSwitches', ['enable-automation']) option.add_experimental_option('detach', True) # 创建一个对象,控制chrome浏览器 self.driver = webdriver.Chrome(options=option) # 创建 SafariOptions 实例 # option = Options() # # 添加选项 # option.add_argument('-enableFullPageScreenshot