// 等待无障碍服务稳定[citation:5]

// 唤醒屏幕和解锁函数(示例,需根据你的锁屏方式调整)
// function ensureScreenOnAndUnlock() {
// // 1. 如果屏幕没有点亮,则唤醒屏幕
// if (!device.isScreenOn()) {
// device.wakeUp(); // 唤醒屏幕
// sleep(1000); // 等待屏幕亮起
// }

// // 2. 此处模拟解锁操作(需要根据你的实际锁屏方式自定义)
// // 例如:滑动解锁、输入数字密码等
// // 注意:解锁操作因设备和个人设置差异很大,以下仅为滑动解锁示例
// swipe(500, 1500, 500, 500, 500); // 从下往上滑动解锁
// sleep(1500);
// }

// // 在主流程开始前调用
// ensureScreenOnAndUnlock();
// 如果已经在云闪付内,快速按两次返回
if (packageName("com.unionpay").exists()) {
for (let i = 0; i < 5; i++) {
back();
sleep(600);
}
}
// 启动云闪付APP
auto.waitFor();
launchApp("云闪付");
toastLog("等待云闪付启动");
sleep(10000); // 等待应用加载,时间可根据实际情况调整

// 使用 id 检测页面状态
if (id("tv").exists()) {
toastLog("检测到首页元素,开始搜索开户宝");

// 点击搜索框
let searchBox = id("tv").findOne();
searchBox.click();
sleep(10000);

// 输入搜索内容
setText("开户宝");
sleep(10000);


// 尝试点击搜索按钮
let searchButton = className("android.widget.TextView").text("搜索").findOne(3000);
if (searchButton) {
	click(searchButton.bounds().centerX(), searchButton.bounds().centerY()); // 通过坐标点击
	// 或者使用强制点击
	// searchItem.click({ force: true });
}
// 如果找不到搜索按钮,可能是被软键盘遮挡,先隐藏软键盘
back(); // 按返回键隐藏软键盘
sleep(10000);
// 尝试点击搜索按钮
let kaihubao = className("android.widget.TextView").text("开户宝").findOne(3000);
if (kaihubao) {
	click(kaihubao.bounds().centerX(), kaihubao.bounds().centerY()); // 通过坐标点击
	toastLog("点击开户宝")
}
sleep(10000);
 let targetActivity = textContains("悦动湖湘光影未来").findOne(5000);
    toastLog("找到活动,准备点击...");
    // 策略3: 使用对象的 click() 方法,并添加强制点击参数
    let clicked = targetActivity.click();
    
    if (clicked) {
        toastLog("活动入口点击成功!");
        sleep(3000); // 策略4: 点击后等待足够时间让页面加载
    } else {
        toastLog("点击失败,尝试坐标点击...");
        // 备用方案:坐标点击
        let bounds = targetActivity.bounds();
        click(bounds.centerX(), bounds.centerY());
        sleep(3000);
   
    }

sleep(10000);

const {
	telephone
} = hamibot.env;
toastLog(telephone); // 打印并显示空白内容

// 检查是否为空
if (!telephone) {
	toastLog('未获取到电话号码');
} else {
	// 使用 split('\n') 将字符串按行分割成数组
	const phoneNumbers = telephone.split('\n').filter(line => line.trim() !== '');

	for (let i = 0; i < phoneNumbers.length; i++) {
		let phone = phoneNumbers[i].trim();
		if (!/^1[3-9]\d{9}$/.test(phone)) {
			toastLog('无效号码,跳过: ' + phone);
			continue;
		}


		// 每个号码执行 8 次赠送操作
		for (let j = 0; j < 8; j++) {
			toastLog(`正在处理第 ${i + 1} 个号码: ${phone},第 ${j + 1} 次赠送`);
			//每个新的号码都会点击一次最初的赠送按钮
			let zengsong = className("android.view.View").text("赠送").findOne();
			if (zengsong) {
				click(zengsong.bounds().centerX(), zengsong.bounds().centerY()); // 通过坐标点击
				toastLog("点击赠送")
			}
			sleep(3000);
			// === 此处添加你的具体操作步骤 ===
			// 例如:找到输入框并输入手机号
			var input = className("android.widget.EditText").findOne(5000);
			if (input) {
				input.setText(phone);
			} else {
				toastLog('未找到输入框,跳过本次');
				sleep(3000);
				continue;
			}

			// 点击“赠送”按钮发起赠送
			var btn = className("android.widget.Button").text("赠送").findOne(2000);
			if (btn) {
				btn.click();
				sleep(3000);
			} else {
				toastLog('未找到【赠送】按钮,跳过本次');
			sleep(3000);
				continue;
			}
			// 点击“确定”按钮正式发起赠送
			var btn = className("android.widget.Button").text("确定").findOne(2000);
			if (btn) {
				btn.click();
				sleep(3000);
			} else {
				toastLog('未找到【确定】按钮,跳过本次');
				sleep(3000);
				continue;
			}

			// 判断是否出现“活动参与手机封顶”弹窗
			if (className("android.widget.TextView").textContains("活动参与手机封顶").exists()) {
				toastLog('该号码已达上限,跳过此号码: ' + phone);
				text("取消").findOne(1000).click(); // 点击弹窗中的“确定”
				sleep(3000);
				break; // 跳出内层循环,处理下一个号码
			}
		}
	}
}

}

