在自动化操作中,为了绕过验证码反机器人检测机制,需要模拟真实的人类鼠标行为。GitHub开源项目 HumanCursor 提供了这样的能力。它通过“自然运动算法”生成人类般的鼠标轨迹(速度、加速度、曲线都会随机变化)。HumanCursor 支持执行多种鼠标动作(点击拖拽滚动悬停 等),并且专为绕过安全检测和反机器人软件而设计。下面将介绍如何在 Windows 平台配置并使用 Python 调用 HumanCursor,与 OpenCV 图像处理和用户已有的 AI 模型相结合,实现模拟人类的鼠标点击、拖动(例如滑动验证码)等操作。

工具简介和方案概述

  • HumanCursor: 一个跨平台的 Python 库,用于模拟人类鼠标移动和点击。它可以在网页环境或本地系统环境下运行,分别提供了 WebCursor(与 Selenium 浏览器驱动配合)和 SystemCursor(通过操作操作系统光标)两个模块。其中 SystemCursor 使用 PyAutoGUI 控制系统鼠标。HumanCursor 的优势在于其生成的鼠标轨迹更加真实,自带随机速度曲线,能避免被检测出脚本行为。

  • OpenCV: 一个强大的计算机视觉库,这里主要用作图像处理工具。例如,我们可以用 OpenCV(或其依赖的 PyAutoGUI 截图功能)获取屏幕截图,并帮助定位验证码滑块的位置或其他目标坐标。

  • AI模型: 用户已有的 AI 模型可用于识别目标位置,例如识别滑动验证码中滑块应该拖动到的位置。我们将把 AI 模型输出的坐标作为 HumanCursor 的输入,使鼠标按照模型提示的位置进行操作。

总体思路: 利用 OpenCV/截图获取验证码图像,将图像输入AI模型得到需要点击/拖拽的坐标,再调用 HumanCursor 在这些坐标之间生成人类般的鼠标轨迹完成操作。这样既能自动完成任务,又能因模拟真人行为而降低被检测的风险。

Windows环境下的安装与配置

  1. 安装 Python 及依赖: 确保系统安装了 Python 3.7 及以上版本(安装时请勾选“Add Python to PATH”以便命令行使用 Python)。然后通过 pip 来安装所需的库:

    • 安装 HumanCursor: 在命令行执行 pip install humancursor 即可安装最新版本(该库已在 PyPI 上发布)。

    • 安装 OpenCV: 执行 pip install opencv-python 安装 OpenCV 的 Python 接口(cv2模块)。

    • (可选)安装 PyAutoGUI: HumanCursor 已经包含对 PyAutoGUI 的使用,如需直接调用截图或额外操作,可通过 pip install pyautogui 安装。PyAutoGUI 支持跨平台的鼠标键盘自动化,并提供截图功能。

  2. HumanCursor 模块导入: 安装完成后,在 Python 脚本中引入 HumanCursor 提供的类。例如:

    from humancursor import SystemCursor, WebCursor
    
    • SystemCursor: 用于控制系统的真实鼠标。指出 SystemCursor 类内部通过 PyAutoGUI 实现,对应物理鼠标移动。它接受屏幕坐标(x, y)作为目标输入。

    • WebCursor: 用于浏览器自动化场景,通过 Selenium WebDriver 控制浏览器内的光标。如果在浏览器中操作(如Chrome/Edge),需要先配置好 Selenium 对应浏览器的驱动,然后将 driver 实例传入 WebCursor(driver) 来使用。

  3. 环境准备: 如果使用 WebCursor,请确保浏览器驱动(ChromeDriver/EdgeDriver等)已正确安装,并与浏览器版本匹配。如果使用 SystemCursor,请确保运行脚本时目标窗口(例如浏览器窗口)处于前台,以便系统鼠标可以正确地进行操作。

HumanCursor 模拟鼠标操作示例

HumanCursor 提供了简洁的接口来执行各种鼠标动作。下面以 SystemCursor 为例,展示如何用 Python 代码模拟人类的点击和拖拽操作。

模拟点击操作

使用 HumanCursor,点击 操作通过 cursor.click_on() 方法实现。可以传入屏幕坐标(例如 [x, y] 列表)或网页元素(WebCursor场景)作为参数。对于系统鼠标,我们使用坐标输入:

from humancursor import SystemCursor

cursor = SystemCursor()  
target_pos = [500, 300]  # 目标点击位置坐标 (示例)
cursor.move_to(target_pos)       # 将鼠标移动到指定坐标
cursor.click_on(target_pos)      # 在该坐标执行一次点击

