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/

你的脚本逻辑基本完整,但存在一些可以优化的点:稳定性、可读性、异常处理、资源释放和性能控制。以下是优化后的代码及说明。


✅ 优化目标:

  1. 避免重复查找元素超时阻塞
  2. 增加空值/异常判断
  3. 减少冗余操作(如多次点击“赠送”按钮)
  4. 使用更稳定的控件定位方式
  5. 合理控制循环节奏,防止误判或封禁风险
  6. 提升日志清晰度

✅ 优化后代码:

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

const { telephone } = hamibot.env;

if (!telephone || typeof telephone !== 'string') {
    toastLog('未获取到电话号码列表');
    hamibot.exit();
}

// 解析号码:按行分割并过滤有效手机号
const phoneNumbers = telephone
    .split('\n')
    .map(line => line.trim())
    .filter(line => /^1[3-9]\d{9}$/.test(line));

if (phoneNumbers.length === 0) {
    toastLog('没有有效的手机号码');
    hamibot.exit();
}

toastLog('共加载 ' + phoneNumbers.length + ' 个号码');

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

    for (let j = 0; j < 8; j++) {
        toastLog(`进行第 ${j + 1}/8 次赠送`);

        // 点击顶部【赠送】入口按钮(只在新号码第一次时点击)
        if (j === 0) {
            let zengsongBtn = className("android.view.View").text("赠送").findOne(3000);
            if (!zengsongBtn) {
                toastLog("未找到【赠送】入口按钮,尝试重新进入...");
                sleep(3000);
                continue;
            }
            click(zengsongBtn.bounds().centerX(), zengsongBtn.bounds().centerY());
            sleep(3500);
        }

        // 填写手机号
        let input = className("android.widget.EditText").findOne(5000);
        if (!input) {
            toastLog("未找到输入框,跳过本次");
            sleep(3000);
            continue;
        }
        input.setText(phone);
        sleep(1000);

        // 点击【赠送】确认按钮
        let confirmBtn = className("android.widget.Button").text("赠送").findOne(2000);
        if (!confirmBtn) {
            toastLog("未找到【赠送】确认按钮");
            back(); // 可能需要退回重试
            sleep(2000);
            continue;
        }
        confirmBtn.click();
        sleep(3000);

        // 点击【确定】发起赠送
        let okBtn = className("android.widget.Button").text("确定").findOne(2000);
        if (!okBtn) {
            toastLog("未找到【确定】按钮");
            back();
            sleep(2000);
            continue;
        }
        okBtn.click();
        sleep(3500);

        // 检查是否已达上限弹窗
        if (className("android.widget.TextView").textContains("活动参与手机封顶").exists()) {
            toastLog("该号码已达上限: " + phone);
            let cancelBtn = text("取消").findOne(1000);
            if (cancelBtn) {
                cancelBtn.click();
            } else {
                back(); // 如果无“取消”,返回
            }
            sleep(3000);
            break; // 跳出内层循环,换下一个号码
        }

        // 额外防封策略:随机延时
        sleep(random(2000, 4000));
    }

    // 每个号码处理完后稍作停顿
    sleep(2000);
}

toastLog("所有号码处理完成!");

✅ 优化说明:

优化项 说明
号码预解析与过滤 提前清洗数据,避免运行中频繁正则匹配或无效操作
首次点击分离逻辑 只有第一个赠送点击“赠送入口”,后续复用界面,提高效率
超时控制 findOne(timeout) 避免无限等待导致卡死
增强健壮性判断 对 `hamibot
ℹ️ 本回答由 AI 生成,内容仅供参考