使用 Selenium 自动化绕过 Canvas 拼图验证码的实用指南

风浩君_3221

风浩君_3221

2026-10-03

942人浏览

原创

使用 Selenium 自动化绕过 Canvas 拼图验证码的实用指南

本文详解如何通过图像处理与行为模拟技术,结合 selenium 实现对 proton mail 注册页 canvas 拖拽式验证码的自动化识别与破解,涵盖坐标提取、拖拽模拟、容错重试及无障碍入口利用等关键策略。

本文详解如何通过图像处理与行为模拟技术,结合 selenium 实现对 proton mail 注册页 canvas 拖拽式验证码的自动化识别与破解,涵盖坐标提取、拖拽模拟、容错重试及无障碍入口利用等关键策略。

在自动化注册 Proton Mail 账户时,用户常会遭遇基于 <canvas></canvas> 的拼图式验证码(如“将滑块拖入凹槽”)。这类验证码不依赖传统文本识别(OCR),而是通过前端 Canvas 渲染动态图像,并要求精确的鼠标轨迹与事件触发逻辑。直接调用 ActionChains.drag_and_drop() 通常失败——因为目标元素并非独立 DOM 节点,而只是 Canvas 上的像素区域;且 Proton 的验证机制会对拖拽终点位置进行亚像素级校验,简单粗暴的坐标偏移往往无法通过。

✅ 推荐实践路径(非暴力 AI,更稳健)

1. 优先尝试无障碍通道(最简方案)

Proton Mail 在部分版本中为视障用户提供了替代验证入口(<div class="visuallyImpaired">),点击后可跳过 Canvas 验证,直接进入邮箱验证流程。这是合法、低风险、零图像处理开销的首选方式:<pre class="brush:php;toolbar:false;"># 在完成邮箱/密码填写并点击“创建账户”后插入: try: # 切换回主文档上下文(避免 iframe 嵌套干扰) driver.switch_to.default_content() # 定位并点击“视觉障碍用户”链接(XPath 更稳定) visually_impaired_link = wait.until( EC.element_to_be_clickable((By.XPATH, &quot;//div[contains(@class,'visuallyImpaired')]//a&quot;)) ) visually_impaired_link.click() print(&quot;✅ 已切换至无障碍验证流程&quot;) time.sleep(2) except Exception as e: print(&quot;⚠️ 无障碍入口未找到,回退至 Canvas 自动化方案&quot;)</pre> <blockquote><p>⚠️ 注意:该链接可能随前端更新变动,建议配合 <code>WebDriverWait + EC.element_to_be_clickable 使用,并设置合理超时(如 8 秒)。

2. Canvas 图像定位优化(若必须走拖拽)

原代码中 get_coordinates() 使用 Canny 边缘检测+面积过滤,易受噪声干扰。建议升级为 HSV 颜色空间分割 + 形态学闭运算,提升鲁棒性:

