Manus滑动验证码模块过程 Manus作为通用AI智能体,其模拟浏览器滑动验证码的核心逻辑是:以视觉识别为基础,模拟人类操作习惯,在受控虚拟机环境中执行滑块拖动,通过前端交互验证与后端参数校验,最终完成验证。 整体思路是清晰的 代码- <font size="3">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</font><font size="3">
- </font><font size="3">
- </font><font size="3">
- </font>
复制代码- <font size="3"><strong>分析</strong>
- 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
- </font>
复制代码
片段三 - <font size="3">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</font>
复制代码滑动操作执行(拟人化交互)Manus通过向操作系统发送指令,模拟鼠标的真实滑动操作,全程无人工干预,具体步骤如下: 1. 滑块点击与按住:Manus模拟人类鼠标操作,移动鼠标至滑块初始位置,执行“点击并按住”动作(模拟手指按压滑块),动作流畅无突兀,避免瞬间点击触发反爬。 2. 按轨迹拖动:按照生成的滑动轨迹,逐步拖动滑块,每一步位移、速度严格遵循预设轨迹,滑动过程中无停顿、无跳跃,同时保留微小抖动,完全复刻人类滑动习惯。拖动过程中,Manus实时监控滑块位置,确保不偏离滑动轨道。 3. 滑块释放:当滑块拖动至缺口对应位置(误差≤1像素)时,Manus执行“释放鼠标”动作,释放时机自然,避免提前或延迟释放,确保滑块精准落入缺口。 4. 操作细节补充:滑动完成后,Manus会停留0.5-1秒,再进行后续操作,模拟人类确认验证结果的习惯,进一步降低反爬风险。 核心流程分解实现滑动验证码绕过通常分为四个关键阶段: 第一阶段:资源获取与目标识别 (Sense)Manus 首先会通过浏览器驱动(如 Playwright 或 Puppeteer)获取验证码的两个核心要素:背景图(Background)和滑块图(Slider/Gap)。 第二阶段:缺口距离计算 (Positioning)这是最关键的一步,Manus 需要计算出滑块需要移动的物理像素距离 $x$。 第三阶段:模拟人类轨迹生成 (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 的优势在于它能根据页面实时反馈动态调整策略。但还是难以成功。 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |