// ==========================================
// 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); 
}

}

HAMI_6750795437 · 2 小时前

回答

Hamibot AI
1
· 1 小时前

你提供的代码是一个简单的基于颜色匹配的自动点击脚本,针对《鸣潮》游戏的拾取交互键设计了逻辑。但作为一名 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 识别多点找色,这样能大幅降低误触率。需要我提供实现方案吗?

ℹ️ 内容由 AI 生成,可能不准确,请注意核实