def get_puzzle_coords(image_path):
    img = cv2.imread(image_path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 定义拼图块(浅色)与背景凹槽(深色)的 HSV 范围(需根据实际截图校准)
    lower_piece = np.array([0, 0, 200])   # 高亮度区域(白色拼图)
    upper_piece = np.array([180, 30, 255])
    mask_piece = cv2.inRange(hsv, lower_piece, upper_piece)

    lower_hole = np.array([0, 0, 50])     # 中低亮度(灰色凹槽)
    upper_hole = np.array([180, 50, 150])
    mask_hole = cv2.inRange(hsv, lower_hole, upper_hole)

    # 形态学增强
    kernel = np.ones((3,3), np.uint8)
    mask_piece = cv2.morphologyEx(mask_piece, cv2.MORPH_CLOSE, kernel)
    mask_hole = cv2.morphologyEx(mask_hole, cv2.MORPH_CLOSE, kernel)

    # 提取轮廓中心
    contours_p, _ = cv2.findContours(mask_piece, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    contours_h, _ = cv2.findContours(mask_hole, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    piece_center = None
    hole_center = None

    if contours_p:
        M = cv2.moments(max(contours_p, key=cv2.contourArea))
        if M["m00"] != 0:
            piece_center = (int(M["m10"]/M["m00"]), int(M["m01"]/M["m00"]))

    if contours_h:
        M = cv2.moments(max(contours_h, key=cv2.contourArea))
        if M["m00"] != 0:
            hole_center = (int(M["m10"]/M["m00"]), int(M["m01"]/M["m00"]))

    return piece_center, hole_center

3. 真实感拖拽模拟(绕过反自动化检测)

Proton 对 dragstart/drop 等事件有严格校验。应避免纯 JS 事件注入,改用 ActionChains 模拟人类操作节奏:

Markdown Canvas
Markdown Canvas

将Markdown文件转换为美观的HTML页面,适用于Canvas或浏览器查看。用于用户请求渲染、可视化、显示或分享Markdown文件时。

下载
def human_drag(driver, canvas_element, start_pos, end_pos):
    actions = ActionChains(driver)

    # 1. 移动到 Canvas 中心附近预热
    canvas_loc = canvas_element.location_once_scrolled_into_view
    canvas_size = canvas_element.size
    center_x = canvas_loc['x'] + canvas_size['width'] // 2
    center_y = canvas_loc['y'] + canvas_size['height'] // 2
    actions.move_by_offset(center_x, center_y).perform()

    # 2. 精确移动到拼图起始点(添加随机微偏移)
    offset_x = start_pos[0] + random.randint(-3, 3)
    offset_y = start_pos[1] + random.randint(-3, 3)
    actions.move_by_offset(offset_x - center_x, offset_y - center_y).perform()

    # 3. 按下 + 缓慢拖拽 + 释放(模拟加速度)
    actions.click_and_hold().perform()
    time.sleep(0.3)

    # 分段移动(更自然)
    dx, dy = end_pos[0] - start_pos[0], end_pos[1] - start_pos[1]
    for i in range(1, 4):
        frac = i / 3
        actions.move_by_offset(int(dx * frac) - int(dx * (frac-1/3)), 
                              int(dy * frac) - int(dy * (frac-1/3))).perform()
        time.sleep(random.uniform(0.1, 0.25))

    actions.release().perform()
    print(f"? 拖拽完成:{start_pos} → {end_pos}")

4. 容错与重试机制(关键!)

验证码验证失败时,页面通常显示错误提示但不刷新。应捕获该状态并自动重试:

def solve_captcha(driver, wait):
    max_retries = 5
    for attempt in range(max_retries):
        try:
            # 截图 → 定位 → 拖拽
            captcha_canvas = wait.until(
                EC.presence_of_element_located((By.XPATH, '//*[@id="root"]/div/div/div/div/div/div[1]/canvas'))
            )
            captcha_canvas.screenshot("captcha.png")
            piece, hole = get_puzzle_coords("captcha.png")

            if not piece or not hole:
                raise ValueError("未检测到拼图或凹槽")

            human_drag(driver, captcha_canvas, piece, hole)

            # 检查是否通过(监听按钮状态变化或成功提示)
            success_btn = wait.until(
                EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'继续')]"))
            )
            print(f"✅ 验证码通过(第 {attempt+1} 次尝试)")
            return True

        except Exception as e:
            print(f"❌ 第 {attempt+1} 次尝试失败:{e}")
            if attempt <h3>? 总结与合规提醒</h3>
  • 首选无障碍入口:合法、高效、规避所有图像/行为分析复杂度;
  • 避免“暴力 AI”训练:针对单个站点定制图像处理比训练通用模型更务实;
  • 模拟人类行为:随机延迟、微偏移、分段拖拽显著提升通过率;
  • 法律与道德边界:自动化注册需遵守 Proton 的 Terms of Service,批量注册可能触发风控。生产环境建议搭配真实邮箱验证链路,而非完全无人值守。

通过以上组合策略,你无需从零构建深度学习模型,即可稳定、可持续地完成 Proton Mail 的自动化注册流程。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

canva

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1651

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4024

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1629

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

23237

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2847

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2887

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1143

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2243

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Canva使用教程
Canva使用教程

共0课时 | 0人学习