Auto.js自动收取自己和好友蚂蚁森林能量脚本


Posted in Javascript onJune 28, 2018

用autoJS写的能量收取脚本软件.说一下达到的效果,把蚂蚁森林按钮要设置在常用应用中.先收取自己主页的能量,然后进入排行榜收集好友的能量.中途可以按下音量下键提前结束脚本运行.改改测测基本上现在运行完美的了,充分衡量了网络延迟和程序运行正常的平衡性.并且支持支持运动能量生成时间段执行,等待自己的运动能量生成收集.我是配合tasker设置的定时执行脚本,由Tasker唤醒设备教程链接,调用autojs插件执行任务.总之我觉得要想下载下来直接使用的话可能由于运行环境因素,你可能要调整一下.这个作为参考的价值还是稍微比较好的.

说明:

我的设备是6.0的,因为click及很多函数7.0以上才能用.根据搜索组件,利用UiObject组件的click点击我测试在我这失效,改用了获取到组件位置后,调用Tap(x,y).点击、滑动的处理我用的是root的处理方式,没root自行应该改为无障碍方式应该也可以话.目前只支持分辨率为1080,1920.如果分辨率不一样,可能你还有做分辨率兼容性处理.或者等我后续处理.后边会不定期更新新的功能

var myEnergeType=["线下支付","行走","共享单车","地铁购票","网络购票","网购火车票","生活缴费","ETC缴费","电子发票","绿色办公","咸鱼交易","预约挂号"];
var morningTime="07:10";//自己运动能量生成时间
function tLog(msg) {
  toast(msg);
  console.log(msg)
}
/**
 * 获取权限和设置参数
 */
function prepareThings(){
  setScreenMetrics(1080, 1920);
  //请求截图
  if(!requestScreenCapture()){
    tLog("请求截图失败");
    exit();
  }
}
/**
 * 设置按键监听 当脚本执行时候按音量减 退出脚本
 */
function registEvent() {
  //启用按键监听
  events.observeKey();
  //监听音量上键按下
  events.onKeyDown("volume_down", function(event){
    tLog("脚本手动退出");
    exit();
  });
}
/**
 * 获取截图
 */
function getCaptureImg(){
  var img0 = captureScreen();
  if(img0==null || typeof(img0)=="undifined"){
    tLog("截图失败,退出脚本");
    exit();
  }else{
    return img0;
  }
}
/**
 * 默认程序出错提示操作
 */
function defaultException() {
  tLog("程序当前所处状态不合预期,脚本退出");
  exit();
}
/**
 * 等待加载收集能量页面,采用未找到指定组件阻塞的方式,等待页面加载完成
 */
function waitPage(type){
  // 等待进入自己的能量主页
  if(type==0){
    desc("消息").findOne();
  }
  // 等待进入他人的能量主页
  else if(type==1){
    desc("浇水").findOne();
  }
  //再次容错处理
  sleep(3000);
}
/**
 * 从支付宝主页进入蚂蚁森林我的主页
 */
function enterMyMainPage(){
  launchApp("支付宝");
  tLog("等待支付宝启动");
  var i=0;
  sleep(1000);
  //五次尝试蚂蚁森林入口
  while (!textEndsWith("蚂蚁森林").exists() && i<=5){
    sleep(2000);
    i++;
  }
  clickByText("蚂蚁森林",true,"请把蚂蚁森林入口添加到主页我的应用");
  //等待进入自己的主页
  waitPage(0);
}
/**
 * 进入排行榜
 */
function enterRank(){
  Swipe(520,1860,520,100);
  sleep(2500);
  clickByDesc("查看更多好友",0,true,"程序未找到排行榜入口,脚本退出");
  var i=0;
  //等待排行榜主页出现
  sleep(2000);
  while (!textEndsWith("好友排行榜").exists() && i<=5){
    sleep(2000);
    i++;
  }
  if(i>=5){
    defaultException();
  }
}
/**
 * 从排行榜获取可收集好有的点击位置
 * @returns {*}
 */
