广告
返回顶部
首页 > 资讯 > 后端开发 > Python >用selenium解决滑块验证码的实现步骤
  • 381
分享到

用selenium解决滑块验证码的实现步骤

Python 官方文档:入门教程 => 点击学习

摘要

目录前言实现步骤1. 用selenium打开浏览器浏览指定网站1.1 找到chromedriver.exe的路径1.2 代码2.将残缺块图片和背景图片下载到本地2.1 找到图片位置2

前言

因为种种原因没能实现愿景的目标,在这里记录一下中间结果,也算是一个收场吧。这篇博客主要是用selenium解决滑块验证码的个别案列。

思路:

  • 用selenium打开浏览器指定网站
  • 将残缺块图片和背景图片下载到本地
  • 对比两张图片的相似地方,计算要滑动的距离
  • 规划路线,移动滑块

实现步骤

1. 用selenium打开浏览器浏览指定网站

1.1 找到chromedriver.exe的路径

点击开始找到谷歌图标==》右键更多==》打开文件位置==》右键谷歌快捷方式==》属性 ==》打开文件所在的位置 ==》复制路径

chromedriver.exe路径

1.2 代码

from selenium import WEBdriver
# chrome_path要改成你自己的路径
chrome_path = r"C:\Users\11248\AppData\Local\Google\Chrome\Application\chromedriver.exe"
url = 'https://icas.jnu.edu.cn/cas/login'
driver = webdriver.Chrome(chrome_path)
driver.get(url)

2.将残缺块图片和背景图片下载到本地

2.1 找到图片位置

打开网页进入开发工具,找到图片位置

2.2 代码

import time
import requests
from PIL import Image
from selenium.webdriver.common.by import By
from io import BytesIO

time.sleep(5)	# 进入页面要停留几秒钟,等页面加载完
target_link = driver.find_element(By.CLASS_NAME, "yidun_bg-img").get_attribute('src')
template_link = driver.find_element(By.CLASS_NAME, "yidun_jigsaw").get_attribute('src')

target_img = Image.open(BytesIO(requests.get(target_link).content))
template_img = Image.open(BytesIO(requests.get(template_link).content))
target_img.save('target.jpg')
template_img.save('template.png')

3. 对比两张图片的相似地方,计算要滑动的距离

3.1 用matchTemplate获取移动距离

因为背景图片中的残缺块位置和原始残缺图的亮度有所差异,直接对比两张图片相似的地方,往往得不到令人满意的结果,在此要对两张图片进行一定的处理,为了避免这种亮度的干扰,笔者这里将两张图片先进行灰度处理,再对图像进行高斯处理,最后进行边缘检测。

def handel_img(img):
    imgGray = cv2.cvtColor(img, cv2.COLOR_RGBA2GRAY)  # 转灰度图
    imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)  # 高斯模糊
    imGCanny = cv2.Canny(imgBlur, 60, 60)  # Canny算子边缘检测
    return imgCanny

为增加工作量(放屁,统一代码好看点) 将JPG图像转变为4通道(RGBA)

def add_alpha_channel(img):
    """ 为jpg图像添加alpha通道 """
    r_channel, g_channel, b_channel = cv2.split(img)  # 剥离jpg图像通道
    alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 255  # 创建Alpha通道
    img_new = cv2.merge((r_channel, g_channel, b_channel, alpha_channel))  # 融合通道
    return img_new

3.2 代码

import cv2
# 读取图像
def match(img_jpg_path, img_png_path):
    # 读取图像
    img_jpg = cv2.imread(img_jpg_path, cv2.IMREAD_UNCHANGED)
    img_png = cv2.imread(img_png_path, cv2.IMREAD_UNCHANGED)
    # 判断jpg图像是否已经为4通道
    if img_jpg.shape[2] == 3:
        img_jpg = add_alpha_channel(img_jpg)
    img = handel_img(img_jpg)
    small_img = handel_img(img_png)
    res_TM_CCOEFF_NORMED = cv2.matchTemplate(img, small_img, 3)
    value = cv2.minMaxLoc(res_TM_CCOEFF_NORMED)
    value = value[3][0]  # 获取到移动距离
    return value

3.3 检验效果

为了验证思路和方法是否得当,这里将滑块图片与背景图片进行拼接,为后面埋下一个小坑。

