Selenium滑动验证码破解(缺口对应却无法通过,需要做鼠标轨迹模拟)

这篇具有很好参考价值的文章主要介绍了Selenium滑动验证码破解(缺口对应却无法通过,需要做鼠标轨迹模拟)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、前言

平台:
windows11    
python         
所涉及内容:
selenium                  4.1.3
selenium-wire             4.6.3
chromedriver 
滑动验证码破解原理:
1、获取完整图片和带有缺口的残图
2、通过比对完整图片和残图,确定缺口偏移量
3、通过selenium模拟鼠标点击移动,完成滑动验证码识别
解决场景:
1、普通滑动验证码的识别验证
2、
    手工启动chrome,人工拖动验证码可以通过验证。
    使用selenium启动chrome,人工拖动验证码可以通过验证。
    使用selenium启动chrome,程序模拟拖动验证码无法通过验证。(原因即为上面所述)

博客:https://blog.csdn.net/sayyy/article/details/99649372 中介绍了chromewebdriver的特征值,
通过修改$cdc_asdjflasutopfhvcZLmcfl_ 可以绕过场景2,本人复现后无法解决,有兴趣的可以去验证一下,有效果烦请留言教教我。

2、缺口图获取

正常情况下,滑动验证码都是在canvas画出来的(残图一般是JS通过对后台返回的完整图片剪裁而来),在网页代码中可以找到对应信息
残图直接画在Canvas上,因此需要通过js代码将其导出,获取图片的base64数据(错存在直接能下载,那就更好了)。

    //将canvas上的图片转化为base64,可以直接在chrome的控制台尝试
    js = '''return document.querySelector("#captcha > canvas:nth-child(1)").toDataURL()'''
    //执行js获取base64
    base64str = driver.execute_script(js)
    //去除data:image/png;base64等冗余值
    resultstr = base64str.strip("data:image/png;base64")
    resultstr = resultstr[1:]
    //base64反向编码
    imagedata = base64.b64decode(resultstr)
    //保存为图片文件
    file = open('./cq.png', "wb")
    file.write(imagedata)
    file.close()

3、完整图片获取

不同的网站存在不同情况
1、可以通过执行JS代码修改CSS属性,达到显示原图的效果
2、完整图片不在前端呈现,但是在前端剪裁,这时候可以通过seleniumwire对请求进行过滤,直接获得对应的原图
场景2 复现,通过seleniumwire对request请求进行过滤,获取原图
all_request = driver.requests
for req in all_request:
//captcha_photo是获取完整图片的url链接,且只有找个请求存在captcha_photo
    if "captcha_photo" in req.url:
        file = open('./bg.png', "wb")
        file.write(req.response.body)
        file.close()

4、获取偏移值

获取偏移值可以通过缺口图和原图进行比对,找到初始像素值不同的位置,即为偏移值,该过程存在一定误差

def get_gap():
    """
    获取缺口偏移量
    :param final_imagebg: 带缺口图片
    :param cq: 不带缺口图片
    :return:
    """

    bg = Image.open('./bg.png')
    cq = Image.open('./cq.png')
    # 原图和缺口图存在像素差
    final_imagebg=bg.resize((278,150))
    start = 60
    # 模块色差
    color_num = 60
    for x in range(start, final_imagebg.size[0]):
        for y in range(final_imagebg.size[1]):
            rgb1 = final_imagebg.load()[x, y]
            rgb2 = cq.load()[x, y]
            # abs 获取绝对值
            r = abs(rgb1[0] - rgb2[0])
            g = abs(rgb1[1] - rgb2[1])
            b = abs(rgb1[2] - rgb2[2])
            if not (r < color_num and g < color_num and b < color_num):
                print(x)
                return x - 7  # 误差值大概为7
get_gap()函数获取的是偏移值,但是滑块初始存在一定的偏差,这里需要自行进行调整。

5、滑动滑块

场景1:普通滑动验证码的识别验证
    实现思路:1、拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速
             2、模拟点击按住按钮,拖拽,释放
场景2:通过selenium模拟鼠标的【点击、按住、拖拽、释放】可以完成拖拽,但是验证时错误的(因为没有鼠标轨迹无法生成鼠标位置参数)
场景1复现
def get_tracks(distance):
    '''
    拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速
    匀变速运动基本公式:
    ①v=v0+at
    ②s=v0t+½at²
    ③v²-v0²=2as
    :param distance: 需要移动的距离
    :return: 存放每0.2秒移动的距离
    '''
    # 初速度
    v = 5
    # 单位时间为0.2s来统计轨迹,轨迹即0.2内的位移
    t = 0.2
    # 位移/轨迹列表,列表内的一个元素代表0.2s的位移
    tracks = []
    # 当前的位移
    current = 0
    # 到达mid值开始减速
    mid = distance * 4 / 5
    while current < distance:
        if current < mid:
            # 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细
            a = 8
        else:
            a = -3
        # 初速度
        v0 = v
        # 0.2秒时间内的位移
        s = v0 * t + 0.5 * a * (t ** 2)
        # 当前的位置
        current += s
        # 添加到轨迹列表
        tracks.append(round(s))
        # 速度已经达到v,该速度作为下次的初速度
        v = v0 + a * t
    return tracks

selenium 模拟拖拽

模拟人的行为习惯(先匀加速拖动后匀减速拖动),把需要拖动的总距离分成一段一段小的轨迹
tracks = get_tracks(distance)  # 剩下的50%在模拟移动
for x in tracks:
    ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
else:
    ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()  # 先移过一点
    ActionChains(driver).move_by_offset(xoffset=-1, yoffset=0).perform()  # 再退回来,看上去更像人为

            # 0.5s释放鼠标
