// 等待无障碍服务稳定[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; // 跳出内层循环,处理下一个号码
}
}
}
}
}
你是一个编程大师,优化以上代码
回答
// 文档地址 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