// 检查是否为空
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);
}
}}
点击“确定”按钮按钮后,还需要点击一次“确定”按钮
点击确定按钮后,如果一个手机号已经赠送了八次,那就会返回"活动参与手机封顶"弹窗
如果正常赠送了,领取成功
第 1 条补充
· 8 天前
// 判断是否出现“活动参与手机封顶”弹窗
if(className("android.widget.TextView").text("UP06035活动参与手机封顶").exists()) {
toastLog('该号码已达上限,跳过此号码: ' + phone);
text("取消").findOne(1000).click(); // 点击弹窗中的“确定”
sleep(1500);
break; // 跳出内层循环,处理下一个号码
}
这段代码未生效没有触发
回答
文档地址 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;
}
问题分析与建议:
text("UP06035活动参与手机封顶")可能不完全匹配- 实际显示文本可能包含换行、空格或动态内容。
- 推荐改用
textContains或textMatches提高容错性:
// 改进写法:模糊匹配关键文字
if (textContains("活动参与手机封顶").exists() || textMatches(/.*手机封顶.*/).exists()) {
toastLog('检测到封顶提示,准备处理');
// 后续点击逻辑同上
}
-
确保 Accessibility 服务能正确读取控件
- 使用 Hamibot 的「布局分析」工具打开当前页面,查看:
- “取消”按钮的真实
text是否为“取消” - 是否被包裹在其他容器中导致延迟加载
className是否准确是android.widget.Button
- “取消”按钮的真实
- 使用 Hamibot 的「布局分析」工具打开当前页面,查看:
-
添加调试信息定位问题
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 生成,内容仅供参考