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 相关文章推荐
让插入到 innerHTML 中的 script 跑起来的实现代码
Jul 01 Javascript
javascript Math.random()随机数函数
Nov 04 Javascript
Javascript JSQL,SQL无处不在,
May 05 Javascript
微信JS接口汇总及使用详解
Jan 09 Javascript
Javascript实现颜色rgb与16进制转换的方法
Apr 18 Javascript
JavaScript数据库TaffyDB用法实例分析
Jul 27 Javascript
JS封装的选项卡TAB切换效果示例
Sep 20 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
Nov 10 Javascript
jQuery Tree Multiselect使用详解
May 02 jQuery
使用vue-resource进行数据交互的实例
Sep 02 Javascript
微信小程序button组件使用详解
Jan 31 Javascript
为什么推荐使用JSX开发Vue3
Dec 28 Vue.js
使用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 session 预定义数组
2009/03/16 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
javascript 多浏览器 事件大全
2010/03/23 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
javascript中length属性的探索
2011/07/31 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
基于JS实现PHP的sprintf函数实例
2015/11/14 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
Python基础教程之异常详解
2019/01/10 Python
python 实现波浪滤镜特效
2020/12/02 Python
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
咖啡店自主创业商业计划书
2014/01/22 职场文书
新教师培训方案
2014/06/08 职场文书
艾滋病宣传标语
2014/06/25 职场文书
代办委托书怎么写
2014/08/01 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
python编写函数注意事项总结
2021/03/29 Python
canvas绘制折线路径动画实现
2021/05/12 Javascript
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python