def merge_img(jpg_img, png_img, y1, y2, x1, x2):
    """ 将png透明图像与jpg图像叠加
        y1,y2,x1,x2为叠加位置坐标值
    """
    # 判断jpg图像是否已经为4通道
    if jpg_img.shape[2] == 3:
        jpg_img = add_alpha_channel(jpg_img)
    # 获取要覆盖图像的alpha值,将像素值除以255,使值保持在0-1之间
    alpha_png = png_img[yy1:yy2, xx1:xx2, 3] / 255.0
    alpha_jpg = 1 - alpha_png

    # 开始叠加
    for c in range(0, 3):
        jpg_img[y1:y2, x1:x2, c] = ((alpha_jpg * jpg_img[y1:y2, x1:x2, c]) + (alpha_png * png_img[yy1:yy2, xx1:xx2, c]))

    return jpg_img
    
img_jpg_path = 'target.jpg'  # 读者可自行修改文件路径
img_png_path = 'template.png'  # 读者可自行修改文件路径
x1 = match(img_jpg_path, img_png_path)
y1 = 0
x2 = x1 + img_png.shape[1]
y2 = y1 + img_png.shape[0]
# 开始叠加
res_img = merge_img(img_jpg, img_png, y1, y2, x1, x2)
cv2.imshow("res_img ", res_img)
cv2.waiTKEy(0)

4. 规划路线,移动滑块

4.1 点击滑块移动

用第3节已经获取到的距离,点击滑块进行移动

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver import ActionChains

def crack_slider(distance):
	wait = WebDriverWait(driver, 20)
    slider = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'yidun_slider')))
    ActionChains(self.driver).click_and_hold(slider).perform()
    ActionChains(self.driver).move_by_offset(xoffset=distance, yoffset=0).perform()
    time.sleep(2)
    ActionChains(self.driver).release().perform()
    return 0

神奇的事情是,坑来了,没有匹配成功。

4.2 匹配失败原因

这里有以下两点原因:

  • 图片尺寸发生了变化,距离要进行转换。
  • 滑块滑动时,滑块和残缺块的相对位置有变动

首先解决图片尺寸变化问题,找到网页中图片大小:345x172.500

下载到本地图片大小:480x240

本地背景尺寸大小

所以要对距离进行以下处理:

	distance = distance / 480 * 345

关于第二个问题,这里没有找到很好的测量工具测量出来,好在验证码对位置精确度要求不高,就一个个试数吧。

distance = distance /480 * 345 + 12

5 运行演示

success

补充

在对极验验证码进行学习中,有的网站对移动轨迹进行了验证,如果滑动太快,也会被识别出机器操作,为了模拟人工操作,出色的程序员写出了一个魔幻移动轨迹,举个例子:我们可以先超过目标,再往回移动。

 def get_tracks(distance):
     distance += 20
     v = 0
     t = 0.2
     forward_tracks = []
     current = 0
     mid = distance * 3 / 5
     while current < distance:
         if current < mid:
             a = 2
         else:
             a = -3
         s = v * t + 0.5 * a * (t ** 2)
         v = v + a * t
         current += s
         forward_tracks.append(round(s))

     back_tracks = [-3, -3, -2, -2, -2, -2, -2, -1, -1, -1]
     return {'forward_tracks': forward_tracks, 'back_tracks': back_tracks}

  def crack_slider(tracks):
  	  wait = WebDriverWait(driver, 20)
      slider = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'yidun_slider')))
      ActionChains(driver).click_and_hold(slider).perform() # 模拟按住鼠标左键

      for track in tracks['forward_tracks']:
          ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()

      time.sleep(0.5)
      for back_tracks in tracks['back_tracks']:
          ActionChains(driver).move_by_offset(xoffset=back_tracks, yoffset=0).perform()

      ActionChains(driver).move_by_offset(xoffset=-4, yoffset=0).perform()
      ActionChains(driver).move_by_offset(xoffset=4, yoffset=0).perform()
      time.sleep(0.5)

      ActionChains(driver).release().perform()	# 释放左键
      return 0

完整代码

# coding=utf-8
import re
import requests
import time
from io import BytesIO

import cv2
import numpy as np
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

