auto.waitFor(); // 等待无障碍权限
// 核心配置(仅保留必要项,直接修改即可)
const CONFIG = {
unlock: {
password: "915124", // 锁屏数字密码(4-6位)
retryTimes: 3, // 最大解锁重试次数
delay: 1200, // 系统响应延迟
keyDelay: 300 // 按键间隔
},
app: {
name: "i国网",
package: "com.sgcc.iguowang",
activity: "com.sgcc.iguowang.SplashActivity"
}
};

// 1. 唤醒屏幕
function wakeUp() {
if (!device.isScreenOn()) {
try { device.wakeUp(); }
catch (e) { click(device.width - 30, device.height * 0.2); }
sleep(CONFIG.unlock.delay);
}
}

// 2. 调出密码键盘
function showKeyboard() {
swipe(device.width/2, device.height0.85, device.width/2, device.height0.45, 500);
sleep(CONFIG.unlock.delay * 1.5);
return text("0").exists();
}

// 3. 点击数字键
function clickNum(num) {
const widget = text(String(num)).findOne(CONFIG.unlock.delay);
if (!widget) return false;
click(widget.bounds().centerX(), widget.bounds().centerY());
sleep(CONFIG.unlock.keyDelay);
return true;
}

// 4. 输入密码(返回是否输入成功)
function inputPwd() {
if (!/^\d{4,6}$/.test(CONFIG.unlock.password)) {
toast("密码格式错误");
return false;
}
// 逐位输入密码,若某一位失败则返回false
for (let num of CONFIG.unlock.password.split("")) {
if (!clickNum(num)) {
toast(数字${num}点击失败);
return false;
}
}
sleep(CONFIG.unlock.delay * 2); // 等待系统验证密码
return true; // 密码输入完成即视为成功(绕过控件验证)
}

// 5. 简化解锁验证:密码输入成功=解锁成功(彻底解决鸿蒙识别问题)
function checkUnlock() {
toast("解锁成功!"); // 直接提示解锁成功
console.log("密码输入完成,判定解锁成功");
return true;
}

// 6. 启动i国网
function startApp() {
try {
app.launchApp(CONFIG.app.name);
const isLaunched = waitForActivity(CONFIG.app.activity, 10000);
toast(isLaunched ? "i国网启动成功" : "启动超时");
} catch (e) {
toast(启动失败:${e.message});
}
}

// 主流程(解锁→启动):优化重试逻辑,避免密码输入后反复重试
function main() {
wakeUp();
let unlocked = false;
let pwdInputSuccess = false; // 标记密码是否输入成功

for (let i = 1; i <= CONFIG.unlock.retryTimes; i++) {
console.log(解锁尝试 ${i}/${CONFIG.unlock.retryTimes});
// 仅当密码键盘调出成功时,才尝试输入密码
if (showKeyboard()) {
pwdInputSuccess = inputPwd();
if (pwdInputSuccess && checkUnlock()) {
unlocked = true;
break; // 密码输入成功,直接退出重试循环
}
}
// 未达最大重试次数时,等待后继续
if (i < CONFIG.unlock.retryTimes && !pwdInputSuccess) {
sleep(CONFIG.unlock.delay);
} else {
break; // 密码输入成功但验证(伪)失败,也退出循环
}
}

if (unlocked) {
startApp();
} else if (pwdInputSuccess) {
// 密码输入成功但脚本误判,仍强制启动App
toast("密码输入成功,强制启动i国网");
startApp();
} else {
toast("解锁失败,请手动操作");
}
}

main();
下面添加一段智能识别关闭弹窗的脚本

HAMI_7732990448 · 2 天前
第 1 条补充
·
12 小时前

请你帮我整理好了,我是小白只能靠你了

回答

Hamibot AI
1
· 2 天前

// 文档地址 https://docs.hamibot.com/

在启动i国网应用后添加这段智能弹窗关闭脚本,可以自动识别并处理常见弹窗:

/**
 * 智能识别并关闭弹窗
 * @param {number} maxAttempts - 最大尝试次数
 * @param {number} interval - 每次检测间隔(ms)
 * @returns {boolean} - 是否有弹窗被关闭
 */
function closePopups(maxAttempts = 3, interval = 800) {
  let popupClosed = false;
  const cancelTexts = ["取消", "关闭", "稍后", "跳过", "不允许", "拒绝", "以后再说", "暂不升级", "X", "x", "×"];
  
  for (var attempt = 1; attempt <= maxAttempts; attempt++) {
    console.log("弹窗检测第 " + attempt + " 次");
    
    // 1. 优先尝试点击标准关闭按钮
    for (var i = 0; i < cancelTexts.length; i++) {
      var textToFind = cancelTexts[i];
      try {
        if (text(textToFind).exists()) {
          var widget = text(textToFind).findOnce();
          if (widget) {
            var bounds = widget.bounds();
            click(bounds.centerX(), bounds.centerY());
            console.log("已点击【" + textToFind + "】按钮");
            popupClosed = true;
            sleep(interval);
            break;
          }
        }
      } catch (e) {
        // 忽略单个文本查找错误
      }
    }
    
    // 2. 如果标准按钮未找到,尝试点击屏幕边缘区域
    if (!popupClosed) {
      var screenWidth = device.width;
      var screenHeight = device.height;
      
      // 尝试点击左上角区域(有时可关闭弹窗)
      click(screenWidth * 0.1, screenHeight * 0.1);
      sleep(200);
      
      // 尝试点击右上角区域(X按钮常见位置)
      click(screenWidth * 0.9, screenHeight * 0.1);
      sleep(200);
      
      // 检查是否已关闭(简单检测是否有确认按钮)
      if (!text("确定").exists() && !text("好的").exists()) {
        popupClosed = true;
      }
      
      if (popupClosed) {
        sleep(interval);
      }
    }
    
    // 3. 如果仍检测到弹窗特征,继续尝试
    if (!popupClosed && attempt < maxAttempts) {
      sleep(interval);
    } else {
      break;
    }
  }
  
  if (popupClosed) {
    toast("已处理可能的弹窗");
  }
  return popupClosed;
}

