├── AntForest ├── AliPay.js ├── main_UI.js ├── main_fun.js └── util.js ├── README.md └── TaoBaoMiaoBi ├── AliMB.js ├── main_UIMB.js ├── main_funMB.js └── util.js /AntForest/AliPay.js: -------------------------------------------------------------------------------- 1 | // 支付宝工具箱 2 | var AliPay = {}; 3 | var util = require("./util.js"); 4 | // var main = require("./main_UI.js"); 5 | var height = device.height; 6 | var width = device.width; 7 | var count = 0; 8 | var countmax = 100; 9 | 10 | // 收取蚂蚁森林能量 11 | AliPay.fun_ant_main = function fun_ant_main(waterThreshold, waterPlanNum, waterMinUnit) { 12 | toastLog("Build By @zxiaofan,有问题请前往订阅号【zxiaofan】留言"); 13 | toastLog("请为此APP打开以下权限:无障碍服务权限、后台弹出界面"); 14 | auto.waitFor(); 15 | toastLog("打开支付宝"); 16 | setScreenMetrics(width, height); 17 | launch("com.eg.android.AlipayGphone"); 18 | sleep(4000); 19 | // waitForPackage("com.eg.android.AlipayGphone"); 20 | toastLog("进入支付宝首页,准备收取蚂蚁森林能量"); 21 | count = 0; 22 | goto_ant(); 23 | 24 | //注册音量下按下退出脚本监听 25 | util.registEvent(); 26 | while (!在蚂蚁森林任务页面()) { 27 | toastLog("还没进入蚂蚁森林任务页面呢..."); 28 | goto_ant(); 29 | sleep(2000); 30 | } 31 | toast("进入蚂蚁森林任务页面"); 32 | scrollUp(); 33 | scrollUp(); 34 | scrollUp(); 35 | var myEnergy1 = getMyEnergy(); 36 | // 先把自己的能量收了 37 | // 排除区域:250,420,830,1608 38 | 39 | getEnergyByClickAllRegion("me"); 40 | 41 | sleep(1000); 42 | 43 | var myEnergyTemp = getMyEnergy(); 44 | var info1 = "收取自己的能量" + (myEnergyTemp - myEnergy1) + "g"; 45 | toastLog(info1); 46 | // toastLog("[屏幕分辨率]width:" + width + ";height:" + height); 47 | 48 | var jiaoshuiAll = 0; 49 | toastLog("去好友的森林里找能量ing"); 50 | 51 | while (!在好友的蚂蚁森林页面() && !在蚂蚁森林任务页面()) { 52 | toastLog("当前不在自己或者好友的蚂蚁森林页面呢,请尽快切换到蚂蚁森林页面..."); 53 | sleep(2000); 54 | } 55 | 56 | getEnergyByZhaoNengLiang(jiaoshuiAll); 57 | 58 | toastLog("收能量结束"); 59 | toastLog("Build By @zxiaofan,有问题请前往订阅号【zxiaofan】留言"); 60 | back(); 61 | scrollUp(); 62 | scrollUp(); 63 | scrollUp(); 64 | sleep(500); 65 | var myEnergy2 = getMyEnergy(); 66 | back(); 67 | var info1 = "本次共计为好友浇水" + jiaoshuiAll + "g,\n" + ",能量合计新增" + (myEnergy2 - myEnergy1) + "g"; 68 | // dialogs.confirm(info1); 69 | toastLog(info1); 70 | // exit(); 71 | } 72 | 73 | // 收能量-找能量 74 | function getEnergyByZhaoNengLiang(jiaoshuiAll) { 75 | var count2 = 3; 76 | 77 | 78 | setScreenMetrics(width, height); 79 | // 连点2次,避免挂件影响 80 | click(util.getStorage("x_znl"), util.getStorage("y_znl")); 81 | sleep(200); 82 | click(util.getStorage("x_znl"), util.getStorage("y_znl")); 83 | sleep(1500); 84 | 85 | // 返回我的森林 86 | if (className("android.view.View").text("startapp?appId=60000002&url=%2Fwww%2Fhome").exists()) { 87 | sleep(500); 88 | toastLog("森林里除了鸟叫,什么也没有发现"); 89 | sleep(500); 90 | toastLog("找能量暂未发现可收取能量"); 91 | return false; 92 | } 93 | 等待进入好友的蚂蚁森林页面(8000); 94 | 95 | if (在好友的蚂蚁森林页面()) { 96 | 97 | if (++count > countmax) { 98 | toastLog("处理次数超过" + countmax + "次,暂停执行"); 99 | return false; 100 | } 101 | var friendName = "好友"; 102 | var friendSL = textContains("的蚂蚁森林").className("android.widget.TextView").findOnce(); 103 | if (null != friendSL) { 104 | friendName = friendSL.getText(); 105 | if (null != friendName) { 106 | friendName = friendName.replace("的蚂蚁森林", ""); 107 | } 108 | } 109 | toastLog("已进入好友的蚂蚁森林,准备收取能量:" + friendName); 110 | 111 | var 你收取TA1 = getTaTotal(); 112 | getEnergyByClickAllRegion("friend"); 113 | sleep(1000); 114 | var 你收取TA2 = getTaTotal(); 115 | 116 | var getTa = 你收取TA2 - 你收取TA1; 117 | toastLog("本次收取[" + friendName + "]能量:" + getTa + "g"); 118 | 119 | 120 | waterActualNum = waterFun(getTa); 121 | if (waterActualNum > 0) { 122 | toastLog("本次为好友[" + friendName + "]浇水:" + waterActualNum + "g"); 123 | } 124 | 125 | jiaoshuiAll = jiaoshuiAll + waterActualNum; 126 | sleep(1000); 127 | 128 | getEnergyByZhaoNengLiang(jiaoshuiAll); 129 | } else if (!在好友的蚂蚁森林页面() && !在蚂蚁森林任务页面()) { 130 | toastLog("当前不在自己或者好友的蚂蚁森林页面呢,请尽快切换到蚂蚁森林页面..."); 131 | sleep(2000); 132 | var count1 = 3; 133 | while (!在好友的蚂蚁森林页面() && !在蚂蚁森林任务页面() && count1 > 0) { 134 | back(); 135 | sleep(1000); 136 | count1--; 137 | } 138 | if (在好友的蚂蚁森林页面() || 在蚂蚁森林任务页面()) { 139 | getEnergyByZhaoNengLiang(jiaoshuiAll) 140 | } 141 | 142 | } else { 143 | toastLog("[找能量]暂未发现可收取能量"); 144 | return false; 145 | } 146 | } 147 | 148 | // 计算"找能量"坐标 149 | // x: 950 ;1080 150 | // y: 1550 ;2160 151 | function calZNLZB() { 152 | util.getStorage("x_znl"); 153 | util.getStorage("y_znl"); 154 | } 155 | 156 | // 计算"浇水"坐标 157 | // x: 750 ; 158 | // y: 1550 ; 159 | function calJSZB() { 160 | 161 | } 162 | 163 | function getMyEnergy() { 164 | var 我的能量 = 0; 165 | var kj_种树 = className("Button").text("种树").findOnce(); 166 | if (kj_种树 != null) { 167 | 我的能量 = kj_种树.parent().children()[1].children()[0].getText(); 168 | toastLog("我的能量:" + 我的能量); 169 | return 我的能量.trim().replace("g", ""); 170 | } else { 171 | toastLog("当前未在蚂蚁森林首页,无法获取我的能量"); 172 | } 173 | return 0; 174 | } 175 | 176 | function getFromTaNum() { 177 | sleep(500); 178 | var 你收取 = text("你收取TA").findOnce(); 179 | if (null == 你收取) { 180 | return -1; 181 | } 182 | var 你收取TA = 你收取.parent(); 183 | var result; 184 | // log("你收取TA:" + 你收取TA.children()); 185 | 你收取TA.children().forEach(function (child) { 186 | // log(child.className()); 187 | // log(child.text()); 188 | if (child.text().endsWith("g")) { 189 | // log(child.text()); 190 | // log(child.text().trim().replace("g", "")); 191 | result = child.text().trim().replace("g", ""); 192 | // 跳出 forEach循环使用return false,而不是break; 193 | return false; 194 | } 195 | }); 196 | return result; 197 | } 198 | 199 | 200 | function getFromMeNum() { 201 | var TA收取你 = text("TA收取你").findOnce().parent(); 202 | var result; 203 | // log("TA收取你:" + TA收取你.children()); 204 | TA收取你.children().forEach(function (child) { 205 | // log("TA收取你22:"+child.text()); 206 | if (child.text().endsWith("g")) { 207 | // log(child.text()); 208 | result = child.text().trim().replace("g", ""); 209 | // 跳出 forEach循环使用return false,而不是break; 210 | return false; 211 | } 212 | }); 213 | return result; 214 | } 215 | 216 | function getHelpTaNum() { 217 | sleep(500); 218 | var 你给TA助力 = text("你给TA助力").findOnce().parent(); 219 | var result; 220 | // log("你收取TA:" + 你收取TA.children()); 221 | 你给TA助力.children().forEach(function (child) { 222 | // log(child.className()); 223 | // log(child.text()); 224 | if (child.text().endsWith("g")) { 225 | // log(child.text()); 226 | // log(child.text().trim().replace("g", "")); 227 | result = child.text().trim().replace("g", ""); 228 | // 跳出 forEach循环使用return false,而不是break; 229 | return false; 230 | } 231 | }); 232 | return result; 233 | } 234 | 235 | function getHelpMeNum() { 236 | sleep(500); 237 | var TA给你助力 = text("TA给你助力").findOnce().parent(); 238 | var result; 239 | TA给你助力.children().forEach(function (child) { 240 | // log(child.className()); 241 | // log(child.text()); 242 | if (child.text().endsWith("g")) { 243 | // log(child.text()); 244 | // log(child.text().trim().replace("g", "")); 245 | result = child.text().trim().replace("g", ""); 246 | // 跳出 forEach循环使用return false,而不是break; 247 | return false; 248 | } 249 | }); 250 | return result; 251 | } 252 | function getTaTotal() { 253 | var getTa = 0; 254 | try { 255 | getTa = parseInt(getFromTaNum()) + parseInt(getHelpTaNum()); 256 | } catch (error) { 257 | try { 258 | sleep(1000); 259 | getTa = parseInt(getFromTaNum()) + parseInt(getHelpTaNum()); 260 | } catch (error2) { 261 | toastLog("[error]计算收取好友能量数量失败,再次计算"); 262 | } 263 | } 264 | 265 | return getTa; 266 | } 267 | 268 | 269 | // 收能量-覆盖点击区域内所有坐标 270 | // 收自己的能量:xmin=220, ymin=500, xmax=900, ymax=810; 271 | // 收好友的能量:xmin=220, ymin=500, xmax=900, ymax=810; 272 | // type:me、friend; 273 | function getEnergyByClickAllRegion(type) { 274 | toastLog("[start]收取蚂蚁森林能量:" + type); 275 | setScreenMetrics(width, height); 276 | 277 | var xmin = util.getStorage("kj_xmin"); 278 | var ymin = util.getStorage("kj_ymin"); 279 | var xmax = util.getStorage("kj_xmax"); 280 | var ymax = util.getStorage("kj_ymax"); 281 | // 间隔是能量球的半径 282 | for (var x1 = xmin; x1 < xmax; x1 += 100) { 283 | for (var y1 = ymin; y1 < ymax; y1 += 100) { 284 | // console.log("col:"+col+",row:"+row); 285 | click(x1, y1); 286 | sleep(30); 287 | if (!(在好友的蚂蚁森林页面() || 在蚂蚁森林任务页面())) { 288 | sleep(500); 289 | if (!(在好友的蚂蚁森林页面() || 在蚂蚁森林任务页面())) { 290 | toastLog("当前不在自己或者好友的蚂蚁森林,立即返回"); 291 | back(); 292 | sleep(1000); 293 | } 294 | } 295 | } 296 | } 297 | sleep(1000); 298 | toastLog("[end]收取蚂蚁森林能量:" + type); 299 | } 300 | 301 | // waterThreshold 浇水阀值,getNum 收取能量数量,waterPlanNum达到阀值后浇水数量, waterMinUnit浇水最小单位 302 | function waterFun(getNum) { 303 | if (getNum <= 0) { 304 | return 0; 305 | } 306 | var waterMaxCount = parseInt(getNum / util.getStorage("kj_waterThreshold")); 307 | var waterNum = waterMaxCount * util.getStorage("kj_waterPlanNum"); 308 | if (waterMaxCount < 1 || waterNum < util.getStorage("kj_waterPlanNum")) { 309 | // 计划浇水小于waterPlanNum(默认10g,就不浇水了 310 | return 0; 311 | } 312 | 313 | var waterActualNum = 0; 314 | // if (null != selectWater) { 315 | waterActualNum = calAndWater(waterNum, util.getStorage("kj_waterMinUnit")); 316 | // calAndWater(30, 10); 317 | // } 318 | 319 | sleep(800); 320 | return waterActualNum; 321 | } 322 | 323 | // 计算浇水数量并浇水: waterThreshold 浇水阀值,每收取多少g浇水10g; getNum 实际收取能量g数 324 | function calAndWater(waterNum, waterMinUnit) { 325 | var info = "计划浇水" + waterNum + "g,"; 326 | var waterArr = []; 327 | while (waterArr.length < 3 && waterNum >= 1) { 328 | if (waterNum >= 66 && 66 >= waterMinUnit) { 329 | waterNum = waterNum - 66; 330 | waterArr.push(66); 331 | } else if (waterNum >= 33 && 33 >= waterMinUnit) { 332 | waterNum = waterNum - 33; 333 | waterArr.push(33); 334 | } else if (waterNum >= 18 && 18 >= waterMinUnit) { 335 | waterNum = waterNum - 18; 336 | waterArr.push(18); 337 | } else if (waterNum >= 10 && 10 >= waterMinUnit) { 338 | waterNum = waterNum - 10; 339 | waterArr.push(10); 340 | } else { 341 | break; 342 | } 343 | } 344 | // 排序 345 | waterArr.sort(function (a, b) { 346 | return a - b; 347 | }); 348 | toastLog(info + "实际浇水计划:" + waterArr); 349 | var waterActualNum = 0; 350 | setScreenMetrics(width, height); 351 | for (var i = 0; i < waterArr.length; i++) { 352 | // 新式浇水啦 353 | // var 浇水 = className("android.widget.Button").text("浇水").findOnce(); 354 | // click(浇水.bounds().centerX(), 浇水.bounds().centerY()); 355 | click(util.getStorage("x_jiaoshui"), util.getStorage("y_jiaoshui")); 356 | sleep(700); 357 | var selectWater = text("请选择为TA浇水的克数").findOne(3000); 358 | if (null == selectWater) { 359 | toastLog("今日浇水已达上限"); 360 | break; 361 | } 362 | waterNew(waterArr[i]); 363 | waterActualNum += waterArr[i]; 364 | sleep(500); 365 | } 366 | return waterActualNum; 367 | } 368 | function waterNew(param) { 369 | // param:10克,18克,33克,66克,浇水送祝福 370 | sleep(300); 371 | toastLog("即将浇水" + param + "g"); 372 | var 浇水克数 = text(param + "克").className("android.widget.Button").clickable().findOnce(); 373 | sleep(200); 374 | if (浇水克数 == null) { 375 | click(util.getStorage("x_jiaoshui"), util.getStorage("y_jiaoshui")); 376 | } else { 377 | 浇水克数.click(); 378 | } 379 | sleep(600); 380 | var 浇水送祝福 = text("浇水送祝福").className("android.widget.Button").clickable().findOnce(); 381 | if (null != 浇水送祝福) { 382 | 浇水送祝福.click(); 383 | toastLog("浇水送祝福:" + param + "g"); 384 | } 385 | sleep(300); 386 | } 387 | 388 | AliPay.领积分 = function fun_领积分() { 389 | auto.waitFor(); 390 | toastLog("打开支付宝"); 391 | launch("com.eg.android.AlipayGphone"); 392 | sleep(4000); 393 | toastLog("此时需在支付宝首页哦"); 394 | // waitForPackage("com.eg.android.AlipayGphone"); 395 | toastLog("进入支付宝首页,准备领积分"); 396 | while (!(Boolean(在支付宝首页()) || Boolean(在支付宝我的首页()) || Boolean(在支付宝会员首页()))) { 397 | // scrollUp(); 398 | // back(); 399 | // scrollUp(); 400 | toastLog("当前未在支付宝首页呢..."); 401 | sleep(2000); 402 | } 403 | sleep(1000); 404 | toastLog("即将进入【支付宝-我的】主页..."); 405 | if (Boolean(在支付宝首页())) { 406 | scrollUp(); 407 | text("我的").findOnce().parent().click(); 408 | } 409 | 410 | sleep(500); 411 | while (!(Boolean(在支付宝我的首页()) || Boolean(在支付宝会员首页()))) { 412 | scrollUp(); 413 | toastLog("还没进入【支付宝-我的】主页呢..."); 414 | sleep(2000); 415 | } 416 | toastLog("即将进入【支付宝会员】主页..."); 417 | util.swipeUp(); 418 | util.swipeUp(); 419 | sleep(1000); 420 | if (!在支付宝会员首页()) { 421 | // click("支付宝会员"); 422 | setScreenMetrics(width, height); 423 | click(util.getStorage("x_zfbhy"), util.getStorage("y_zfbhy")); 424 | } 425 | sleep(2000); 426 | while (!(Boolean(在支付宝会员首页()))) { 427 | scrollUp(); 428 | toastLog("还没进入【支付宝会员】主页呢..."); 429 | sleep(2000); 430 | } 431 | toastLog("即将领积分..."); 432 | click("领积分"); 433 | sleep(2000); 434 | util.swipeUp(); 435 | util.swipeUp(); 436 | while (textContains("签到").findOne() || textContains("规则").findOne()) { 437 | // scrollUp(); 438 | sleep(500); 439 | scrollUp(); 440 | var re = click("点击领取"); 441 | if (!re) { 442 | break; 443 | } 444 | } 445 | toastLog("领取支付宝积分结束"); 446 | back(); 447 | back(); 448 | back(); 449 | } 450 | 451 | // 进入蚂蚁森林主页 452 | function goto_ant() { 453 | // 支付宝内部功能调用appId 454 | app.startActivity({ 455 | action: "VIEW", 456 | data: "alipays://platformapi/startapp?appId=60000002", 457 | }); 458 | } 459 | 460 | function 在支付宝底部界面() { 461 | if (text("我的").exists() && text("首页").exists()) { 462 | return true; 463 | } else { 464 | return false; 465 | } 466 | } 467 | 468 | function 在支付宝首页() { 469 | if (text("我的").exists() && text("扫一扫").exists()) { 470 | return true; 471 | } else { 472 | return false; 473 | } 474 | } 475 | 476 | function 在支付宝我的首页() { 477 | if (text("我的").exists() && desc("设置").exists()) { 478 | return true; 479 | } else { 480 | return false; 481 | } 482 | } 483 | 484 | function 在支付宝会员首页() { 485 | if (text("会员中心").exists() && text("个人中心").exists()) { 486 | return true; 487 | } else { 488 | return false; 489 | } 490 | } 491 | 492 | function 在蚂蚁森林任务页面() { 493 | if (text("种树").exists()) { 494 | return true; 495 | } else { 496 | return false; 497 | } 498 | } 499 | 500 | function 在好友的蚂蚁森林页面() { 501 | if (textContains("的蚂蚁森林").exists()) { 502 | return true; 503 | } else { 504 | return false; 505 | } 506 | } 507 | 508 | 509 | function 等待进入好友的蚂蚁森林页面(timeout) { 510 | textContains("的蚂蚁森林").findOne(timeout); 511 | // text("浇水").findOne(timeout); 512 | } 513 | 514 | module.exports = AliPay; -------------------------------------------------------------------------------- /AntForest/main_UI.js: -------------------------------------------------------------------------------- 1 | "ui"; 2 | var height = device.height; 3 | var width = device.width; 4 | var version = "202011011500"; 5 | var versionDesc = "11月优化逻辑优化,支持2020年10月版支付宝"; 6 | 7 | var main = {}; 8 | ui.layout( 9 | 10 | 11 | 12 |