使用Auto.js实现蚂蚁森林自动收取能量

在网上看了一些自动收能量的脚本
根据自己的手机型号 华为荣耀9 分辨率为1980*1080
写了一个脚本
使用AutoJs运行
定时每天早上7点开始收能量(再也不用担心我的能量被偷啦 哈哈~)
AutoJS下载地址 http://shouji.baidu.com/software/23334313.html
运行步骤如下:
1.解锁(点亮屏幕,切换到输入密码界面,输入密码)
2.打开支付宝
3.找到蚂蚁森林
4.收取自己的能量
5.偷取他人能量
附上代码如下:

/*
脚本说明:1.蚂蚁森林需在首页的入口处
2.锁屏密码是4位数字
3.手机分辨率是1920*1080
*/
auto();
requestScreenCapture();
//解锁
unlock();
sleep(1000);

//按键监听
threads.start(function () {
    toast("程序可按音量下键停止")
    //启动监听
    events.observeKey();
    //监听音量下键
    events.onKeyDown("volume_down", function (event) {
        toast("脚本终止")
        exit();
    })
})

//解锁
function unlock() {
    if (!device.isScreenOn()) {
        //点亮屏幕
        device.wakeUp();
        sleep(2000);
        swipe(500, 1000, 500, 100, 1000);
        click(100, 150);
        //输入四次 1 (密码为1111)其他密码请自行修改 数字键1的像素坐标为(200,1000)
        //可使用手机开发者选项确定像素坐标
        click(200, 1000);
        sleep(200);
        click(200, 1000);
        sleep(200);
        click(200, 1000);
        sleep(200);
        click(200, 1000);
        sleep(200);
        tLog("解锁成功~");
    }
}

var myEnergeType = ["绿色能量", "线下支付", "行走", "共享单车", "地铁购票", "网络购票", "网购火车票", "生活缴费", "ETC缴费", "电子发票", "绿色办公", "咸鱼交易", "预约挂号"];
var morningTime = "07:02";//自己运动能量生成时间
mainEntrence(); //主函数

//日志输出
function tLog(msg) {
    toast(msg);
    console.log(msg)
}

