Manus滑动验证码模块过程
<h2>Manus滑动验证码模块过程</h2><p><font size="3"> Manus作为通用AI智能体,其模拟浏览器滑动验证码的核心逻辑是:以视觉识别为基础,模拟人类操作习惯,在受控虚拟机环境中执行滑块拖动,通过前端交互验证与后端参数校验,最终完成验证。</font></p><p></p><p><font size="3">整体思路是清晰的</font></p><p><font size="3"></font></p><h2><font size="3">代码</font></h2><font size="3">import cv2import 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
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><p><font size="3"><br></font></p><p><font size="3"><strong>片段三</strong></font></p><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><h4><font size="3">滑动操作执行(拟人化交互)</font></h4><p><font size="3">Manus通过向操作系统发送指令,模拟鼠标的真实滑动操作,全程无人工干预,具体步骤如下:</font></p><p><font size="3">1. 滑块点击与按住:Manus模拟人类鼠标操作,移动鼠标至滑块初始位置,执行“点击并按住”动作(模拟手指按压滑块),动作流畅无突兀,避免瞬间点击触发反爬。</font></p><p><font size="3">2. 按轨迹拖动:按照生成的滑动轨迹,逐步拖动滑块,每一步位移、速度严格遵循预设轨迹,滑动过程中无停顿、无跳跃,同时保留微小抖动,完全复刻人类滑动习惯。拖动过程中,Manus实时监控滑块位置,确保不偏离滑动轨道。</font></p><p><font size="3">3. 滑块释放:当滑块拖动至缺口对应位置(误差≤1像素)时,Manus执行“释放鼠标”动作,释放时机自然,避免提前或延迟释放,确保滑块精准落入缺口。</font></p><p><font size="3">4. 操作细节补充:滑动完成后,Manus会停留0.5-1秒,再进行后续操作,模拟人类确认验证结果的习惯,进一步降低反爬风险。</font></p><h4><font size="3">核心流程分解</font></h4><p><font size="3">实现滑动验证码绕过通常分为四个关键阶段:</font></p><h5><font size="3">第一阶段:资源获取与目标识别 (Sense)</font></h5><p><font size="3">Manus 首先会通过浏览器驱动(如 Playwright 或 Puppeteer)获取验证码的两个核心要素:<b>背景图(Background)<b>和</b>滑块图(Slider/Gap)</b>。</font></p><ul><li><p><font size="3"><b>识别方式:</b> 如果滑块是 Canvas 渲染,Manus 会截取当前 DOM 元素的快照;如果是传统的 URL 图片,则直接下载。</font></p></li><li><p><font size="3"><b>图像预处理:</b> 使用 OpenCV 进行灰度化、高斯模糊处理,以消除噪点。</font></p></li></ul><h5><font size="3">第二阶段:缺口距离计算 (Positioning)</font></h5><p><font size="3">这是最关键的一步,Manus 需要计算出滑块需要移动的物理像素距离 $x$。</font></p><ul><li><p><font size="3"><b>模板匹配 (Template Matching):</b> 在背景图中寻找与滑块边缘特征最匹配的区域。</font></p></li><li><p><font size="3"><b>边缘检测 (Canny Edge Detection):</b> 通过识别背景图中由于缺口产生的阴影边界来精确定位。</font></p></li></ul><h5><font size="3">第三阶段:模拟人类轨迹生成 (Trajectory Planning)</font></h5><p><font size="3"><b>这是绕过反爬引擎检测的核心。</b> 如果滑块以恒定速度直线移动,极易被识别为机器人。Manus 会生成符合物理规律的“类人”轨迹。</font></p><p><font size="3">通常采用<b>物理加速度模型</b>,模拟先加速、后减速、甚至在终点附近产生微小回弹的过程:</font></p><p><font size="3"></font></p><p><font size="3"></font></p><ul><li><p><font size="3"><b>非线性路径:</b> 加入微小的 $y$ 轴抖动。</font></p></li><li><p><font size="3"><b>变速运动:</b> 模拟人类观察、对准、松手前的小停顿。</font></p></li></ul><h5><font size="3">第四阶段:动作执行 (Action)</font></h5><p><font size="3">通过浏览器驱动 API(如 <code>mouse.move</code>, <code>mouse.down</code>, <code>mouse.up</code>)将计算好的坐标序列发送给浏览器。</font></p><p><b><font size="3"><br></font></b></p><p><b><font size="3">Manus 实现的技术栈对比</font></b></p><table border="0" cellpadding="0"><tbody><tr><td><p><b><font size="3">模块</font></b></p></td><td><p><b><font size="3">常用技术/库</font></b></p></td><td><p><b><font size="3">Manus 的潜在处理方式</font></b></p></td></tr><tr><td><p><b><font size="3">浏览器自动化</font></b></p></td><td><p><font size="3">Playwright, Selenium</font></p></td><td><p><font size="3">优先使用 <b>Playwright</b> (更隐蔽且支持 CDP)</font></p></td></tr><tr><td><p><b><font size="3">图像处理</font></b></p></td><td><p><font size="3">OpenCV, PIL</font></p></td><td><p><font size="3">动态编写 Python 脚本进行视觉计算</font></p></td></tr><tr><td><p><b><font size="3">轨迹算法</font></b></p></td><td><p><font size="3">贝塞尔曲线, 物理仿真</font></p></td><td><p><font size="3">基于 LLM 生成逻辑或调用现成的离散数学模型</font></p></td></tr><tr><td><p><b><font size="3">反爬对抗</font></b></p></td><td><p><font size="3">stealth.min.js</font></p></td><td><p><font size="3">自动注入插件以隐藏 WebDriver 特征</font></p></td></tr></tbody></table><p><br></p><h2>结论</h2><p><font size="3"> 不同于传统的写死脚本,Manus 的优势在于它能根据页面实时反馈动态调整策略。但还是难以成功。</font></p><br>来源:程序园用户自行投稿发布,如果侵权,请联系站长删除<br>免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]