function getHasEnergyfriend(type) {
  var img = getCaptureImg();
  var p=null;
  if(type==1){
    //411宽度 #a2cbb4 1032,1820 #30bf6c 1032,1787  -33   #52ca84 1032,1832  12   #ffffff 1032,1835  15
    p = images.findMultiColors(img, "#a2cbb4",[[0, -33, "#30bf6c"], [0,12, "#52ca84"],[0,15, "#ffffff"]], {
      region: [1032, 180, 1, 1700]
    });
  }else if(type==2){
    // 480宽度  基准点1775,832  #30bf6  -2,23 #ffffff  -5,16 #ffffff  0,-12 #30bf6c  0,44  #30bf6c
    p = images.findMultiColors(img, "#30bf6c",[[-2, 23, "#ffffff"], [-5,16, "#ffffff"],[0,-12, "#30bf6c"],[0,44, "#30bf6c"]], {
      region: [1069, 180, 7, 1680]
    });
  }
  if(p!=null){
    return p;
  }else {
    return null;
  }
}
/**
 * 判断是否好有排行榜已经结束
 * @returns {boolean}
 */
function isRankEnd() {
  if(descEndsWith("没有更多了").exists()){
    var b=descEndsWith("没有更多了").findOne();
    var bs=b.bounds();
    if(bs.centerY()<1920){
      return true;
    }
  }
  return false;
}
/**
 * 在排行榜页面,循环查找可收集好友
 * @returns {boolean}
 */
function enterOthers(){
  tLog("开始检查排行榜");
  var i=1;
  var ePoint=getHasEnergyfriend(1);
  //确保当前操作是在排行榜界面
  while(ePoint==null && textEndsWith("好友排行榜").exists()){
    //滑动排行榜 root方式的的点击调用.如无root权限,7.0及其以上可采用无障碍模式的相关函数
    Swipe(520,1800,520,300,1000);
    sleep(3000);
    ePoint=getHasEnergyfriend(1);
    i++;
    //检测是否排行榜结束了
    if(isRankEnd()){
      return false;
    }
    //如果连续32次都未检测到可收集好友,无论如何停止查找(由于程序控制了在排行榜界面,且判断了结束标记,基本已经不存在这种情况了)
    else if(i>32){
      tLog("程序可能出错,连续"+i+"次未检测到可收集好友");
      exit();
    }
  }
  if(ePoint!=null){
    //点击位置相对找图后的修正
    Tap(ePoint.x,ePoint.y+20);
    waitPage(1);
    clickByDesc("可收取",80);
    //进去收集完后,递归调用enterOthers
    back();
    sleep(2000);
    var j=0;
    //等待返回好有排行榜
    if(!textEndsWith("好友排行榜").exists() && j<=5){
      sleep(2000);
      j++;
    }
    if(j>=5){
      defaultException();
    }
    enterOthers();
  }else{
    defaultException();
  }
}
/**
 * 根据描述值 点击
 * @param energyType
 * @param noFindExit
 */
function clickByDesc(energyType,paddingY,noFindExit,exceptionMsg){
  if(descEndsWith(energyType).exists()){
    descEndsWith(energyType).find().forEach(function(pos){
      var posb=pos.bounds();
      Tap(posb.centerX(),posb.centerY()-paddingY);
      sleep(2000);
    });
  }else{
    if(noFindExit!=null && noFindExit){
      if(exceptionMsg !=null){
        tLog(exceptionMsg);
        exit();
      }else{
        defaultException();
      }
    }
  }
}
/**
 * 根据text值 点击
 * @param energyType
 * @param noFindExit
 */
function clickByText(energyType,noFindExit,exceptionMsg){
  if(textEndsWith(energyType).exists()){
    textEndsWith(energyType).find().forEach(function(pos){
      var posb=pos.bounds();
      Tap(posb.centerX(),posb.centerY()-60);
    });
  }else{
    if(noFindExit!=null && noFindExit){
      if(exceptionMsg !=null){
        tLog(exceptionMsg);
        exit();
      }else{
        defaultException();
      }
    }
  }
}
/**
 * 遍历能量类型,收集自己的能量
 */
