Manus滑动验证码模块过程
Manus作为通用AI智能体,其模拟浏览器滑动验证码的核心逻辑是:以视觉识别为基础,模拟人类操作习惯,在受控虚拟机环境中执行滑块拖动,通过前端交互验证与后端参数校验,最终完成验证。
整体思路是清晰的
代码
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 会生成符合物理规律的“类人”轨迹。
通常采用物理加速度模型,模拟先加速、后减速、甚至在终点附近产生微小回弹的过程:
非线性路径: 加入微小的 $y$ 轴抖动。
变速运动: 模拟人类观察、对准、松手前的小停顿。
第四阶段:动作执行 (Action)
通过浏览器驱动 API(如 mouse.move, mouse.down, mouse.up)将计算好的坐标序列发送给浏览器。
Manus 实现的技术栈对比
模块 | 常用技术/库 | Manus 的潜在处理方式 |
浏览器自动化 | Playwright, Selenium | 优先使用 Playwright (更隐蔽且支持 CDP) |
图像处理 | OpenCV, PIL | 动态编写 Python 脚本进行视觉计算 |
轨迹算法 | 贝塞尔曲线, 物理仿真 | 基于 LLM 生成逻辑或调用现成的离散数学模型 |
反爬对抗 | stealth.min.js | 自动注入插件以隐藏 WebDriver 特征 |
结论
不同于传统的写死脚本,Manus 的优势在于它能根据页面实时反馈动态调整策略。但还是难以成功。



浙公网安备 33010602011771号