selenium解决web页面缺口验证码滑动问题

 

话不多说,直接上图上代码:

import base64
import os
from time import sleep
import requests
from selenium.webdriver import Chrome
from selenium.webdriver.common.action_chains import ActionChains
 
try:
    import cv2
except:
    os.system("pip install opencv-python")
    import cv2
 
 
"""
破解思路为:
1、先获取到背景图片和缺口图片,我这里是一张网络图片和一张base64的图片,请自行根据图片来源选择保存方式;
2、得到图片后,用cv2库,进行图片比对,自动找出最合适的位置,无需手动调整;
3、得到比对后的坐标后,拿到x轴的坐标,就是需要滑动的距离;
4、开始执行鼠标操作,按住元素,移动距离。完事。
5、如果验证码还有加速度验证等机制,给我留言或者自行找资料。
"""
 
 
b = Chrome()
 
# -------------------------------------------------------
# 打开的网址
# 网址隐藏下,防止你们干坏事。
url = "https://***********/register"
 
# 验证码背景图名称
code_background = "code_background.jpg"
# 验证码缺口图名称
code_gap = "code_gap.jpg"
 
 
# -------------------------------------------------------
b.implicitly_wait(20)
b.get(url)
 
 
def identify_gap(bg, tp):
    """ bg: 背景图片 tp: 缺口图片 out:输出图片 """
    # 读取背景图片和缺口图片
    bg_img = cv2.imread(bg)  # 背景图片
    tp_img = cv2.imread(tp)  # 缺口图片
    # 识别图片边缘
    bg_edge = cv2.Canny(bg_img, 100, 200)
    tp_edge = cv2.Canny(tp_img, 100, 200)
    # 转换图片格式
    bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
    tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
    # 缺口匹配
    res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
    # 寻找最优匹配
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    # 左上角点的坐标
    tl = max_loc
 
    return tl[0]
 
 
while 1:
    # 尝试删除历史图片
    try:
        os.remove(code_background)
        os.remove(code_gap)
    except:
        pass
    # 需要重新生成动作,否则会导致操作累计执行
    Action = ActionChains(b)
    while 1:
        try:
            sleep(0.2)
            # 下拉一下,方便滑动
            target = b.find_element_by_xpath('// a[text() = "《用户服务协议》"]')
            b.execute_script("arguments[0].scrollIntoView();", target)
            # 获取背景图url
            code_url = b.find_element_by_xpath('//div[@class="drag-section"]//img').get_attribute("src")
            # print(code_url)
            # 如果验证码没加载,则会获取到空的值,则跳过,再来一遍
            if len(code_url) > 5:
                # 保存图片
                img = requests.get(code_url)
                f = open(code_background, 'ab')
                f.write(img.content)
                f.close()
                # 保存缺口图片
                code2_base64 = b.find_element_by_xpath('//div[@class="drag-section"]/div/img[2]').get_attribute("src")
 
                with open(code_gap, 'wb') as f:
                    # 图片数据前部是“data:image/png;base64,iVBORSGJKGJDK”,需要去掉前面非图片数据部分
                    f.write(base64.b64decode(code2_base64[22:]))
                break
        except:
            pass
    # 开始计算缺口位置
    a = identify_gap(code_background, code_gap)
    print("缺口位置:", a)
    ele = b.find_element_by_xpath('//div[@class="drag-bar"]/div[2]')
    print("开始拖拽")
    Action.move_to_element(ele)
    # 拖拽位置+1是为了防止当识别出来的位置为0时,则不执行拖拽,则会卡在这里。亲测必须加上。
    Action.drag_and_drop_by_offset(ele, a+1, 0).perform()
    sleep(0.2)
    # 获取滑块在滑动后的位置,看下滑块有没有回去,没回去,则破解成功
    left = b.find_element_by_xpath('//div[@id="drag-btn"]').get_attribute('style')
    # print("---", left)
    # 判断下时候验证成功,你们断言可能不同,都是聪明人,自己修改下。
    if "not-allowed" in left:
        print("验证成功")
        break
    else:
        pass
 
 
 

### C# 中实现滑动验证码解决方案 在C#环境中处理滑动验证码主要依赖于自动化测试工具如Selenium以及机器学习模型来识别并模拟人类行为完成验证过程。对于基于浏览器操作的任务,Selenium是一个强大的库,它允许编写脚本来控制Web浏览器执行一系列动作。 为了应对滑动验证码挑战,在C#中通常会结合图像处理技术和深度学习算法来进行破解尝试。具体来说: - 使用`OpenCV`或其他图像处理技术定位页面上的滑块位置和目标图案。 - 利用预训练好的卷积神经网络(CNN),比如YOLOv5,对截屏后的图片进行分析,提取出背景图与缺口的位置信息[^4]。 - 计算两者之间的距离差值作为移动轨迹参数传递给Selenium WebDriver实例去驱动鼠标拖拽动作。 下面给出一段简化版的概念证明代码片段展示如何利用这些组件构建一个基本框架: ```csharp using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using System.Drawing; // 初始化ChromeDriver var options = new ChromeOptions(); options.AddArgument("--headless"); // 无头模式运行 IWebDriver driver = new ChromeDriver(options); try { string url = "http://example.com/login"; // 替换成实际含有滑动验证码的网页链接 driver.Navigate().GoToUrl(url); // 定位到滑块元素 IWebElement sliderElement = driver.FindElement(By.ClassName("geetest_slider_button")); Point startPoint = sliderElement.Location; Bitmap screenshot = ((ITakesScreenshot)driver).GetScreenshot().AsBitmap(); // 假设这里已经有了获取偏移量offsetX的方法 int offsetX = CalculateOffset(screenshot); Actions action = new Actions(driver); action.MoveToElement(sliderElement, startX: startPoint.X, startY: startPoint.Y) .ClickAndHold() .MoveByOffset(offsetX, 0) .Release() .Build() .Perform(); } finally{ driver.Quit(); } /// <summary> /// 这里应该放置具体的计算逻辑,返回相对于起点横向需要平移多少像素才能使滑块到达正确终点 /// </summary> private static int CalculateOffset(Bitmap image){ throw new NotImplementedException("此函数应由开发者自行实现"); } ``` 这段代码展示了怎样启动一个无界面版本的Google Chrome浏览器加载指定URL地址,并找到页面内的滑块控件准备实施后续交互操作。注意这里的`CalculateOffset()`方法只是一个占位符,实际应用时应当替换为能够准确测量两幅图形间差异的具体实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值