time.sleep(3)
ActionChains(driver).release().perform()
场景2复现

PyAutoGUI 是一个简单易用,跨平台的可以模拟键盘鼠标进行自动操作的 python 库

# 安装pyautogui库
pip3 install pyautogui

需要在拖拽过程中存在鼠标拖拽的轨迹参数,因此采用了PyAutoGUI来实现,

# xiaohuakua是待滑动滑块的driver值
xiaohuakuai=driver.find_element_by_xpath('//*[@id="captcha"]/div/div[2]/div')
pyautogui.moveTo(xiaohuakuai.location['x']+1, xiaohuakuai.location['y']+80)
# duration是几秒内完成滑动  location['x']是水平轴滑动,
pyautogui.dragTo(xiaohuakuai.location['x']+int(distance)+7, xiaohuakuai.location['y']+84, duration=2)

此时滑动验证码识别通过,填充账号密码点击登录即可!文章来源地址https://www.toymoban.com/news/detail-520755.html

到了这里,关于Selenium滑动验证码破解(缺口对应却无法通过,需要做鼠标轨迹模拟)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用selenium,但chrome无法启动,需要安装浏览器对应版本(最新)的chromedriver

    使用selenium无法启动chrome,代码 报错如下: 安装地址 查询了浏览器版本:117.0.5927 但是国内的镜像网找不到,只更新到114版本 需要安装驱动,点击了最下面的网址 https://chromedriver.chromium.org/home 如图为有效信息 - 点击跳转: https://googlechromelabs.github.io/chrome-for-testing (点击这里

    2024年02月11日
    浏览(67)
  • Python如何用爬虫破解滑动验证码?这五步简单易用

    在使用python爬虫抓取数据的时候经常会遇到网站为了防止机器人登录而设置了验证,除了最基本的字符验证之外还有滑块验证、图片验证、顺序验证等等验证方式。那我们今天就来讲一下python如何用爬虫破解滑动验证码,一起来看看吧。 1.读取图片:在命令行控制台输入pip

    2024年02月14日
    浏览(57)
  • selenium+ocr 破解验证码

    最近想用python做一个爬虫,但目标网站需要输入信息以及验证码才能进行信息查询,然后才能爬取相应信息,于是就想到了使用selenium进行信息输入,先爬取验证码图片,然后利用OCR技术来识别验证码,接着爬取目标信息,思路很清晰,但做起来就出现一堆问题,于是想在这

    2024年02月04日
    浏览(52)
  • 15.网络爬虫—selenium验证码破解

    前言 : 🏘️🏘️个人简介:以山河作礼。 🎖️🎖️:Python领域新星创作者,CSDN实力新星认证 📝​📝第一篇文章《1.认识网络爬虫》获得 全站热榜第一,python领域热榜第一 。 🧾 🧾第四篇文章《4.网络爬虫—Post请求(实战演示)》 全站热榜第八 。 🧾 🧾第八篇文章《8.网

    2023年04月16日
    浏览(92)
  • selenium利用图鉴破滑动验证码,登录信息门户

    验证码类型: 总结: 1.学习到了selenium中的动作链模块。 首先 from selenium.webdriver.common.action_chains import ActionChains导入包 使用方法: 首先启动动作链:action = webdriver.ActionChains(browser) action.click_and_hold(定位滑块的位置).perform() # 按住滑块 action.move_by_offset(x坐标,y坐标)  # 移动滑块

    2024年01月23日
    浏览(47)
  • selenium破解滑块验证码自动查询+获取后续表单数据

    一、装载好chromedriver之后,运行命令行 \\\"chrome.exe\\\"(路径) --remote-debugging-port=9222 打开谷歌浏览器。 二、使用selenium打开网页:  三、获取输入框批量输入数据,并破解验证码: 使用 driver.find_element_by_xpath 获取element时,xpath可通过浏览器打开网站,使用检查功能,找到element所

    2024年02月12日
    浏览(56)
  • python selenium模块联合带带弟弟破解滑块验证码

    Python 使用 Selenium 模块模拟用户操作,滑动滑块来破解验证码

    2024年04月14日
    浏览(106)
  • python selenium模块联合带带弟弟破解滑块验证码,网络安全面试题内存优化

    #向锁定的element元素输入111值 element.click() #点击该元素 如果遇到同一CLASSBNAME有两个元素 可以使用 element = driver.find_elements(By.CLASSNAME)[1] 这样的方式锁定第二个元素位置    注意:element后面有个s ​ def login(driver,uname,pwd): “”\\\" 某系统登录框输入手机号和密码,并点击成功 “”

    2024年04月12日
    浏览(67)
  • OpenCV滑块验证码图像缺口位置识别

    在使用Selenium完成自动化爬虫时,许多网站为了防止机器人爬取数据会使用验证码(例如滑块验证码)。通过Selenium动作操作,爬虫可以模拟用户输入验证码或使用鼠标移动一定距离来处理验证码验证过程 完成这一流程的关键步骤有两步:识别出目标图像缺口的位置,操作滑

    2024年02月03日
    浏览(44)
  • selenium解决web页面智能验证控件点击无效或验证不通过问题

    背景:笔者在公司做webUI自动化的时候,在登录页面碰到了一个难题:在输入完账号密码后,需要点击一下智能验证控件。本以为是个很简单的问题,不就是定位控件后click一下就好了嘛,结果实际操作的时候,发现手动打开浏览器,可以正常点击智能控件,并验证成功,但是

    2024年02月09日
    浏览(93)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包