上述代码中,我们先调用move_to将鼠标移至目标坐标,再调用click_on完成点击。实际上直接调用click_on([x,y])也会隐式移动并点击。click_on还支持可选参数如click_duration(按住点击的时长)等,以模拟长按等行为。

模拟拖拽(滑动验证码案例)

拖拽操作(例如滑动验证码的滑块)可以使用 HumanCursor 的 cursor.drag_and_drop() 方法一次性完成。该函数会模拟人在起点按下鼠标、拖动到终点、再松开的全过程。对于 SystemCursor,只需提供起始和结束的坐标列表即可。例如,模拟将滑块从起点拖到终点:

from humancursor import SystemCursor

cursor = SystemCursor()
start_pos = [300, 400]   # 滑块起始位置坐标 (示例)
end_pos   = [800, 400]   # 滑块目标位置坐标 (示例)
cursor.drag_and_drop(start_pos, end_pos)

调用 drag_and_drop(start_pos, end_pos) 后,HumanCursor 会在内部按住起点坐标处的鼠标按钮,按照人类自然的轨迹移动到目标坐标,然后释放按钮完成拖拽。这种轨迹会模拟真实用户的鼠标路径,包括非直线运动和变速移动,使之看起来非常自然。

提示: HumanCursor 会自动生成平滑的拖拽曲线,无需手动插入随机停顿。但为了更逼真,可以在必要时在操作前后使用 time.sleep() 等方法稍微停顿,模拟人的反应时间。此外,如果拖拽操作涉及浏览器内元素,确保浏览器已滚动到可见该元素,或者使用 cursor.scroll_into_view_of_element() 方法(WebCursor场景)来保证元素在视野内。

OpenCV 辅助图像识别获取坐标

在模拟鼠标操作前,我们需要确定要点击或拖动的目标坐标。这通常由 AI 模型或图像处理得到。OpenCV 可以帮助我们完成截图和图像识别的步骤:

  • 屏幕截图: 可以使用 PyAutoGUI 或 OpenCV 来获取当前屏幕或窗口的截图。PyAutoGUI 自带 screenshot() 方法,可直接获得屏幕图像。例如:

    import pyautogui
    screenshot = pyautogui.screenshot()  # 获取全屏截图 (PIL图像对象)
    

    将 PIL 图像对象转换为 OpenCV 格式(numpy数组)后,就可以进行后续处理:

    import cv2
    import numpy as np
    
    img = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
    
  • 定位目标: 有了截图 img 后,可以借助 AI 模型或 OpenCV算法找到目标的位置。例如,对于滑动验证码

    • 如果有训练好的 AI模型 来识别滑块和缺口位置,我们将图像传入模型,输出滑块需要移动的 起点终点 坐标。

    • 如果没有复杂模型,也可以采用 OpenCV 的模板匹配或特征匹配:先准备滑块和目标缺口的图像模板,用 cv2.matchTemplate 在截图中搜索其位置。从而得到需要拖动的起止坐标。

  • 示例: 假设 AI 模型封装为函数 model_predict(image),返回需要拖动的起点和终点坐标:

    def model_predict(image):
        # ... AI模型的推理过程,返回(start_x, start_y, end_x, end_y)
        return (sx, sy, ex, ey)
    
    # 获取屏幕截图并转换为OpenCV图像
    screenshot = pyautogui.screenshot(region=(100, 200, 600, 400))  # 可选:截取特定区域
    img = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
    
    # 将图像传入AI模型,获取滑块起点和终点坐标
    sx, sy, ex, ey = model_predict(img)
    print("模型识别结果: 起点=", (sx, sy), "终点=", (ex, ey))
    

    在上述代码中,我们截取了一块区域 (region=(left, top, width, height)) 以提高识别效率(假定验证码区域已知,大致在(100,200)位置,大小600x400)。然后调用模型得到滑块需要从 (sx, sy) 拖到 (ex, ey)

注意: 从截图得到的坐标通常是屏幕绝对坐标(基于截图左上角为原点)。如果截图只是局部区域,需将模型输出的局部坐标转换为全屏坐标。例如,上述 region=(100,200,600,400) 截图,如果模型返回的起点是 (50, 100)(相对于该截图区域),则实际屏幕坐标应为 (100+50, 200+100) = (150, 300)

将AI识别结果应用于HumanCursor模拟

当获得目标坐标后,就可以使用 HumanCursor 执行实际的鼠标操作。以下是一个将前面步骤串联起来的代码框架示例:

import cv2
import pyautogui
from humancursor import SystemCursor