function collectionMyEnergy(){
  var energyRegex=generateCollectionType();
  var checkInMorning=false;
  //如果是早上7点10分左右的话.等待主页能量出现 每隔一秒检测一次
  while(isMorningTime() && descEndsWith("行走").exists()){
    if (!checkInMorning){
      tLog("等待运动能量生成中...");
      checkInMorning=true;

    }
    descEndsWith("行走").find().forEach(function(pos){
      var posb=pos.bounds();
      Tap(posb.centerX(),posb.centerY()-80);
      sleep(1500);
    });
  }
  if(checkInMorning){
    tLog("运动能量收集完成");
  }
  if(descMatches(energyRegex).exists()){
    if(!checkInMorning){
      tLog("防止小树的提示遮挡,等待中");
      sleep(7000);
    }
    descMatches(energyRegex).find().forEach(function(pos){
      var posb=pos.bounds();
      Tap(posb.centerX(),posb.centerY()-80);
      sleep(2000);
    });
  }
}
/**
 * 结束后返回主页面
 */
function whenComplete() {
  tLog("结束");
  back();
  sleep(1500);
  back();
  exit();
}
/**
 * 根据能量类型数组生成我的能量类型正则查找字符串
 * @returns {string}
 */
function generateCollectionType() {
  var regex="/";
  myEnergeType.forEach(function (t,num) {
    if(num==0){
      regex+="(\\s*"+t+"$)";
    }else{
      regex+="|(\\s*"+t+"$)";
    }
  });
  regex+="/";
  return regex;
}
function isMorningTime() {
  var now =new Date();
  var hour=now.getHours();
  var minu=now.getMinutes();
  var targetTime=morningTime.split(":");
  if(Number(targetTime[0])==hour && Math.abs(Number(targetTime[1])-minu)<=2){
    return true;
  }else{
    return false;
  }
}
//程序主入口
function mainEntrence(){
  //前置操作
  prepareThings();
  //注册音量下按下退出脚本监听
  registEvent();
  //从主页进入蚂蚁森林主页
  enterMyMainPage();
  //收集自己的能量
  collectionMyEnergy();
  //进入排行榜
  enterRank();
  //在排行榜检测是否有好有的能量可以收集
  enterOthers();
  //结束后返回主页面
  whenComplete();
}
mainEntrence();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 强制设为首页的代码
Jan 31 Javascript
JavaScript 学习小结(适合新手参考)
Jul 30 Javascript
学习ExtJS Window常用方法
Oct 07 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
Dec 28 Javascript
深入理解JQuery keyUp和keyDown的区别
Dec 12 Javascript
js简单倒计时实现代码
Apr 30 Javascript
AngularJS服务service用法总结
Dec 13 Javascript
@angular前端项目代码优化之构建Api Tree的方法
Dec 24 Javascript
扫微信小程序码实现网站登陆实现解析
Aug 20 Javascript
浅谈vue 锚点指令v-anchor的使用
Nov 13 Javascript
vue使用swiper实现左右滑动切换图片
Oct 16 Javascript
原生JavaScript实现简单五子棋游戏
Jun 28 Javascript
使用vue-router完成简单导航功能【推荐】
Jun 28 #Javascript
vue如何引入sass全局变量
Jun 28 #Javascript
小程序实现带年月选取效果的日历
Jun 27 #Javascript
浅谈Angular6的服务和依赖注入
Jun 27 #Javascript
JS实现获取进今年第几天是周几的方法分析
Jun 27 #Javascript
vue+springmvc导出excel数据的实现代码
Jun 27 #Javascript
微信小程序中使用ECharts 异步加载数据的方法
Jun 27 #Javascript
You might like
Syphon 使用方法
2021/03/03 冲泡冲煮
php继承中方法重载(覆盖)的应用场合
2015/02/09 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
PHP-FPM的配置与优化讲解
2019/03/15 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
PHP时间类完整代码实例
2021/02/26 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
jquery中邮箱地址 URL网站地址正则验证实例代码
2013/09/15 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
2019/08/26 Javascript
全面了解Python环境配置及项目建立
2016/06/30 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python查看微信撤回消息代码
2018/06/07 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
Django缓存系统实现过程解析
2019/08/02 Python
python中random模块详解
2021/03/01 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
办公室副主任岗位职责
2013/11/25 职场文书
生产车间班组长岗位职责
2014/01/06 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
幼儿园安全责任书
2014/04/14 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
关于长城的导游词
2015/01/30 职场文书
《司马光》教学反思
2016/02/22 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
Python之matplotlib绘制饼图
2022/04/13 Python
Java 多线程协作作业之信号同步
2022/05/11 Java/Android