class CrackSlider():
    # 通过浏览器截图,识别验证码中缺口位置,获取需要滑动距离,并破解滑动验证码

    def __init__(self):
        super(CrackSlider, self).__init__()
        self.opts = webdriver.ChromeOptions()
        self.opts.add_experimental_option('excludeSwitches', ['enable-logging'])
        # self.driver = webdriver.Chrome(ChromeDriverManager().install(), options=self.opts)
        chrome_path = r"C:\Users\11248\AppData\Local\Google\Chrome\Application\chromedriver.exe"
        self.driver = webdriver.Chrome(chrome_path, options=self.opts)

        self.url = 'Https://icas.jnu.edu.cn/cas/login'
        self.wait = WebDriverWait(self.driver, 10)

    def get_pic(self):
        self.driver.get(self.url)
        time.sleep(5)
        target_link = self.driver.find_element(By.CLASS_NAME, "yidun_bg-img").get_attribute('src')
        template_link = self.driver.find_element(By.CLASS_NAME, "yidun_jigsaw").get_attribute('src')

        target_img = Image.open(BytesIO(requests.get(target_link).content))
        template_img = Image.open(BytesIO(requests.get(template_link).content))
        target_img.save('target.jpg')
        template_img.save('template.png')

    def crack_slider(self, distance):
        slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'yidun_slider')))
        ActionChains(self.driver).click_and_hold(slider).perform()
        ActionChains(self.driver).move_by_offset(xoffset=distance, yoffset=0).perform()
        time.sleep(2)
        ActionChains(self.driver).release().perform()
        return 0

def add_alpha_channel(img):
    """ 为jpg图像添加alpha通道 """

    r_channel, g_channel, b_channel = cv2.split(img)  # 剥离jpg图像通道
    alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 255  # 创建Alpha通道

    img_new = cv2.merge((r_channel, g_channel, b_channel, alpha_channel))  # 融合通道
    return img_new

def handel_img(img):
    imgGray = cv2.cvtColor(img, cv2.COLOR_RGBA2GRAY)  # 转灰度图
    imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)  # 高斯模糊
    imgCanny = cv2.Canny(imgBlur, 60, 60)  # Canny算子边缘检测
    return imgCanny

def match(img_jpg_path, img_png_path):
    # 读取图像
    img_jpg = cv2.imread(img_jpg_path, cv2.IMREAD_UNCHANGED)
    img_png = cv2.imread(img_png_path, cv2.IMREAD_UNCHANGED)
    # 判断jpg图像是否已经为4通道
    if img_jpg.shape[2] == 3:
        img_jpg = add_alpha_channel(img_jpg)
    img = handel_img(img_jpg)
    small_img = handel_img(img_png)
    res_TM_CCOEFF_NORMED = cv2.matchTemplate(img, small_img, 3)
    value = cv2.minMaxLoc(res_TM_CCOEFF_NORMED)
    value = value[3][0]  # 获取到移动距离
    return value

# 1. 打开chromedriver,试试下载图片
cs = CrackSlider()
cs.get_pic()
# 2. 对比图片,计算距离
img_jpg_path = 'target.jpg'  # 读者可自行修改文件路径
img_png_path = 'template.png'  # 读者可自行修改文件路径
distance = match(img_jpg_path, img_png_path)
distance = distance /480 * 345 + 12
# 3. 移动
cs.crack_slider(distance)

总结

到此这篇关于用selenium解决滑块验证码的文章就介绍到这了,更多相关selenium滑块验证码内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 用selenium解决滑块验证码的实现步骤

