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 相关文章推荐
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
Mar 20 Javascript
关于js new Date() 出现NaN 的分析
Oct 23 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
May 17 Javascript
javascript事件的绑定基础实例讲解(34)
Feb 14 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
Feb 17 Javascript
js中DOM三级列表(代码分享)
Mar 20 Javascript
理解javascript async的用法
Aug 22 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
Jan 03 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
Feb 11 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
Jan 29 Javascript
原生JS实现微信通讯录
Jun 18 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
Nov 06 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
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
php中的ini配置原理详解
2014/10/14 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
jQuery的each循环用法简单示例
2016/06/12 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
python 有效的括号的实现代码示例
2019/11/11 Python
Python使用Chrome插件实现爬虫过程图解
2020/06/09 Python
python zip()函数的使用示例
2020/09/23 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
新闻专业个人求职信
2013/12/19 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
分析并发编程之LongAdder原理
2021/06/29 Java/Android
SQL中的三种去重方法小结
2021/11/01 SQL Server
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL