|
1 |
| -// 检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行。 |
| 1 | +// 等待无障碍服务启动 |
2 | 2 | auto.waitFor();
|
3 |
| -//打开猫眼app |
| 3 | +// 打开猫眼 App |
4 | 4 | app.launchApp("猫眼");
|
5 | 5 | openConsole();
|
6 |
| -console.setTitle("猫眼 go!", "#ff11ee00", 30); |
| 6 | +console.setTitle("猫眼抢票助手", "#ff11ee00", 30); |
7 | 7 |
|
8 |
| -//确认选票坐标,建议配置(不配置时仍会寻找“确认”按钮进行点击,但可能会出现点击失败的情况) |
| 8 | +// 确认选票的绝对坐标,具体值需调整 |
9 | 9 | const ConfirmX = 878;
|
10 | 10 | const ConfirmY = 2263;
|
11 | 11 |
|
12 |
| -//是否在测试调试 |
13 |
| -var isDebug = false; |
14 |
| -//调试模式下的模拟票档自动选择的点击坐标 |
| 12 | +// 是否为调试模式 |
| 13 | +const isDebug = false; |
| 14 | +// 调试模式下模拟票档选择的点击坐标 |
15 | 15 | const debugTicketClickX = 207;
|
16 | 16 | const debugTicketClickY = 1170;
|
17 | 17 |
|
18 | 18 | main();
|
19 | 19 |
|
20 | 20 | function main() {
|
21 |
| - console.log("开始猫眼抢票!"); |
22 |
| - var preBook = text("已 预 约").findOne(2000) |
23 |
| - var preBook2 = className("android.widget.TextView").text("已填写").findOne(2000) |
24 |
| - var isPreBook = preBook2 != null || preBook != null; |
25 |
| - console.log("界面是否已预约:" + isPreBook); |
26 |
| - if (!isPreBook && !isDebug) { |
27 |
| - console.log("无预约信息,请提前填写抢票信息!(若已经开票,请到票档界面使用MoYanMonitor.js)"); |
28 |
| - return; |
29 |
| - } |
| 21 | + console.log("开始猫眼抢票流程!"); |
| 22 | + |
| 23 | + // 检测是否有“已预约”状态 |
| 24 | + var preBook = text("已 预 约").findOne(2000); |
| 25 | + var preBook2 = className("android.widget.TextView").text("已填写").findOne(2000); |
| 26 | + var isPreBook = preBook2 != null || preBook != null; |
| 27 | + console.log("界面是否已预约:" + isPreBook); |
| 28 | + |
| 29 | + if (!isPreBook && !isDebug) { |
| 30 | + console.log("无预约信息,请提前填写抢票信息!"); |
| 31 | + return; |
| 32 | + } |
30 | 33 |
|
31 |
| - //出现刷新按钮时点击刷新 |
32 |
| - threads.start(function () { |
33 |
| - log('刷新按钮自动点击线程已启动') |
34 |
| - while(true){ |
35 |
| - textContains("刷新").waitFor() |
36 |
| - textContains("刷新").findOne().click() |
37 |
| - log("点击刷新...") |
38 |
| - //避免点击过快 |
39 |
| - sleep(100) |
40 |
| - } |
41 |
| - }); |
| 34 | + console.log("等待开抢..."); |
| 35 | + while (true) { |
| 36 | + // 检测“立即预订”、“立即购票”、“特惠购票”按钮 |
| 37 | + var but1 = classNameStartsWith('android.widget.').text("立即预订").exists(); |
| 38 | + var but2 = classNameStartsWith('android.widget.').text("立即购票").exists(); |
| 39 | + var but3 = classNameStartsWith('android.widget.').text("特惠购票").exists(); |
42 | 40 |
|
43 |
| - console.log("等待开抢..."); |
44 |
| - while (true) { |
45 |
| - var but1 = classNameStartsWith('android.widget.').text("立即预订").exists(); |
46 |
| - var but2 = classNameStartsWith('android.widget.').text("立即购票").exists(); |
47 |
| - var but3 = classNameStartsWith('android.widget.').text("特惠购票").exists(); |
48 |
| - //var but4= classNameStartsWith('android.widget.').text("缺货登记").exists(); |
49 |
| - var result = but1 || but2 || but3; |
50 |
| - if (result) { |
51 |
| - var s; |
52 |
| - if (but1) { |
53 |
| - var s = classNameStartsWith('android.widget.').text("立即预订").findOne().click(); |
54 |
| - } else if (but2) { |
55 |
| - var s = classNameStartsWith('android.widget.').text("立即购票").findOne().click(); |
56 |
| - } else if (but3) { |
57 |
| - var s = classNameStartsWith('android.widget.').text("特惠购票").findOne().click(); |
58 |
| - } |
59 |
| - break; |
60 |
| - } |
| 41 | + if (but1 || but2 || but3) { |
| 42 | + if (but1) { |
| 43 | + classNameStartsWith('android.widget.').text("立即预订").findOne().click(); |
| 44 | + } else if (but2) { |
| 45 | + classNameStartsWith('android.widget.').text("立即购票").findOne().click(); |
| 46 | + } else if (but3) { |
| 47 | + classNameStartsWith('android.widget.').text("特惠购票").findOne().click(); |
| 48 | + } |
| 49 | + break; |
61 | 50 | }
|
62 |
| - console.log("①准备确认购票"); |
| 51 | + } |
| 52 | + console.log("①准备确认购票"); |
63 | 53 |
|
64 |
| - //猛点,一直点到出现支付按钮为止 |
65 |
| - for (let cnt = 0; cnt >= 0; cnt++) { |
66 |
| - if (isDebug) { |
67 |
| - //调试模式,模拟选择票档,模拟已预约后自动选择票档 |
68 |
| - click(debugTicketClickX, debugTicketClickY); |
69 |
| - } |
| 54 | + // 开始支付流程 |
| 55 | + processPayment(); |
| 56 | + console.log("抢票流程结束"); |
| 57 | +} |
70 | 58 |
|
71 |
| - //绝对坐标点击 |
72 |
| - click(ConfirmX, ConfirmY); |
73 |
| - //文字查找按钮点击,避免未正确配置坐标导致的点击失败 |
74 |
| - if(text("确认").exists()){ |
75 |
| - text("确认").click(); |
76 |
| - } |
77 |
| - sleep(50); |
78 |
| - if (className("android.widget.Button").exists()) { |
79 |
| - break; |
80 |
| - } |
81 |
| - if (cnt % 20 == 0) { |
82 |
| - log("已点击确认次数:" + cnt); |
83 |
| - } |
| 59 | +// 处理支付流程,包括检测弹框和点击支付按钮 |
| 60 | +function processPayment() { |
| 61 | + let waitTime = 200; // 初始等待时间 200 毫秒 |
| 62 | + while (true) { |
| 63 | + // 检测并处理弹框 |
| 64 | + if (textContains("前方拥堵").exists() && text("刷新").exists()) { |
| 65 | + console.log("检测到‘前方拥堵’弹框,点击‘刷新’按钮"); |
| 66 | + let refreshButton = text("刷新").findOne(1000); // 等待刷新按钮出现 |
| 67 | + if (refreshButton) { |
| 68 | + refreshButton.click(); |
| 69 | + console.log("已点击‘刷新’按钮"); |
| 70 | + waitTime = 200; // 点击后恢复快速检测 |
| 71 | + sleep(200); |
| 72 | + continue; // 继续支付流程 |
| 73 | + } |
84 | 74 | }
|
85 |
| - console.log("②准备确认支付"); |
86 | 75 |
|
87 |
| - if (!isDebug) { |
88 |
| - //调试模式时不点击支付按钮 |
89 |
| - for (let cnt = 0; className("android.widget.Button").exists(); cnt++) { |
90 |
| - //直接猛点就完事了 |
91 |
| - var c = className("android.widget.Button").findOne().click(); |
92 |
| - sleep(50); |
93 |
| - if (cnt % 20 == 0) { |
94 |
| - log("已点击支付次数:" + cnt); |
95 |
| - } |
96 |
| - } |
97 |
| - }else{ |
98 |
| - console.log("调试模式,不点击支付按钮"); |
| 76 | + // 检测支付按钮 |
| 77 | + if (textContains("立即支付").exists() || className("android.widget.Button").text("支付").exists()) { |
| 78 | + console.log("检测到支付按钮,点击支付"); |
| 79 | + let payButton = className("android.widget.Button").text("支付").findOne(1000); // 等待支付按钮出现 |
| 80 | + if (payButton) { |
| 81 | + payButton.click(); |
| 82 | + console.log("已点击支付按钮"); |
| 83 | + waitTime = 200; // 点击后恢复快速检测 |
| 84 | + sleep(200); |
| 85 | + continue; // 继续支付流程 |
| 86 | + } |
99 | 87 | }
|
100 | 88 |
|
101 |
| - console.log("结束") |
| 89 | + // 检测确认按钮 |
| 90 | + if (text("确认").exists()) { |
| 91 | + console.log("检测到确认按钮,点击确认"); |
| 92 | + let confirmButton = text("确认").findOne(1000); // 等待确认按钮出现 |
| 93 | + if (confirmButton) { |
| 94 | + confirmButton.click(); |
| 95 | + console.log("已点击确认按钮"); |
| 96 | + waitTime = 200; // 点击后恢复快速检测 |
| 97 | + sleep(200); |
| 98 | + continue; // 继续支付流程 |
| 99 | + } |
| 100 | + } |
102 | 101 |
|
| 102 | + // 如果没有检测到目标,逐步增加等待时间 |
| 103 | + console.log("未检测到目标控件,延长检测间隔:" + waitTime + " 毫秒"); |
| 104 | + sleep(waitTime); |
| 105 | + waitTime = Math.min(waitTime + 100, 500); // 最大延长到 500 毫秒 |
| 106 | + } |
103 | 107 | }
|
0 commit comments