本文链接: https://www.lsjlt.com/news/195984.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 用selenium解决滑块验证码的实现步骤
    目录前言实现步骤1. 用selenium打开浏览器浏览指定网站1.1 找到chromedriver.exe的路径1.2 代码2.将残缺块图片和背景图片下载到本地2.1 找到图片位置2...
    99+
    2023-02-14
    selenium 滑动验证码 selenium 滑块验证 滑块验证码自动识别
  • 用selenium解决滑块验证码
    前言 因为种种原因没能实现愿景的目标,在这里记录一下中间结果,也算是一个收场吧。这篇博客主要是用selenium解决滑块验证码的个别案列。 思路: 用selenium打开浏览器指定网站将残缺块图片和背...
    99+
    2023-09-04
    selenium chrome python
  • OpenCV结合selenium实现滑块验证码
    本次案例使用OpenCV和selenium来解决一下滑块验证码 先说一下思路: 弹出滑块验证码后使用selenium元素截图将验证码整个背景图截取出来 将需要滑动...
    99+
    2022-11-12
  • selenium+opencv实现滑块验证码的登陆
    目录环境selenium登录网站requests抓取验证码图片OpenCV识别缺口位置模拟拖动滑块脚本示例:很多网站登录登陆时都要用到滑块验证码,在某些场景例如使用爬虫爬取信息时常常...
    99+
    2023-05-15
    selenium opencv滑块验证码 opencv滑块验证码
  • 怎么使用selenium+opencv实现滑块验证码的登陆
    本文小编为大家详细介绍“怎么使用selenium+opencv实现滑块验证码的登陆”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用selenium+opencv实现滑块验证码的登陆”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-07-06
  • Python实现滑块验证码详解
    本节要讲解如下图所示的滑块验证码(更为复杂的滑动拼图验证码在下一篇介绍)。这种验证码机制比较简单:将滑块拖动到滑轨的最右端即可完成验证,如下图所示。如果未将滑块拖动到滑轨的最右端,则...
    99+
    2022-11-11
  • Python实现滑块拼图验证码详解
    目录初级版滑块拼图验证码补充知识点高级版滑动拼图验证码滑动拼图验证码可以算是滑块验证码的进阶版本,其验证机制相对复杂。本节将介绍两种滑动拼图验证码:初级版和高级版本。 初级版滑块拼...
    99+
    2022-11-11
  • 怎么用JavaScript实现滑块验证码
    本篇内容主要讲解“怎么用JavaScript实现滑块验证码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用JavaScript实现滑块验证码”吧!效果:鼠标在底部滑块上按下按住不松拖动可以移...
    99+
    2023-06-25
  • SpringBoot实现滑块验证码验证登陆校验功能详解
    目录前言一、实现效果二、实现思路三、实现步骤1. 后端 java 代码1.1 新建一个拼图验证码类1.2 新建一个拼图验证码工具类1.3 新建一个 service 类1.4 新建一个...
    99+
    2022-11-13
  • 利用Python+Selenium破解春秋航空网滑块验证码的实战过程
    目录前言开发工具环境搭建实战记录一.验证码简介二.破解滑块验证码2.1计算滑块到缺口的距离2.2将滑块拖到缺口位置前言 记录一次利用Python+Selenium破解滑块验证码的实战过程。 让我们愉快地开始吧~ 开...
    99+
    2022-06-02
    Python Selenium滑块验证码 Python Selenium验证码
  • Java + Selenium + OpenCV解决自动化测试中的滑块验证问题
    目录1、滑块验证思路2、使用OpenCV进行图片解析2.1 OpenCV引入项目2.2 实现图片解析,计算所需距离2.3 算法解析说明3、Selenium处理滑块滑动4、最终效果最近...
    99+
    2022-11-13
  • 如何使用php+js实现极验,拖动滑块验证码验证表单
    这篇文章给大家分享的是有关如何使用php+js实现极验,拖动滑块验证码验证表单的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   代码实现   html文件   <!...
    99+
    2022-10-19
  • Android 简单的实现滑块拼图验证码功能
    目录实现过程:接下来我们对这个库进行介绍:实现滑块拼图验证码功能之前已经写过一篇了,上一篇使用的是自定义控件的方式实现这个功能,主要还是想让童鞋们知其然更知其所以然,还没看的童鞋可以...
    99+
    2022-11-11
  • 使用python 怎么实现一个滑块验证码识别功能
    今天就跟大家聊聊有关使用python 怎么实现一个滑块验证码识别功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。普通滑动验证import timefrom se...
    99+
    2023-06-14
  • python解决12306登录验证码的实现
    在家无聊,线代和高数看不懂,整点事情干,就准备预定回学校的高铁票,于是就有了这个文章 准备工作 1.pip安装chromediver,当然也可以手动解压(网上的教程好像没有提到pip...
    99+
    2022-11-12
  • laravel修改用户模块的密码验证实现
    目录从配置文件入手使用Auth门面的attempt方法进行登录修改 Admin 模型文章参考做项目的时候,用户认证几乎是必不可少的,如果我们的项目由于一些原因不得不使用 users ...
    99+
    2022-11-12
  • 使用Django实现商城验证码模块的方法
    本文主要涉及图形验证码的相关功能,主要包括,图形验证码获取、验证码文字存储、验证码生成等。 图形验证码接口设计和定义  验证码获取接口设计 uuid作为路径参数,唯一标识...
    99+
    2022-11-12
  • 解决Devc++运行窗口中文乱码的实现步骤
    目录一、问题描述二、问题的产生原因三、解决问题的方法(一)使用旧版控制台(二)更改dev++的编码为ans(三)将运行窗口更改为utf-8一、问题描述 当你打开DevC++,编写好代...
    99+
    2022-11-13
  • 超详细讲解Java秒杀项目用户验证模块的实现
    目录一、用户验证1、在方法内添加请求与反应2、cookie操作的封装3、UserServiceImpl4、跳转界面PathController 二、全局session1、导...
    99+
    2022-11-13
  • Android中用Bmob实现短信验证码功能的方法详解
     这篇文章主要介绍发送验证码和校验验证码的功能,用到一个第三方平台Bmob,那Bmob是什么呢?Bmob可以开发一个云存储的移动应用软件,他提供了大量的标准的API接...
    99+
    2022-06-06
    bmob 方法 验证码 短信验证码 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作