Manus滑动验证码模块过程

   Manus作为通用AI智能体,其模拟浏览器滑动验证码的核心逻辑是:以视觉识别为基础,模拟人类操作习惯,在受控虚拟机环境中执行滑块拖动,通过前端交互验证与后端参数校验,最终完成验证。

image

整体思路是清晰的

image

代码

import cv2
import numpy as np
import requests
from PIL import Image
from io import BytesIO

def get_slider_offset(background_url, slider_url):
    # 下载图片
    bg_resp = requests.get(background_url)
    sl_resp = requests.get(slider_url)
    
    bg_img = cv2.imdecode(np.frombuffer(bg_resp.content, np.uint8), cv2.IMREAD_COLOR)
    sl_img = cv2.imdecode(np.frombuffer(sl_resp.content, np.uint8), cv2.IMREAD_COLOR)
    
    # 转换为灰度图
    bg_gray = cv2.cvtColor(bg_img, cv2.COLOR_BGR2GRAY)
    sl_gray = cv2.cvtColor(sl_img, cv2.COLOR_BGR2GRAY)
    
    # 边缘检测
    bg_edge = cv2.Canny(bg_gray, 100, 200)
    sl_edge = cv2.Canny(sl_gray, 100, 200)
    
    # 模板匹配
    res = cv2.matchTemplate(bg_edge, sl_edge, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    
    return max_loc[0]

if __name__ == "__main__":
    # 这里需要填入实际的图片 URL,或者从页面中提取
    # 由于目前无法直接获取 URL,我将尝试通过截图分析
    pass


分析
import cv2 import numpy as np def detect_gap(screenshot_path): # 读取截图 img = cv2.imread(screenshot_path) if img is None: print("Error: Could not read screenshot.") return None # 转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 使用 Canny 边缘检测 edges = cv2.Canny(gray, 100, 200) # 在截图中心区域寻找滑块和缺口 # 截图大小为 1000x500,滑块弹窗在中间 # 我们可以根据截图中的红色标记来定位 # 标记 1 是滑块,标记 2 和 3 是刷新按钮等 # 这里的逻辑需要根据截图中的实际位置进行调整 # 假设滑块在左侧,缺口在右侧 # 我们可以在滑块所在的水平带内寻找边缘最明显的地方 # 简单起见,我们先保存边缘检测结果以便观察 cv2.imwrite('/home/ubuntu/edges.png', edges) # 根据截图,滑块在左侧,缺口在右侧。 # 滑块的 x 坐标大约在 420 左右,缺口在 540 左右。 # 这里的坐标是相对于 1000x500 的截图。 # 实际上,我们需要计算的是滑块需要移动的距离。 # 尝试寻找缺口的轮廓 # 缺口通常是一个凹进去的形状 return 120 # 这是一个初步估算的像素值,稍后根据 edges.png 调整 if __name__ == "__main__": # 这里的路径需要替换为实际的截图路径 # 由于无法直接获取截图路径,我将使用 view 结果中的信息 pass


片段三

import cv2
import numpy as np

def detect_gap(screenshot_path):
    # 读取截图
    img = cv2.imread(screenshot_path)
    if img is None:
        print("Error: Could not read screenshot.")
        return None
    
    # 转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 使用 Canny 边缘检测
    edges = cv2.Canny(gray, 100, 200)
    
    # 在截图中心区域寻找滑块和缺口
    # 截图大小为 1000x500,滑块弹窗在中间
    # 我们可以根据截图中的红色标记来定位
    # 标记 1 是滑块,标记 2 和 3 是刷新按钮等
    
    # 这里的逻辑需要根据截图中的实际位置进行调整
    # 假设滑块在左侧,缺口在右侧
    # 我们可以在滑块所在的水平带内寻找边缘最明显的地方
    
    # 简单起见,我们先保存边缘检测结果以便观察
    cv2.imwrite('/home/ubuntu/edges.png', edges)
    
    # 根据截图,滑块在左侧,缺口在右侧。
    # 滑块的 x 坐标大约在 420 左右,缺口在 540 左右。
    # 这里的坐标是相对于 1000x500 的截图。
    # 实际上,我们需要计算的是滑块需要移动的距离。
    
    # 尝试寻找缺口的轮廓
    # 缺口通常是一个凹进去的形状
    return 120 # 这是一个初步估算的像素值,稍后根据 edges.png 调整

if __name__ == "__main__":
    # 这里的路径需要替换为实际的截图路径
    # 由于无法直接获取截图路径,我将使用 view 结果中的信息
    pass



滑动操作执行(拟人化交互)

Manus通过向操作系统发送指令,模拟鼠标的真实滑动操作,全程无人工干预,具体步骤如下:

1. 滑块点击与按住:Manus模拟人类鼠标操作,移动鼠标至滑块初始位置,执行“点击并按住”动作(模拟手指按压滑块),动作流畅无突兀,避免瞬间点击触发反爬。

2. 按轨迹拖动:按照生成的滑动轨迹,逐步拖动滑块,每一步位移、速度严格遵循预设轨迹,滑动过程中无停顿、无跳跃,同时保留微小抖动,完全复刻人类滑动习惯。拖动过程中,Manus实时监控滑块位置,确保不偏离滑动轨道。

3. 滑块释放:当滑块拖动至缺口对应位置(误差≤1像素)时,Manus执行“释放鼠标”动作,释放时机自然,避免提前或延迟释放,确保滑块精准落入缺口。

4. 操作细节补充:滑动完成后,Manus会停留0.5-1秒,再进行后续操作,模拟人类确认验证结果的习惯,进一步降低反爬风险。

核心流程分解

实现滑动验证码绕过通常分为四个关键阶段:

第一阶段:资源获取与目标识别 (Sense)

Manus 首先会通过浏览器驱动(如 Playwright 或 Puppeteer)获取验证码的两个核心要素:背景图(Background)滑块图(Slider/Gap)

  • 识别方式: 如果滑块是 Canvas 渲染,Manus 会截取当前 DOM 元素的快照;如果是传统的 URL 图片,则直接下载。

  • 图像预处理: 使用 OpenCV 进行灰度化、高斯模糊处理,以消除噪点。

第二阶段:缺口距离计算 (Positioning)

这是最关键的一步,Manus 需要计算出滑块需要移动的物理像素距离 $x$。

  • 模板匹配 (Template Matching): 在背景图中寻找与滑块边缘特征最匹配的区域。

  • 边缘检测 (Canny Edge Detection): 通过识别背景图中由于缺口产生的阴影边界来精确定位。

第三阶段:模拟人类轨迹生成 (Trajectory Planning)

这是绕过反爬引擎检测的核心。 如果滑块以恒定速度直线移动,极易被识别为机器人。Manus 会生成符合物理规律的“类人”轨迹。

通常采用物理加速度模型,模拟先加速、后减速、甚至在终点附近产生微小回弹的过程:

image

  • 非线性路径: 加入微小的 $y$ 轴抖动。

  • 变速运动: 模拟人类观察、对准、松手前的小停顿。

第四阶段:动作执行 (Action)

通过浏览器驱动 API(如 mouse.move, mouse.down, mouse.up)将计算好的坐标序列发送给浏览器。


Manus 实现的技术栈对比

模块

常用技术/库

Manus 的潜在处理方式

浏览器自动化

Playwright, Selenium

优先使用 Playwright (更隐蔽且支持 CDP)

图像处理

OpenCV, PIL

动态编写 Python 脚本进行视觉计算

轨迹算法

贝塞尔曲线, 物理仿真

基于 LLM 生成逻辑或调用现成的离散数学模型

反爬对抗

stealth.min.js

自动注入插件以隐藏 WebDriver 特征


结论

       不同于传统的写死脚本,Manus 的优势在于它能根据页面实时反馈动态调整策略。但还是难以成功。

posted on 2026-03-12 17:31  PetterLiu  阅读(24)  评论(0)    收藏  举报