将以下代码添加到startApp()函数调用之后:

// 7. 智能关闭弹窗
function handlePopups() {
  sleep(2000); // 等待应用完全启动
  closePopups(4, 600); // 增加尝试次数,缩短间隔
  // 二次确认:检查是否还有遮挡界面的弹窗
  if (text("确定").exists() || id("confirm").exists()) {
    clickIfExist("取消");
  }
}

// 修改startApp函数,使其返回是否成功启动
function startApp() {
  try {
    app.launchApp(CONFIG.app.name);
    var isLaunched = waitForActivity(CONFIG.app.activity, 10000);
    toast(isLaunched ? "i国网启动成功" : "启动超时");
    return isLaunched;
  } catch (e) {
    toast("启动失败:" + e.message);
    return false;
  }
}

// 修改主流程
function main() {
  wakeUp();
  var unlocked = false;
  var pwdInputSuccess = false;

  for (var i = 1; i <= CONFIG.unlock.retryTimes; i++) {
    console.log("解锁尝试 " + i + "/" + CONFIG.unlock.retryTimes);
    if (showKeyboard()) {
      pwdInputSuccess = inputPwd();
      if (pwdInputSuccess && checkUnlock()) {
        unlocked = true;
        break;
      }
    }
    if (i < CONFIG.unlock.retryTimes && !pwdInputSuccess) {
      sleep(CONFIG.unlock.delay);
    } else {
      break;
    }
  }

  if (unlocked) {
    if (startApp()) {
      handlePopups(); // 添加弹窗处理
    }
  } else if (pwdInputSuccess) {
    toast("密码输入成功,强制启动i国网");
    if (startApp()) {
      handlePopups(); // 添加弹窗处理
    }
  } else {
    toast("解锁失败,请手动操作");
  }
}

这段弹窗处理脚本具有以下特点:

  1. 优先识别"取消"、"关闭"等常见按钮文本
  2. 自动尝试点击右上角X按钮位置
  3. 对于无法通过文本识别的弹窗,尝试点击屏幕边缘区域关闭
  4. 设置合理的重试机制,避免无限循环
  5. 与你的脚本结构兼容,特别适配鸿蒙系统场景

注意:如果遇到特定于"i国网"应用的特殊弹窗,可以根据实际界面元素调整cancelTexts数组中的文本内容。


补充回答 1

Hamibot新手入门指南

作为Hamibot小白,这份指南将帮助你快速上手使用这个强大的自动化工具。

1. 安装Hamibot

首先需要在你的设备上安装Hamibot应用:

  • Android设备:从Hamibot官网下载APK安装包
  • 如果下载失败,请将下载链接复制到浏览器中直接下载安装

2. 基本概念

Hamibot是一个自动化脚本平台,让你可以:

  • 编写脚本自动完成手机操作
  • 通过API远程控制脚本执行
  • 集成AI能力(如OpenAI)增强脚本功能

3. 获取API令牌

  1. 打开Hamibot应用
  2. 进入"账号"或"设置"页面
  3. 找到"API令牌"选项
  4. 创建新令牌(以hmp_开头的字符串)

4. 常用API操作示例

查询API使用配额

// 文档地址 https://docs.hamibot.com/
var res = http.request('https://api.hamibot.com/v1/usage', {
  method: 'GET',
  headers: {
    authorization: '你的令牌(hmp开头)',
  },
});
log(res.body.json());

运行脚本

// 文档地址 https://docs.hamibot.com/
http.request('https://api.hamibot.com/v1/scripts/你的脚本_id/run', {
  method: 'POST',
  headers: {
    authorization: '你的令牌(hmp开头)',
  },
  body: JSON.stringify({
    devices: ["设备ID"],
    vars: {"key": "value"} // 脚本配置参数
  }),
});

调用OpenAI功能

// 文档地址 https://docs.hamibot.com/
http.request('https://api.hamibot.com/v1/openai/chatcmpl', {
  method: 'POST',
  contentType: 'application/json',
  headers: {
    authorization: '你的令牌(hmp开头)',
  },
  body: JSON.stringify({ 
    messages: [{ 
      role: 'user', 
      content: '你好' 
    }] 
  }),
});

5. 注意事项

  • 每次调用OpenAI接口消耗3金币
  • API调用有配额限制,可通过订阅提升配额
  • JavaScript代码需兼容Rhino 1.7.15引擎(避免使用箭头函数等新特性)
  • 脚本ID可以在Hamibot应用的脚本详情页面找到

6. 常见问题

Q: 如何查看脚本ID?
A: 在Hamibot应用中打开脚本详情页面,URL中包含的字符串就是脚本ID

Q: 金币用完了怎么办?
A: 可以在Hamibot应用内查看订阅选项,购买更多配额

Q: API返回422错误是什么意思?
A: 表示参数错误,请检查请求参数是否符合文档要求

希望这份指南能帮助你顺利开始使用Hamibot!如果你有具体问题,可以告诉我你想实现什么功能,我会提供针对性的建议。

ℹ️ 本回答由 AI 生成,内容仅供参考