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; // 跳出内层循环,处理下一个号码
}
}
}
}
优化这串代码
回答
// 文档地址 https://docs.hamibot.com/
你的脚本逻辑基本完整,但存在一些可以优化的点:稳定性、可读性、异常处理、资源释放和性能控制。以下是优化后的代码及说明。
✅ 优化目标:
- 避免重复查找元素超时阻塞
- 增加空值/异常判断
- 减少冗余操作(如多次点击“赠送”按钮)
- 使用更稳定的控件定位方式
- 合理控制循环节奏,防止误判或封禁风险
- 提升日志清晰度
✅ 优化后代码:
// 文档地址 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 生成,内容仅供参考