你是一个编程大师,优化以上代码

HAMI_8721267164 · 3 天前

回答

Hamibot AI
1
· 3 天前
// 文档地址 https://docs.hamibot.com/

// 启用无障碍服务并等待稳定
auto.waitFor();

// 确保屏幕点亮(无需解锁,由用户自行处理锁屏)
if (!device.isScreenOn()) {
    device.wakeUp();
    sleep(2000); // 等待屏幕完全亮起
}

// 如果已在云闪付中,返回至首页
if (packageName("com.unionpay").exists()) {
    for (let i = 0; i < 5; i++) {
        back();
        sleep(800);
    }
    sleep(3000); // 给主页加载留出时间
}

// 启动云闪付
launchApp("云闪付");
toastLog("正在启动云闪付...");
sleep(12000); // 根据设备性能调整,确保主界面加载完成

// 检查是否进入首页(通过关键 ID 判断)
if (id("tv").exists()) {
    toastLog("已进入云闪付首页,开始搜索【开户宝】");

    // 尝试点击搜索框(常见为 id 或 class)
    let searchBox = id("tv").findOne(5000);
    if (!searchBox) {
        toastLog("未找到搜索框,尝试通过 className 查找");
        searchBox = className("android.widget.EditText").findOne(3000);
    }

    if (searchBox) {
        searchBox.click();
        sleep(3000);

        // 输入关键词
        setText("开户宝");
        sleep(4000);

        // 隐藏软键盘以便看到下方内容
        back();
        sleep(2000);

        // 查找“开户宝”文本并点击
        let kaihubaoItem = text("开户宝").findOne(5000);
        if (kaihubaoItem) {
            click(kaihubaoItem.bounds().centerX(), kaihubaoItem.bounds().centerY());
            toastLog("已点击【开户宝】");
            sleep(8000); // 等待页面加载活动列表
        } else {
            toastLog("未找到【开户宝】入口,脚本结束");
            exit();
        }
    } else {
        toastLog("无法定位搜索框,脚本终止");
        exit();
    }
} else {
    toastLog("未检测到云闪付首页,可能启动失败");
    exit();
}

// 查找目标活动:“悦动湖湘 光影未来”
let targetActivity = textContains("悦动湖湘").findOne(8000);
if (!targetActivity) {
    toastLog("未找到目标活动入口,尝试滚动查找");
    // 可尝试简单滑动一次
    swipe(device.width / 2, device.height * 0.7, device.width / 2, device.height * 0.3, 800);
    sleep(3000);
    targetActivity = textContains("悦动湖湘").findOne(5000);
}

if (targetActivity) {
    let center = targetActivity.bounds().centerXY();
    click(center.x, center.y);
    toastLog("已点击活动入口");
    sleep(6000); // 等待活动页面加载
} else {
    toastLog("仍未找到活动入口,脚本退出");
    exit();
}

// 获取环境变量中的手机号
const { telephone } = hamibot.env;
if (!telephone) {
    toastLog("未传入电话号码,请在脚本配置中设置环境变量 'telephone'");
    exit();
}

// 解析多行手机号,过滤空行和非法格式
const phoneNumbers = telephone
    .split('\n')
    .map(line => line.trim())
    .filter(line => /^1[3-9]\d{9}$/.test(line));

if (phoneNumbers.length === 0) {
    toastLog("没有有效的手机号码可处理");
    exit();
}

toastLog(`共加载 ${phoneNumbers.length} 个有效号码`);

// 遍历每个号码
for (let i = 0; i < phoneNumbers.length; i++) {
    const phone = phoneNumbers[i];
    toastLog(`开始处理第 ${i + 1}/${phoneNumbers.length} 号码: ${phone}`);

    // 每个新号码重新触发“赠送”按钮
    let zengsongBtn = className("android.view.View").text("赠送").findOne(5000);
    if (!zengsongBtn) {
        toastLog("未找到初始【赠送】按钮,可能已达上限或页面异常");
        break;
    }

    click(zengsongBtn.bounds().centerX(), zengsongBtn.bounds().centerY());
    sleep
ℹ️ 本回答由 AI 生成,内容仅供参考