返回顶部
首页 > 资讯 > 后端开发 > Python >用selenium解决滑块验证码
  • 490
分享到

用selenium解决滑块验证码

seleniumchromepython 2023-09-04 16:09:09 490人浏览 八月长安

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

摘要

前言 因为种种原因没能实现愿景的目标,在这里记录一下中间结果,也算是一个收场吧。这篇博客主要是用selenium解决滑块验证码的个别案列。 思路: 用selenium打开浏览器指定网站将残缺块图片和背

前言

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

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

实现步骤

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 timeimport requestsfrom PIL import Imagefrom selenium.webdriver.common.by import Byfrom io import BytesIOtime.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 = 0x2 = 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 ECfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver import ActionChainsdef 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 匹配失败原因

这里有以下两点原因:

  1. 图片尺寸发生了变化,距离要进行转换。
  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-8import reimport requestsimport timefrom io import BytesIOimport cv2import numpy as npfrom PIL import Imagefrom selenium import webdriverfrom selenium.webdriver import ActionChainsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWaitclass 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 0def 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_newdef 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 imgCannydef 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)

来源地址:https://blog.csdn.net/qq_44419449/article/details/127414044

--结束END--

本文标题: 用selenium解决滑块验证码

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

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

猜你喜欢
  • 用selenium解决滑块验证码
    前言 因为种种原因没能实现愿景的目标,在这里记录一下中间结果,也算是一个收场吧。这篇博客主要是用selenium解决滑块验证码的个别案列。 思路: 用selenium打开浏览器指定网站将残缺块图片和背...
    99+
    2023-09-04
    selenium chrome python
  • 用selenium解决滑块验证码的实现步骤
    目录前言实现步骤1. 用selenium打开浏览器浏览指定网站1.1 找到chromedriver.exe的路径1.2 代码2.将残缺块图片和背景图片下载到本地2.1 找到图片位置2...
    99+
    2023-02-14
    selenium 滑动验证码 selenium 滑块验证 滑块验证码自动识别
  • OpenCV结合selenium实现滑块验证码
    本次案例使用OpenCV和selenium来解决一下滑块验证码 先说一下思路: 弹出滑块验证码后使用selenium元素截图将验证码整个背景图截取出来 将需要滑动...
    99+
    2024-04-02
  • selenium+opencv实现滑块验证码的登陆
    目录环境selenium登录网站requests抓取验证码图片OpenCV识别缺口位置模拟拖动滑块脚本示例:很多网站登录登陆时都要用到滑块验证码,在某些场景例如使用爬虫爬取信息时常常...
    99+
    2023-05-15
    selenium opencv滑块验证码 opencv滑块验证码
  • python+selenium行为链登录12306(滑动验证码滑块)
    使用python网络爬虫登录12306,网站界面如下。因为网站的反爬是不断升级的,以下代码虽然当前可用,但早晚必将会不再能满足登录需求。但是知识的价值,是不容置疑的。 from s...
    99+
    2024-04-02
  • python 密码验证(滑块验证)
    目录题目描述:解题思路/算法分析/问题及解决实验代码题目描述: (1)模拟登陆界面,判别用户名和密码,给出合适的提示,如果超过三次,锁定输入。用代替密码;或者最新输入显示,前面的变成...
    99+
    2024-04-02
  • 怎么使用selenium+opencv实现滑块验证码的登陆
    本文小编为大家详细介绍“怎么使用selenium+opencv实现滑块验证码的登陆”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用selenium+opencv实现滑块验证码的登陆”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-07-06
  • selenium+java破解极验滑动验证码的示例代码
    摘要分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码。人工验证的过程打开威锋网注册页面移动鼠标至小滑块,一张完整的图片会出现(如下图1)点击鼠标左键,图片中间会出现一个缺块(如下图2)移动小滑块正上方图案...
    99+
    2023-05-30
  • Python实现滑块验证码详解
    本节要讲解如下图所示的滑块验证码(更为复杂的滑动拼图验证码在下一篇介绍)。这种验证码机制比较简单:将滑块拖动到滑轨的最右端即可完成验证,如下图所示。如果未将滑块拖动到滑轨的最右端,则...
    99+
    2024-04-02
  • python滑块验证码如何破解
    很抱歉,我不能提供关于破解滑块验证码的信息。这是不道德且违法行为,违反了网站的服务条款和法律法规。我鼓励尊重和遵守所有的在线服务和法...
    99+
    2023-08-24
    python
  • Java + Selenium + OpenCV解决自动化测试中的滑块验证问题
    目录1、滑块验证思路2、使用OpenCV进行图片解析2.1 OpenCV引入项目2.2 实现图片解析,计算所需距离2.3 算法解析说明3、Selenium处理滑块滑动4、最终效果最近...
    99+
    2024-04-02
  • JavaScript实现滑块验证码
    本文实例为大家分享了JavaScript实现滑块验证码的具体代码,供大家参考,具体内容如下 效果:鼠标在底部滑块上按下按住不松拖动可以移动滑块,上面大图里面带有小图背景的滑块也会跟随...
    99+
    2024-04-02
  • Java selenium处理极验滑动验证码示例
    要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题,我按照这思路去大概实现了一下。1.使用htmlunit(这种方式我没成功,模拟鼠标拖拽后轨迹没生成,可以跳过)我用的是java,我首先先想到了...
    99+
    2023-05-31
    java selenium ava
  • 利用Python+Selenium破解春秋航空网滑块验证码的实战过程
    目录前言开发工具环境搭建实战记录一.验证码简介二.破解滑块验证码2.1计算滑块到缺口的距离2.2将滑块拖到缺口位置前言 记录一次利用Python+Selenium破解滑块验证码的实战过程。 让我们愉快地开始吧~ 开...
    99+
    2022-06-02
    Python Selenium滑块验证码 Python Selenium验证码
  • SpringBoot实现滑块验证码验证登陆校验功能详解
    目录前言一、实现效果二、实现思路三、实现步骤1. 后端 java 代码1.1 新建一个拼图验证码类1.2 新建一个拼图验证码工具类1.3 新建一个 service 类1.4 新建一个...
    99+
    2024-04-02
  • 怎么用JavaScript实现滑块验证码
    本篇内容主要讲解“怎么用JavaScript实现滑块验证码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用JavaScript实现滑块验证码”吧!效果:鼠标在底部滑块上按下按住不松拖动可以移...
    99+
    2023-06-25
  • Python实现滑块拼图验证码详解
    目录初级版滑块拼图验证码补充知识点高级版滑动拼图验证码滑动拼图验证码可以算是滑块验证码的进阶版本,其验证机制相对复杂。本节将介绍两种滑动拼图验证码:初级版和高级版本。 初级版滑块拼...
    99+
    2024-04-02
  • Python爬虫怎么破解滑块验证码
    这篇文章主要介绍“Python爬虫怎么破解滑块验证码”,在日常操作中,相信很多人在Python爬虫怎么破解滑块验证码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python爬虫怎么破解滑块验证码”的疑惑有所...
    99+
    2023-06-20
  • python selenium滑动验证防检测
    目标网站:aliexpress(全球速卖通)阿里国际站登录url : https://login.aliexpress.com/ python selenium 输入用户名,密码 拖动滑块验证,因为这个不涉及到缺口,理论上是很简单的配置好s...
    99+
    2023-01-31
    python selenium
  • Java实现滑块拼图验证码
    本文实例为大家分享了Java实现滑块拼图验证码的具体代码,供大家参考,具体内容如下 1、后端随机生成抠图和带有抠图阴影的背景图片,后台保存随机抠图位置坐标 2、前端实现滑动交互,将抠...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作