回答
处理滑块验证码需要结合图像识别和模拟人类滑动操作。Hamibot提供了相应的API来完成这个任务,下面我为你提供完整的解决方案:
首先需要获取屏幕截图并识别滑块和缺口位置:
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
toastLog('请授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
sleep(1000);
// 截取屏幕
var img = captureScreen();
// 识别滑块位置(需要根据实际滑块颜色调整)
var sliderPos = images.findColor(img, "#1E90FF", {
region: [0, 0, device.width, device.height],
threshold: 4
});
if (!sliderPos) {
toastLog("未找到滑块");
hamibot.exit();
}
// 识别缺口位置(需要根据实际缺口特征调整)
var gapPos = images.findTemplate(img, images.read("./gap_template.png"), {
region: [sliderPos.x, 0, device.width - sliderPos.x, device.height],
threshold: 0.8
});
if (!gapPos) {
toastLog("未找到缺口");
hamibot.exit();
}
// 计算滑动距离
var distance = gapPos.x - sliderPos.x;
toastLog("滑动距离: " + distance);
// 执行滑动操作
slideCaptcha(distance);
function slideCaptcha(distance) {
// 模拟人类滑动轨迹(包含加速度变化)
var startX = sliderPos.x;
var startY = sliderPos.y;
var endX = startX + distance;
var endY = startY;
// 滑动起点
gesture(100, [startX, startY]);
// 生成模拟人类滑动的轨迹点
var points = generateHumanTrajectory(startX, startY, endX, endY, distance);
// 沿轨迹移动
for (var i = 0; i < points.length; i++) {
var point = points[i];
gesture(50, [[point.x, point.y]]);
if (i % 3 == 0) sleep(20); // 随机停顿
}
// 到达终点后短暂停留
sleep(100);
gesture(50, [[endX, endY]]);
sleep(50);
}
function generateHumanTrajectory(startX, startY, endX, endY, distance) {
var points = [];
var totalSteps = Math.min(Math.max(Math.floor(distance / 2), 15), 30); // 步数根据距离调整
// 添加起始点
points.push({x: startX, y: startY});
// 生成中间点
for (var i = 1; i < totalSteps; i++) {
// 模拟人类滑动的不规则性(随机偏移)
var progress = i / totalSteps;
var offsetX = Math.sin(progress * Math.PI) * (Math.random() * 5 - 2.5);
var offsetY = (Math.random() - 0.5) * 3;
// 计算当前位置(带加速度)
var t = progress * progress * (3 - 2 * progress); // 贝塞尔曲线模拟加速度
var x = startX + (endX - startX) * t + offsetX;
var y = startY + (endY - startY) * progress + offsetY;
points.push({x: x, y: y});
}
// 添加终点
points.push({x: endX, y: endY});
return points;
}
使用这个解决方案需要注意:
-
图像识别部分需要根据实际验证码调整:
- 滑块颜色识别(
findColor中的颜色值) - 缺口识别可能需要准备一个模板图片(
gap_template.png) - 可能需要调整
threshold参数提高识别准确率
- 滑块颜色识别(
-
滑动轨迹模拟很重要,太规则的直线滑动容易被识别为机器人:
- 代码中的
generateHumanTrajectory函数模拟了人类滑动的不规则性 - 包含随机偏移和加速度变化(开始慢、中间快、结束慢)
- 代码中的
-
实际使用时可能需要:
- 在设备上先截取缺口模板图片
- 根据不同网站的验证码特性调整识别参数
- 可能需要多次尝试不同的滑动速度和轨迹
-
对于复杂验证码,可以考虑结合OCR识别文字提示(如"向右滑动填充拼图"等)
如果验证码特别复杂,建议先在Hamibot中录制一个手动操作的示例,然后分析其轨迹特征,再编写更精确的自动化脚本。
补充回答 1
Hamibot本身不直接集成"超级瘾"打码平台,但你可以通过HTTP API调用第三方打码服务来实现滑块验证码识别。下面是如何实现的完整方案:
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
toastLog('请授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
sleep(1000);
// 1. 截取屏幕
var img = captureScreen();
var imgPath = "/sdcard/slide_captcha.png";
images.save(img, imgPath);
toastLog("已保存验证码图片");
// 2. 调用第三方打码平台API
var distance = solveSlideCaptcha(imgPath);
if (distance <= 0) {
toastLog("验证码识别失败");
hamibot.exit();
}
toastLog("识别到滑动距离: " + distance + "像素");
// 3. 执行模拟滑动
slideCaptcha(distance);
function slideCaptcha(distance) {
// 找到滑块位置(这里需要根据实际情况调整坐标)
var sliderPos = {
x: device.width * 0.2,
y: device.height * 0.7
};
var startX = sliderPos.x;
var startY = sliderPos.y;
var endX = startX + distance;
var endY = startY;
// 模拟人类滑动操作
swipe(startX, startY, endX, endY, 800);
// 或者使用更精确的RootAutomator
/*
var ra = new RootAutomator();
ra.swipe(startX, startY, endX, endY, 800);
ra.exit();
*/
toastLog("滑动完成,等待结果...");
sleep(2000);
}
function solveSlideCaptcha(imgPath) {
// 这里替换为实际的打码平台API
var apiUrl = "https://超级瘾打码平台.com/api/slide";
var token = "你的API_TOKEN";
// 准备表单数据
var formData = {
"token": token,
"image": open(imgPath)
};
// 发送HTTP请求
var res = http.postMultipart(apiUrl, formData);
if (res.statusCode != 200) {
toastLog("API请求失败: " + res.statusCode);
return -1;
}
var result = res.body.json();
if (result.code == 0) {
return result.distance; // 假设返回的JSON中有distance字段
} else {
toastLog("识别失败: " + result.msg);
return -1;
}
}
重要说明:
-
打码平台集成注意事项:
- 你需要先注册第三方打码平台并获取API Token
- 不同打码平台的API接口格式可能不同,需根据实际文档调整代码
- 代码中的"超级瘾"仅为示例,你需要替换为实际使用的API地址
-
滑动模拟优化:
- 实际使用时应该使用更复杂的滑动轨迹,避免被识别为机器人
- 可以在
slideCaptcha函数中添加随机停顿和轨迹偏移
function slideCaptcha(distance) {
var sliderPos = {
x: device.width * 0.2,
y: device.height * 0.7
};
var startX = sliderPos.x;
var startY = sliderPos.y;
var endX = startX + distance;
var endY = startY;
// 模拟人类滑动轨迹
var points = generateHumanTrajectory(startX, startY, endX, endY, distance);
// 执行轨迹
gesture(50, [[startX, startY]]); // 起点
for (var i = 0; i < points.length; i++) {
var point = points[i];
gesture(30, [[point.x, point.y]]);
if (i % 4 == 0) sleep(20 + Math.random() * 30); // 随机停顿
}
sleep(100);
gesture(50, [[endX, endY]]); // 终点
sleep(50);
}
-
安全与合规提示:
- 使用打码平台需确保其服务合法合规
- 不要用于违反网站服务条款的自动化行为
- 某些网站的验证码系统可能会检测异常行为,过于频繁的请求可能导致IP被封禁
-
备选方案:
- 如果打码平台API调用不稳定,可以考虑使用Hamibot内置的图像识别功能作为备用方案
- 对于简单验证码,可以尝试使用
images.findColor()或images.findTemplate()进行本地识别
记得在使用前阅读相关打码平台的API文档,确保正确设置请求参数和处理响应格式。
ℹ️ 本回答由 AI 生成,内容仅供参考