# 1. 截图获取验证码区域图像
screenshot = pyautogui.screenshot()  # 获取全屏截图 (或者指定region截取特定区域)
img = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)

# 2. 利用AI模型/算法识别需要点击或拖动的坐标
sx, sy, ex, ey = model_predict(img)  # 模型推理出滑块起点(sx,sy)和终点(ex,ey)
print("AI模型识别的坐标: start=({}, {}), end=({}, {})".format(sx, sy, ex, ey))

# 3. 调用HumanCursor模拟人类鼠标拖拽操作
cursor = SystemCursor()
cursor.drag_and_drop([sx, sy], [ex, ey])  # 将鼠标从起点拖动到终点 (人类轨迹)

在这段代码中:

  • 第一步,我们获取当前屏幕截图并转换为OpenCV图像格式,可用于后续的识别。这里假设验证码在全屏幕范围内;实际使用中可以通过浏览器窗口坐标或元素位置,截取特定区域提高效率。

  • 第二步,我们调用用户提供的AI模型(model_predict为伪函数)来获取需要拖拽的起点和终点坐标。这个模型可能使用了深度学习来识别滑块缺口,或者任何能够确定滑块目标位置的算法。

  • 第三步,我们创建一个 HumanCursor 的 SystemCursor 实例,并调用 drag_and_drop 执行拖拽。HumanCursor 会根据提供的两个坐标自动生成平滑的轨迹并完成拖动操作。

通过这样的方式,我们实现了从图像识别到模拟真人拖动的一整套流程。当滑块拖动到正确位置后,一般验证码会自动校验通过。如果还有“点击验证”步骤(例如点击某个按钮或选中图像中的物体),也可以用 cursor.click_on([x,y]) 类似地模拟点击完成。

HumanCursor 的Windows兼容性及替代方案

兼容性: HumanCursor 是纯 Python 实现的库,并标明支持 跨平台(操作系统无关)。因此,它能够在 Windows 上正常运行。其依赖的 PyAutoGUI 库本身也支持 Windows、macOS 和 Linux 等主流平台。在Windows上使用时,只要按照上述步骤正确安装配置,就可以直接调用 HumanCursor 的功能,无需特殊调整。

可能的替代方案: 如果在 Windows 平台上发现 HumanCursor 存在某些限制或不兼容(例如极少数情况下模拟不准,或者项目不再维护等),可以考虑以下替代方法:

  • 使用 PyAutoGUI 自定义轨迹: 直接使用 PyAutoGUI 的 moveTo()/dragTo() 等函数配合自己的轨迹算法。比如借助随机数或贝塞尔曲线生成一系列中间点,逐步移动鼠标,从而模拟曲线路径。虽然 PyAutoGUI 默认直线移动鼠标,但我们可以插入小的抖动和延时让轨迹更逼真。不过实现细节需要自己把控,相对繁琐。

  • 其他人类鼠标模拟库: 开源社区还有其他类似的 Python 库,例如 pyHM(Python Human Movement) 和 human-mouse 等。这些库同样能够生成拟人的鼠标移动轨迹。例如,pyHM 提供了 mouse.move(x, y) 方法,可以让鼠标像人一样移动到目标位置,并可调整移动速度;human-mouse 库使用样条插值和人类运动模式来产生逼真的鼠标轨迹。这些库在 Windows 上也支持运行,可作为 HumanCursor 的备选方案。

  • Ghost Cursor 思想: 在浏览器自动化领域,JavaScript 版的 “Ghost Cursor” 利用贝塞尔曲线和 Fitts定律产生仿真的鼠标轨迹,已成功应用于 Puppeteer 等工具。如果不使用 HumanCursor,也可以参考 Ghost Cursor 的原理,在 Python 中实现类似的运动曲线算法,或者寻找已有的 Python 实现(如社区提供的 WindMouse 算法等)。

总的来说,HumanCursor 在 Windows 上结合 OpenCV 和 AI 模型可以方便地实现人类化的鼠标操作,从定位目标模拟拖拽一气呵成。通过上述配置与代码示例,开发者可以构建一个自动化脚本,能够绕过滑动验证码等检测,在保证成功率的同时最大程度地伪装成人为操作。这为破解验证码和反检测任务提供了有效的解决方案。

参考资料:

  • HumanCursor 项目简介及文档

https://github.com/riflosnake/HumanCursor

  • PyAutoGUI 截图和图像识别文档

https://pyautogui.readthedocs.io/en/latest/screenshot.html

  • 相关人类鼠标轨迹算法和替代库

https://pypi.org/project/human-mouse/0.1.0/

https://blog.csdn.net/gitblog_00023/article/details/138993339