var KuaiShou = "快手极速版" //应用名称
if (StartApp(KuaiShou,1000) == false){
toastLog("手机上找不到App:" + KuaiShou) //手机提示框
hamibot.exit(); //找不到退出应用
}
//打开应用
function StartApp(AppName,STime){
var isHaveApp = false
isHaveApp = launchApp(AppName) //打开应用
if (isHaveApp) {
log("打开应用:" + AppName)
log("等待应用加载中...")
//点过广告
var skip = textContains("跳过").findOne(4000)
if(skip !== null){
log("发现应用启动广告,点击跳过")
ClickBtn(skip) //调用点击控件函数
}
if (STime !== undefined && STime > 0 ){
sleep(STime) //等待应用加载
}
}
return isHaveApp
}
//点击控件
function ClickBtn(btn) {
if (btn !== null) { //判断控件是否存在
var b = btn.bounds(); //获取控件范围
if (b.centerX() > 0 && b.centerY() > 0) { //控件在屏幕上才能点击
click(b.centerX(), b.centerY()); //click(x,y) 点击x y位置
}
回答
Hamibot脚本问题分析与修正
你提供的脚本有几个关键问题需要修正,以下是详细分析和改进方案:
主要问题
- 应用启动方式错误:
launchApp("快手极速版")无法通过应用名称启动应用,Hamibot需要应用包名 - 函数结构不完整:
ClickBtn函数缺少闭合括号 - 缺少必要检查:没有检查无障碍服务状态
- 兼容性问题:代码未考虑Rhino 1.7.15引擎限制
修正后的完整脚本
// 文档地址 https://docs.hamibot.com/
var KuaiShou = "快手极速版"; // 应用名称
// 检查无障碍服务
if (!auto.service) {
toastLog("请先开启无障碍服务");
auto.waitFor();
}
// 获取应用包名并启动
var packageName = getPackageName(KuaiShou);
if (!packageName) {
toastLog("找不到应用: " + KuaiShou);
hamibot.exit();
}
if (StartApp(packageName, 1000) == false) {
toastLog("无法启动应用: " + KuaiShou);
hamibot.exit();
}
// 打开应用
function StartApp(packageName, STime) {
var isHaveApp = launch(packageName);
if (isHaveApp) {
log("打开应用包名: " + packageName);
log("等待应用加载中...");
// 点过广告
var skip = textContains("跳过").findOne(4000);
if (skip !== null) {
log("发现应用启动广告,点击跳过");
ClickBtn(skip);
}
if (STime !== undefined && STime > 0) {
sleep(STime);
}
}
return isHaveApp;
}
// 点击控件
function ClickBtn(btn) {
if (btn !== null) {
var b = btn.bounds();
if (b.centerX() > 0 && b.centerY() > 0) {
click(b.centerX(), b.centerY());
return true;
}
}
return false;
}
关键改进说明
-
正确获取应用包名:
- 使用
getPackageName("快手极速版")代替直接使用应用名称 - 通过包名启动应用是Hamibot的标准做法
- 使用
-
添加无障碍服务检查:
- 所有UI操作前必须确保无障碍服务已启用
if (!auto.service) { auto.waitFor(); }确保脚本安全运行
-
修复函数结构:
- 补全了
ClickBtn函数的闭合括号 - 增加了点击操作的返回值,便于调试
- 补全了
-
使用正确API:
launch(packageName)替代可能不存在的launchApp- 使用标准的UI选择器
textContains("跳过").findOne(4000)
最佳实践建议
-
添加异常处理:在关键操作处添加try-catch块
try { // 可能出错的操作 } catch (e) { log("错误: " + e); hamibot.exit(); } -
增加超时机制:避免脚本无限等待
var startTime = Date.now(); while (Date.now() - startTime < 10000) { // 10秒超时 if (text("首页").exists()) break; sleep(500); } -
使用更可靠的元素定位:
// 优先使用ID定位,更稳定 var skip = id("com.smile.gifmaker:id/ksad_skip_button").findOne(3000); // 备用方案 if (!skip) skip = textContains("跳过").findOne(3000); -
增加设备兼容性处理:
// 处理不同设备的屏幕适配 var deviceWidth = device.width; var deviceHeight = device.height; if (deviceWidth < 720) { // 小屏幕设备特殊处理 }
这个修正后的脚本应该能更稳定地在Hamibot中运行,正确启动快手极速版并处理启动广告。如果仍有问题,建议先通过app.getInstalledApps()确认应用包名是否正确。