// ==========================================
// Hamibot 鸣潮自动拾取脚本(白嫖免注册版)
// ==========================================
auto.waitFor(); // 确保无障碍服务开启
toast("✅ 自动拾取脚本已启动,按音量键即可停止");
while(true) {
// 1. 截取当前游戏屏幕
let img = captureScreen();
let w = img.width;
let h = img.height;
// 2. 划定查找区域(通常交互键出现在屏幕中下半部分)
// 范围:左侧 10% 到 右侧 90%,顶部 50% 到底部 90%
let region = [w * 0.1, h * 0.5, w * 0.8, h * 0.4];
// 3. 在区域里寻找纯白色或高亮色(代表交互键:F、拾取、声骸)
// threshold: 80 是色彩容差,允许有些许偏色
let point = images.findColor(img, "#FFFFFF", { region: region, threshold: 80 });
// 4. 如果找到了交互键,就点击它!
if(point) {
click(point.x, point.y);
// 【核心防封策略】:捡完后停顿 0.8~2 秒随机时间,模拟人眼察看装备的时间
sleep(800 + Math.random() * 1200);
} else {
// 没看到交互键,说明附近没东西,稍微等一下节省电量
sleep(300);
}
}
回答
你提供的代码是一个简单的基于颜色匹配的自动点击脚本,针对《鸣潮》游戏的拾取交互键设计了逻辑。但作为一名 Hamibot 产品专家,我需要指出代码中的几个关键问题,并给出修正建议,以确保脚本能正常运行且符合安全规范。
❌ 问题 1:缺少截图权限请求
现状:代码直接调用了 captureScreen(),但没有先请求截图权限。
后果:在没有授予权限时执行,脚本会直接崩溃并报错。
修正:在 auto.waitFor() 之后,立即请求截图权限:
if (!requestScreenCapture()) {
toastLog("截图权限获取失败,请手动允许后重试");
hamibot.exit();
}
❌ 问题 2:auto.waitFor() 语法错误
现状:auto.waitFor() 不是 Hamibot 的标准 API。
正确写法:应该使用 auto() 开启无障碍服务,然后 waitFor() 或直接检查状态。
修正:
auto();
// 等待无障碍服务就绪(可省略,auto()会自动等待)
或使用更稳健的方式:
auto.waitFor(); // 注意:这是 Auto.js 的写法,Hamibot 不兼容
建议:在 Hamibot 中,只需调用 auto() 即可,脚本会自动等待无障碍启动。
❌ 问题 3:无限循环且缺少退出机制
现状:while(true) 没有停止条件,即使按音量键也无法停止 — 因为代码中并没有监听音量键事件。
后果:脚本只能通过强制停止或重启设备才能退出。
修正:添加一个全局变量作为开关,监听音量键(Hamibot 支持 events):
let running = true;
// 监听音量下键按下事件
events.observeKey();
events.on("key_down", function(keyCode){
if(keyCode === 25){ // 音量减键
running = false;
toastLog("即将停止脚本");
}
});
while(running){
// 你的循环体
}
注意:events 模块可能需要配合 auto() 使用。
❌ 问题 4:色彩匹配阈值可能过高,导致误触
现状:threshold: 80 意味着 RGB 每个通道允许最大偏差约 80(0-255)。纯白色 #FFFFFF 与浅色 UI 元素(如浅灰色文字)非常接近,容易误触。
修正:降低阈值到 30~50,并改用人眼更敏感的颜色(例如交互键通常有特定色相):
let point = images.findColor(img, "#FFFFFF", {
region: region,
threshold: 50
});
更优的做法是使用多点找色(findMultiColors),因为交互键通常包含文字和背景的对比特征。
❌ 问题 5:直接使用 images.findColor 而释放图片
现状:每次循环都截取一张新图片,但没有回收旧图片。
后果:长期运行导致内存泄漏,最终被杀后台或卡死。
修正:在每次循环末尾调用 img.recycle():
let img = captureScreen();
// 使用后
img.recycle();
或者用 try-finally 确保释放。
❌ 问题 6:区域计算可能超出屏幕边界
现状:region = [w * 0.1, h * 0.5, w * 0.8, h * 0.4] 的第三个参数为宽度,第四个参数为高度。
如果屏幕分辨率特殊,w * 0.8 可能超出实际宽度(因为起点是 w*0.1,加上宽度 w*0.8 会到 w*0.9,仍在屏幕内,但需确保 region 格式正确 — [left, top, width, height])。
修正:明确注释并验证边界。
🟢 完整修正版代码示例
// ==========================================
// Hamibot 鸣潮自动拾取脚本(修正版)
// ==========================================
auto(); // 开启无障碍服务
if (!requestScreenCapture()) {
toastLog("截图权限获取失败,请手动允许后重试");
hamibot.exit();
}
toast("✅ 自动拾取脚本已启动,按音量下键即可停止");
let running = true;
// 监听音量键(音量下键=25)
events.observeKey();
events.on("key_down", function(keyCode){
if(keyCode === 25){
running = false;
toastLog("脚本即将停止");
}
});
while(running) {
let img = captureScreen();
if (!img) {
sleep(500);
continue;
}
let w = img.width;
let h = img.height;
// 交互键通常出现在屏幕中下部
let region = [Math.round(w * 0.1), Math.round(h * 0.5),
Math.round(w * 0.8), Math.round(h * 0.4)];
// 白色阈值降低至50,避免误触
let point = images.findColor(img, "#FFFFFF", {
region: region,
threshold: 50
});
if (point) {
click(point.x, point.y);
// 随机停顿 0.8~2 秒
sleep(800 + Math.random() * 1200);
} else {
sleep(300);
}
img.recycle(); // 必须释放内存
}
⚠️ 关于“白嫖免注册”说法
此标签容易让人误解该脚本规避了 Hamibot 的正常使用机制。实际上,Hamibot 免费版限制机器人数量和学习时长,但脚本本身仍可运行。请勿试图绕过平台规则,否则可能被封禁账号。
如果你希望更精准地识别“拾取”按钮(例如文字“F”或“拾取”),建议改用 OCR 识别 或 多点找色,这样能大幅降低误触率。需要我提供实现方案吗?