我想做一个自动点击小游戏日常任务的脚本,应该怎么做?

HAMI_4282473807 · 5 小时前

回答

Hamibot AI
1
· 5 小时前

开发自动点击小游戏日常任务的脚本,你可以按照以下步骤进行。核心在于准确定位界面元素、稳定执行点击动作,并合理处理游戏加载与状态变化。

1. 确保基础权限与环境

  • 在手机设置中为 Hamibot 开启「无障碍服务」与「后台弹出界面」权限。权限未授予时,脚本会因无法操作界面而直接退出。
  • 脚本开头必须调用 auto.waitFor(),阻塞等待无障碍服务完全就绪后再执行后续逻辑。

2. 核心开发逻辑

  • 元素定位:优先使用 UI 选择器(如 text("日常任务")id("task_btn")desc("领取"))。坐标点击易受分辨率、刘海屏或游戏更新影响,稳定性较差。
  • 点击执行:使用 .click()Tap(x, y)。Hamibot 的底层点击动作是异步且非阻塞的,脚本不会等待动画或界面刷新完成。因此必须在每次点击后添加 sleep() 等待响应。
  • 循环与状态判断:使用 whilefor 遍历任务列表,结合 exists() 判断元素是否出现,避免对已领取或不可点击的元素执行无效操作。
  • 异常处理:游戏常出现弹窗、加载动画或网络延迟,需加入超时重试与自动关闭弹窗的逻辑。

3. 示例代码(兼容 Rhino 1.7.15)

// 文档地址 https://docs.hamibot.com/
auto.waitFor();

// 等待游戏主界面加载完成
while (!text("日常任务").exists()) {
    sleep(1000);
}

// 打开任务面板
text("日常任务").findOne().click();
sleep(1500);

// 遍历并点击可领取的任务
var taskList = className("android.widget.Button").find();
for (var i = 0; i < taskList.length; i++) {
    var btn = taskList[i];
    var btnText = btn.text();
    if (btnText && btnText.match(/领取|完成|签到/)) {
        btn.click();
        sleep(800); // 异步动作必须加延时,等待界面刷新
    }
}

// 关闭任务面板
if (text("关闭").exists()) {
    text("关闭").findOne().click();
    sleep(500);
}

4. 最佳实践建议

  • 使用布局分析工具:在 Hamibot 编辑器中打开「布局分析」,实时查看游戏界面的控件树,获取准确的 textidclassName。避免硬编码坐标。
  • 合理控制延时:不同机型渲染速度差异较大,sleep() 建议设置在 500~1500ms。若追求效率,可用 waitFor() 替代固定延时,例如 text("领取成功").waitFor(3000)
  • 处理动态弹窗:游戏常弹出“网络错误”、“确认”等提示。可定期检查并自动点击:
    if (text("确定").exists()) {
        text("确定").findOne().click();
        sleep(500);
    }
    
  • 防检测与拟人化:避免固定间隔点击。加入随机延时 sleep(500 + Math.random() * 500),模拟人工操作节奏,降低被游戏风控识别的概率。
  • Canvas/自定义控件适配:若游戏使用 Canvas 渲染导致 UI 选择器失效,可改用图像识别 images.findImage() 定位按钮中心坐标,再配合 Tap(x, y) 执行点击。注意 Tap() 同样为异步非阻塞,必须紧跟 sleep()

调试时建议在 Hamibot 编辑器中使用「日志输出」(log()) 打印选择器匹配结果,逐步验证逻辑。若遇到特定控件无法定位或点击无响应,可提供该界面的布局分析属性,我将协助你优化选择器与执行逻辑。

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