九零不老心
发布于 2020-06-15 / 13 阅读 / 0 评论 / 0 点赞

autojs收取蚂蚁森林能量

autojs:一个支持无障碍服务的Android平台上的JavaScript IDE,其发展目标是JsBox和Workflow。


autojs.app版本:
    Version 4.1.1 Alpha2
运行截图:

下面是借鉴前辈脚本的基础上,修改后的自动收取蚂蚁森林能量的脚本:
/* 
支付宝蚂蚁森林收取能量
 */

/* 
设备宽:1080
设备高:2160
手机型号:Redmin5Plus
安卓版本:8.1.0
package_name: "com.eg.android.AlipayGphone"
current_Activity: "com.eg.android.AlipayGphone.AlipayLogin" 
*/

// 设置初始变量
var morningTime = "07:14"//自己运动能量生成时间
var startTime = "07:00"
var endTime = "7:35"
var screen_width = device.width  //设置屏幕的宽度,像素值
var screen_height = device.height //设置屏幕的高度,像素值
var app_name = "支付宝"
var package_name = "com.eg.android.AlipayGphone"
// 开始所有逻辑
mainEntrence()


// 程序主入口
function mainEntrence () {
    // 子线程监听关闭事件
    listen_Event()
    // 前置操作
    if (prepareThings()) {
        // 打开APP
        if (openAPP(app_name, package_name)) {
            // 执行主要任务
            do {
                // 蚂蚁森林
                Antsenlin()
            } while (checkTime())
            closeAPP(package_name)
            // 完成所有任务,退出
            toastLog("完成所有任务,退出脚本")
            sleep(1000)
            exit()
        } else {
            exit()
        }
    } else {
        exit()
    }
}
// 监听音量键,如果点击,则退出脚本
function listen_Event () {
    threads.start(function () {
        //在子线程中调用observeKey()从而使按键事件处理在子线程执行
        events.observeKey()
        events.on("key_down", function (keyCode, events) {
            //音量键关闭脚本
            if (keyCode == keys.volume_down) {
                toastLog("您点击了音量键,脚本自动退出!")
                sleep(1500)
                exit()
            }
        })
    })
}
//获取权限和设置参数
function prepareThings () {
    // 检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行。
    auto.waitFor()
    // 显示设备基础详情
    toastLog("\n设备宽:" + screen_width + "\n" + "设备高:" + screen_height + "\n" + "手机型号:" + device.model + "\n安卓版本:" + device.release)
    sleep(1500)
    setScreenMetrics(screen_width, screen_height)
    // 获取应用的packagename
    var packagename = app.getPackageName(app_name)
    toastLog("\npackage_name:" + packagename)
    sleep(1500)
    //请求截图
    if (requestScreenCapture()) {
        toastLog("必要权限获取成功")
        sleep(1000)
        return true
    } else {
        toastLog("必要权限获取失败,脚本退出")
        sleep(1000)
        return false
    }
}
// 蚂蚁森林操作
function Antsenlin () {
    // 进入蚂蚁森林我的主页
    if (enterMyMainPage()) {
        //进入好友主页,收好友能量
        if (enterOthers()) {
            // 收取能量结束,返回主页面
            toastLog("蚂蚁森林收取能量结束")
            sleep(1000)
            back()
            sleep(500)
            back()
            sleep(500)
            return_to_index()
            return true
        } else {
            back()
            sleep(500)
            return false
        }
    } else {
        return false
    }
}
//从支付宝主页进入蚂蚁森林我的主页
function enterMyMainPage () {
    if (page_load_sleep("支付宝首页", "扫一扫", "卡包")) {
        clickByTextDesc("蚂蚁森林", 0)
        //等待进入自己的主页,5次尝试
        if (page_load_sleep("蚂蚁森林我的主页", "背包", "任务")) {
            //收自己能量
            //clickByTextDesc("克",0)
            for (var row = screen_height * 0.256; row < screen_height * 0.376; row += 80)
                for (var col = screen_width * 0.185; col < screen_width * 0.815; col += 80) {
                    click(col, row)
                }
            toastLog("自己能量收集完成")
            sleep(1000)
            return true
        } else {
            return false
        }
    } else {
        return false
    }

}
//在排行榜页面,循环查找可收集好友
function enterOthers () {
    // 滑动到页面底部
    toastLog("滑动到页面底部")
    sleep(1000)
    swipe(screen_width * 0.5, screen_height * 0.8, screen_width * 0.5, screen_height * 0.1, 500)
    sleep(500)
    swipe(screen_width * 0.5, screen_height * 0.8, screen_width * 0.5, screen_height * 0.1, 500)
    sleep(500)
    if (page_load_sleep("蚂蚁森林我的主页下周排行榜", "背包", "任务")) {
        toastLog("查看蚂蚁森林更多好友")
        sleep(1000)
        clickByTextDesc("查看更多好友", 0)
        if (page_load_sleep("蚂蚁森林周排行榜", "周排行榜", "总排行榜")) {
            if (getother()) {
                toastLog("收取好友能量成功")
                return true
            } else {
                toastLog("收取好友能量失败")
                back()
                sleep(500)
                return false
            }
        } else {
            return false
        }
    } else {
        return false
    }
}
// 收取有能量的好友能量
function getother () {
    sleep(3000)
    var i = 1
    var ePoint = getHasEnergyfriend(1)
    //不断滑动,查找好友
    while (ePoint == null) {
        //如果到了收取自己能量的时间,先收取自己能量
        if (myEnergyTime()) {
            return false
        }
        swipe(screen_width * 0.5, screen_height * 0.7, screen_width * 0.5, screen_height * 0.1, 500)
        sleep(1000)
        ePoint = getHasEnergyfriend(1)
        i++
        //如果连续5次都未检测到可收集好友,无论如何停止查找 
        if (i > 5) {
            toastLog("连续" + i + "次未检测到可收能量的好友")
            sleep(1000)
            return false
        }
    }
    //进入好友页面
    click(ePoint.x, ePoint.y + 20)
    if (page_load_sleep("好友主页", "TA收取你", "你收取TA")) {
        toastLog("进入好友主页成功")
        //clickByTextDesc("克",0)
        for (var row = screen_height * 0.256; row < screen_height * 0.376; row += 80)
            for (var col = screen_width * 0.185; col < screen_width * 0.815; col += 80) {
                click(col, row)
            }
        //等待返回好友排行榜
        back()
        sleep(500)
        //返回排行榜成功,继续
        getother()
    } else {
        return false
    }
    return true
}
// 从排行榜获取可收集好友的点击位置
function getHasEnergyfriend (type) {
    var img = getCaptureImg()
    //getCaptureImg()
    //var img = images.read("/storage/emulated/0/DCIM/Screenshots/2.png")
    var p = null
    if (type == 1) {
        // 区分倒计时和可收取能量的小手
        p = images.findMultiColors(img, "#ffffff", [[0, -35, "#1da06d"], [0, 23, "#1da06d"]], {
            region: [1043, 200, 1, screen_height - 300]
        })
    }
    if (p != null) {
        toastLog("发现有可收取能量的好友")
        return p
    } else {
        toastLog("没有找到可收能量的好友")
        return null
    }
}
// 点击页面指定元素
function clickByTextDesc (energyType, paddingY) {
    var clicked = false
    if (descEndsWith(energyType).exists()) {
        descEndsWith(energyType).find().forEach(function (pos) {
            var posb = pos.bounds()
            if (posb.centerX() < 0 || posb.centerY() - paddingY < 0) {
                return false
            }
            //toastLog(pos.id())
            var str = pos.id()
            if (str != null) {
                if (str.search("search") == -1) {
                    click(posb.centerX(), posb.centerY() - paddingY)
                    //toastLog("get it 1")
                    clicked = true
                }
            } else {
                click(posb.centerX(), posb.centerY() - paddingY)
                //toastLog("get it 2")
                clicked = true
            }
            sleep(100)
        })
    }
    if (textEndsWith(energyType).exists() && clicked == false) {
        textEndsWith(energyType).find().forEach(function (pos) {
            var posb = pos.bounds()
            if (posb.centerX() < 0 || posb.centerY() - paddingY < 0) {
                return false
            }
            //toastLog(pos.id())
            var str = pos.id()
            if (str != null) {
                if (str.search("search") == -1) {
                    click(posb.centerX(), posb.centerY() - paddingY)
                    //toastLog("get it 3") 
                    clicked = true
                }
            } else {
                click(posb.centerX(), posb.centerY() - paddingY)
                //toastLog("get it 4")
                clicked = true
            }
            sleep(100)
        })
    }
    return clicked
}
// 如果当前时间在起始范围内,则一直循环调用,否则只调用一次
function checkTime () {
    var now = new Date()
    var hour = now.getHours()
    var minu = now.getMinutes()
    var time_a = startTime.split(":")
    var time_b = endTime.split(":")
    var timea = 60 * Number(time_a[0]) + Number(time_a[1])
    var timeb = 60 * Number(time_b[0]) + Number(time_b[1])
    var time = 60 * hour + minu
    if (time >= timea && time <= timeb) {
        return true
    } else {
        return false
    }
}
// 判断当前时间是否是自己能量生成时间
function myEnergyTime () {
    var now = new Date()
    var hour = now.getHours()
    var minu = now.getMinutes()
    var mytime = morningTime.split(":")
    if (mytime[0] == hour && (mytime[1] == minu || mytime[1] == minu - 1)) {
        return true
    } else {
        return false
    }
}
// 返回app首页
function return_to_index () {
    var i = 0
    while (!is_require_page("支付宝首页", "扫一扫", "卡包") && i < 5) {
        i++
        sleep(1000)
        toastLog("等待" + i + "秒未找到支付宝首页")
    }
    while (!is_require_page("支付宝首页", "扫一扫", "卡包") && i >= 5 && i < 10) {
        i++
        clickByTextDesc("首页", 0)
        toastLog("尝试进入支付宝首页第" + i - 5 + "次失败,当前功能模块返回false")
        sleep(1000)
    }
    if (!is_require_page("扫一扫", "卡包") && i >= 10) {
        toastLog("进入支付宝首页失败,当前功能模块返回false")
        sleep(1000)
        return false
    }
    return true
}
// 启动app
function openAPP (appname, packagename) {
    toastLog("启动支付宝APP")
    // closeAPP(packagename) // 手机未root,杀死进程权限不够,只能先临时注释掉
    sleep(1000)
    if (launchApp(appname)) {
        toastLog("等待app启动完毕")
        if (page_load_sleep("支付宝首页", "扫一扫", "卡包")) {
            // 查看当前Activity
            var currentAct = currentActivity()
            toastLog("\ncurrent_Activity:" + currentAct)
            sleep(1000)
            return true
        } else {
            return false
        }
    } else {
        return false
    }
}
// 关闭app
function closeAPP (packagename) {
    toastLog("关闭APP进程")
    // var close_result = shell("am force-stop " + packagename, true) // 是否以root身份运行,默认false,需要手机root
    if (back()) { // 手机没有root,上面命令执行失败,提示权限不够,所以只能采用back()方法
        var close_result = "成功"
    } else {
        var close_result = "失败"
    }
    toastLog("关闭APP进程结果:" + close_result)
}
// 每个页面加载等待
function page_load_sleep (page_name, text1, text2) {
    i = 0
    limit = 6
    while (!is_require_page(page_name, text1, text2) && i < limit) {
        i++
        sleep(1000)
        toastLog("等待" + i + "秒未找到 " + page_name + " 页")
    }
    if (!is_require_page(page_name, text1, text2) && i >= limit) {
        toastLog("进入 " + page_name + " 页面失败,返回fase")
        return false
    }
    toastLog("进入 " + page_name + " 页面成功,返回true")
    return true
}
// 判断当前是否为APP指定页
function is_require_page (page_name, text1, text2) {
    var exist_text_one = textEndsWith(text1).exists()
    var exist_text_two = textEndsWith(text2).exists()
    // toastLog("\nexist_text_one:" + exist_text_one + "\nexist_text_two:" + exist_text_two)
    sleep(1500)
    if (exist_text_one && exist_text_two) {
        toastLog("当前是指定页:" + page_name)
        return true
    } else {
        toastLog("当前不是指定页:" + page_name)
        return false
    }
}
// 判断变量是否为空
function is_kong (str) {
    if (str == null || str == "" || str == undefined) {
        return true
    } else {
        return false
    }
}
//获取截图
function getCaptureImg () {
    //captureScreen("/storage/emulated/0/DCIM/Screenshots/1.png")
    //sleep(500)
    var img0 = captureScreen()
    sleep(100)
    if (img0 == null || typeof (img0) == "undifined") {
        toastLog("截图失败,脚本退出")
        exit()
    } else {
        return img0
    }
}