//获取权限和设置参数
function prepareThings() {
    setScreenMetrics(1080, 1920);
    //请求截图
    if (!requestScreenCapture()) {
        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(3000);
    //进入蚂蚁森林
    swipe(520, 1200, 520, 600, 500);
    sleep(500);
    //swipe(520, 600, 520, 1300, 500);
    while (!textEndsWith("蚂蚁森林").exists() && i <= 5) {
        sleep(1000);
        i++;
    }
    clickByText("蚂蚁森林", true, "请把蚂蚁森林入口添加到主页我的应用");
    sleep(5000)
}

//进入排行榜
function enterRank() {
    sleep(1000);
    swipe(520, 1800, 520, 300, 500);
    sleep(500);
    swipe(520, 1800, 520, 300, 500);
    if (textEndsWith("查看更多好友").exists()) {
        textEndsWith("查看更多好友").findOne().click();
    }
    var i = 0;
    sleep(3000);
    while (!textEndsWith("好友排行榜").exists() && i <= 5) {
        sleep(2000);
        i++;
    }
    if (i >= 5) {
        defaultException();
    }
}

//从排行榜获取可收集好友的点击位置
function getHasEnergyfriend(type) {
    var img = getCaptureImg();
    var p = null;
    if (type == 1) {
        //img 是图片
        //"#30bf6c" 第一个颜色
        //[0, 33, "#30bf6c"] 第二颜色和它的相对坐标
        //[34,45, "#ffffff"] 第三个颜色和他的相对坐标
        //region: [1030, 100, 1, 1700] 第一个颜色的检测区域1030,100为起始坐标,1,1700为区域宽度!
        p = images.findMultiColors(img, "#1da06d", [[59, 0, "#1da06d"], [46, 44, "#ffffff"]], {
            region: [1018, 200, 1, 1700]
        });
    }
    if (p != null) {
        return p;
    }
    else {
        return null;
    }
}

//判断是否好友排行榜是否结束
function isRankEnd() {
    if (textEndsWith("没有更多了").exists()) {
        var b = textEndsWith("没有更多了").findOne();
        tLog("偷能量结束~");
        var bs = b.bounds();
        if (bs.centerY() < 1920) {
            return true;
        }
    }
    return false;
}

//在排行榜页面 循环查找可收集好友
function enterOthers() {
    var i = 1;
    var ePoint = getHasEnergyfriend(1);
    //确保当前操作是在排行榜界面
    while (ePoint == null && textEndsWith("好友排行榜").exists()) {
        //滑动排行榜 root方式的的点击调用 如无root权限,7.0及其以上可采用无障碍模式的相关函数
        swipe(520, 1800, 520, 300, 500);
        sleep(100);
        ePoint = getHasEnergyfriend(1);
        i++;
        //检测是否排行榜结束了
        if (isRankEnd()) {
            return false;
        }
        //如果连续32次都未检测到可收集好友,无论如何停止查找(由于程序控制了在排行榜界面,且判断了结束标记,基本已经不存在这种情况了)
        else if (i > 32) {
            tLog("程序可能出错,连续" + i + "次未检测到可收集好友");
            exit();
        }
    }
    if (ePoint != null) {
        click(ePoint.x, ePoint.y + 20);
        //waitPage(1);  会滞留在该页面 后续操作中断
        for (var row = 440; row < 900; row += 100)
            for (var col = 170; col < 800; col += 100) {
                click(col, row);
                sleep(50);
            }
        //clickByDesc("可收取",80);  并不能收取  原因不明
        //进去收集完后,递归调用enterOthers
        back();
        sleep(2000);
        var j = 0;
        //等待返回好友排行榜
        if (!textEndsWith("好友排行榜").exists() && j <= 5) {
            sleep(2000);
            j++;
        }
        if (j >= 5) {
            defaultException();
        }
        enterOthers();
    }
    else {
        defaultException();
    }
}

//根据描述值 点击(调用该方法时并不能收取能量)
function clickByDesc(energyType, paddingY, noFindExit, exceptionMsg) {
    if (descEndsWith(energyType).exists()) {
        descEndsWith(energyType).find().forEach(function (pos) {
            var posb = pos.bounds();
            click(posb.centerX(), posb.centerY() - paddingY);
            sleep(200);
        });
    }
    else {
        if (noFindExit != null && noFindExit) {
            if (exceptionMsg != null) {
                tLog(exceptionMsg);
                exit();
            }
            else {
                defaultException();
            }
        }
    }
}

//根据text值 点击
function clickByText(energyType, noFindExit, exceptionMsg) {
    if (textEndsWith(energyType).exists()) {
        textEndsWith(energyType).find().forEach(function (pos) {
            var posb = pos.bounds();
            click(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点02分左右的话 等待主页能量出现 每隔一秒检测一次
    while (isMorningTime() && descEndsWith("行走").exists()) {
        if (!checkInMorning) {
            tLog("等待运动能量生成中...");
            checkInMorning = true;
        }
        descEndsWith("行走").find().forEach(function (pos) {
            var posb = pos.bounds();
            click(posb.centerX(), posb.centerY() - 80);
        });
    }
    if (checkInMorning) {
        tLog("运动能量收集完成");
    }
    if (descMatches(energyRegex).exists()) {
        if (!checkInMorning) {
            tLog("防止小树的提示遮挡,等待中");
        }
    }
    //将能量球存在的区域都点一遍,间隔是能量球的半径
    for (var row = 640; row < 900; row += 100)
        for (var col = 140; col < 800; col += 100) {
            click(col, row);
            sleep(50);
        }
    tLog("能量收完,不必担心被偷啦~");
    sleep(100);
}

//结束后返回主页面
function whenComplete() {
    tLog("运行成功");
    back();
    sleep(1500);
    back();
    exit();
}

//根据能量类型数组生成我的能量类型正则查找字符串
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();
    //从主页进入蚂蚁森林
    enterMyMainPage();
    //收集自己的能量
    collectionMyEnergy();
    //进入排行榜
    enterRank();
    //收集好友能量
    enterOthers();
    //结束后返回主页面
    whenComplete();
}

你可能感兴趣的:(FrontEnd)