// 检查是否为空
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} 次赠送`);

        // === 此处添加你的具体操作步骤 ===
        // 例如:找到输入框并输入手机号
        var input = className("android.widget.EditText").findOne(5000);
        if (input) {
            input.setText(phone);
        } else {
            toastLog('未找到输入框,跳过本次');
            sleep(2000);
            continue;
        }

        // 模拟点击“赠送”按钮(根据实际控件调整)
        var btn = className("android.widget.Button").text("确定").findOne(2000);
        if (btn) {
            btn.click();
        }

        // 等待操作完成(可根据实际情况调整时间或加等待条件)
        sleep(3000);

        // 如果有“确认”、“返回”等弹窗,可在此处理
        // 例如自动点确定
         text("活动参与手机封顶").findOne(1000).click();
        // sleep(2000);
    }
}}

点击“确定”按钮按钮后,还需要点击一次“确定”按钮
点击确定按钮后,如果一个手机号已经赠送了八次,那就会返回"活动参与手机封顶"弹窗
如果正常赠送了,领取成功

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

这段代码未生效没有触发

回答

Hamibot AI
1
· 8 天前

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

// 检查是否为空
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;
        }

        let successCount = 0;

        // 每个号码执行最多 8 次赠送操作
        while (successCount < 8) {
            toastLog(`正在处理第 ${i + 1} 个号码: ${phone},第 ${successCount + 1} 次赠送`);

            // 找到输入框并输入手机号
            var input = className("android.widget.EditText").findOne(5000);
            if (input) {
                input.setText(phone);
            } else {
                toastLog('未找到输入框,跳过本次');
                sleep(2000);
                break; // 输入框都找不到,无需继续尝试此号码
            }

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

            // 等待弹窗出现(成功或封顶)
            sleep(3000);

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

            // 判断是否出现“领取成功”或其他成功提示
            if (text("领取成功").exists() || textContains("成功").exists()) {
                toastLog('赠送成功: ' + phone);
                successCount++;
                // 点击成功弹窗的“确定”按钮
                text("确定").findOne(1000).click();
                sleep(1500);
            } else {
                toastLog('未知结果,可能失败或页面无响应: ' + phone);
                // 尝试点击任意“确定”关闭弹窗,防止阻塞
                text("确定").findOne(1000)?.click();
                sleep(1500);
            }

            // 防止操作过快被限制
            sleep(2000);
        }

        if (successCount === 8) {
            toastLog(`已完成8次赠送: ${phone}`);
        }
    }
}

说明:

  • 双重“确定”按钮处理:脚本会先点击表单的“确定”按钮,再根据弹窗内容点击对应的“确定”按钮关闭提示。
  • 状态判断优先使用 text().exists():避免因控件未加载完成导致的空指针问题。
  • 容错机制:加入超时等待、条件判断和异常跳过,提升脚本稳定性。
  • 防重复赠送:通过正则校验手机号格式,并在达到上限时及时跳出。

建议在真实设备上先小范围测试,确认控件文本与逻辑一致后再批量运行。


补充回答 1

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

// 判断是否出现“活动参与手机封顶”弹窗
if (className("android.widget.TextView").text("UP06035活动参与手机封顶").exists()) {
    toastLog('检测到封顶弹窗(通过 text 精确匹配): ' + phone);
    if (text("取消").findOne(1000)) {
        text("取消").click();
        toastLog('已点击【取消】按钮');
    } else {
        toastLog('未找到【取消】按钮,尝试控件查找');
        // 使用更通用的方式点击“取消”按钮
        var cancelBtn = className("android.widget.Button").text("取消").findOnce();
        if (cancelBtn) {
            cancelBtn.click();
            toastLog('通过 class 和 text 找到并点击【取消】');
        } else {
            // 万一首尾有空格或不可见字符
            var cancelAny = textMatches(/取消/).findOnce() || className("android.widget.Button").textMatches(/.*取消.*/).findOnce();
            if (cancelAny) {
                cancelAny.click();
                toastLog('通过正则匹配点击【取消】');
            } else {
                toastLog('无法找到【取消】按钮,请检查界面布局');
                // 可选:点击屏幕坐标作为最后手段(不推荐长期使用)
                // click(x, y);
            }
        }
    }
    sleep(1500);
    break;
}

问题分析与建议:

  1. text("UP06035活动参与手机封顶") 可能不完全匹配
    • 实际显示文本可能包含换行、空格或动态内容。
    • 推荐改用 textContainstextMatches 提高容错性:
// 改进写法:模糊匹配关键文字
if (textContains("活动参与手机封顶").exists() || textMatches(/.*手机封顶.*/).exists()) {
    toastLog('检测到封顶提示,准备处理');
    // 后续点击逻辑同上
}
  1. 确保 Accessibility 服务能正确读取控件

    • 使用 Hamibot 的「布局分析」工具打开当前页面,查看:
      • “取消”按钮的真实 text 是否为“取消”
      • 是否被包裹在其他容器中导致延迟加载
      • className 是否准确是 android.widget.Button
  2. 添加调试信息定位问题

toastLog('开始检测弹窗...');
sleep(1000);
if (textContains("封顶").exists()) {
    toastLog('✅ 检测到【封顶】关键词');
} else {
    toastLog('❌ 未检测到任何相关提示');
    // 输出当前界面所有文本用于排查
    var allTexts = className("android.widget.TextView").filter(function(w) {
        return w.text().length > 0;
    }).map(w => w.text());
    console.log("当前可见文本:", allTexts);
}

推荐最终判断条件:

if (
    textContains("活动参与手机封顶").exists() ||
    textContains("UP06035").exists()
) {
    // 处理弹窗
}

这样可以避免因完整文本不一致导致判断失效。建议结合「布局分析」功能确认实际控件属性后再调整选择器。

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