autojs脚本-支付宝蚂蚁森林能量收集源码免费下载

/**
 * 作者: 日涨半斤的胖子
 * 时间: 2018-01-02
 * 手机: huawei P10 Plus
 * 系统: Android 7.0 EMUI 5.1
 * 支付宝: 10.1.52 // 支付宝版本不一样很可能发生异常哦!
 * 无障碍模式: 打开
 * 截屏权限: 打开
 * Auto.js: Version 4.1.0 Alpha5
 * VSCode: 1.30.1
 * 本软件版本: v1.0.0
 * 备注: 本软件不得用于商业用途,仅做学习交流
 */
 //此代码由飞云脚本圈整理提供(www.feiyunjs.com)
var RET_SUCCES = 0;
var RET_FAILED = -1;
var RET_ERR_AUTO_FAIED = -2;
var RET_ERR_GET_SCREENSHOT_PRI_FAILED = -3;
var RET_ERR_INVALID_TIME_INTERVAL = -4;
var RET_ERR_INVALID_RETRY_TIMES = -5;
var RET_ERR_ENTER_FOREST_FAILED = -6;
var ERR_RET_GET_CAPTURE_SCREEN_FAILED = -7;

var RET_ERR_INVALID_ENERGY_NUM = -10;
var RET_ERR_OVER_MAX_COLLECT_TIMES = -11;
var RET_ERR_NOT_FIND_LOOPUP_MORE_FRIEND = -12;
var RET_ERR_ENTER_FRIEND_RANKING_LIST_FAILED = -13;

var RET_ERR_INVALID_MAX_FRIEND_NUM = -30;
var RET_ERR_NOT_FIND_RANK_LIST_MORE_IN_FRIEND_RANKING_LIST = -31; 
var RET_ERR_OVER_MAX_LOOKUP_MORE_CLICK_TIMES = -32;

var debug_flag = 1;

/* (取消)多行注释 Alt + Shitf + A */
// 单行注释 Ctrl + / 或者 Ctrl + k + c
// 取消单行注释 Ctrl + k + u

/* 可变参数不知道怎么写的,稍后补充 */
function DUMP_OUT_ERR (format)
{
    sleep(100);
    console.error(format);
}
function DUMP_OUT_VERBOSE (format)
{
    sleep(100);
    console.verbose(format);
}
function DUMP_OUT_WARNING (format)
{
    sleep(100);
    console.warn(format);
}

function DUMP_OUT_DEBUG (format)
{
    if (debug_flag)
    {
        sleep(100);
        console.log(format);
    }
}


function anti_forest_err_return(err)
{
    switch(err)
    {
        case RET_SUCCES:
            return RET_SUCCES;
        case RET_FAILED:
            DUMP_OUT_ERR("返回失败!");
            break;
        case RET_ERR_AUTO_FAIED:
            DUMP_OUT_ERR("\"无障碍服务\"开启失败!");
            break;
        case RET_ERR_GET_SCREENSHOT_PRI_FAILED:
            DUMP_OUT_ERR("请求截图失败");
            break;
        case RET_ERR_INVALID_TIME_INTERVAL:
            DUMP_OUT_ERR("Wait for anti forest open retry time interval set error!");
            break;
        case RET_ERR_INVALID_RETRY_TIMES:
            DUMP_OUT_ERR("Wait for anti forest open retry times set error!");
            break;
        case RET_ERR_ENTER_FOREST_FAILED:
            DUMP_OUT_ERR("\"蚂蚁森林\"打开失败!");
            break;
        case ERR_RET_GET_CAPTURE_SCREEN_FAILED:
            DUMP_OUT_ERR("\"截屏\"获取失败!");
            break;
        case RET_ERR_OVER_MAX_COLLECT_TIMES:
            DUMP_OUT_ERR("收集能量次数超过上限");
            break;
        case RET_ERR_NOT_FIND_LOOPUP_MORE_FRIEND:
            DUMP_OUT_ERR("\"查看更多好友\"未找到!");
            break;
        case RET_ERR_ENTER_FRIEND_RANKING_LIST_FAILED:
            DUMP_OUT_ERR("\"好友排行榜\"进入失败!");
            break;
        case RET_ERR_INVALID_MAX_FRIEND_NUM:
            DUMP_OUT_ERR("\"最大好友数\"输入错误!");
            break;
        case RET_ERR_NOT_FIND_RANK_LIST_MORE_IN_FRIEND_RANKING_LIST:
            DUMP_OUT_ERR("\"好友排行榜\"中\"查看更多\"不存在!");
            break;
        case RET_ERR_OVER_MAX_LOOKUP_MORE_CLICK_TIMES:
            DUMP_OUT_ERR("\"好友排行榜\"下拉次数超过上限!");
            break;
        default:
            err_str = "Unknown error: " + err;
            DUMP_OUT_ERR(err_str);
            break;
    }
    return err;
}

function debug_test(flag)
{
    if (flag)
    {
        err_str = "Test True: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + flag;
        DUMP_OUT_ERR(err_str);
    }
    else
    {
        err_str = "Test False: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + flag;
        DUMP_OUT_ERR(err_str);
    }
}

// 随机点击
function random_click(rect)
{
    var debug_str = null;
    var width = rect.width();
    var height = rect.height();

    var x = rect.left;
    var y = rect.top;
    var press_time = random(50,300);
    if (width > 20)
    {
        x += random(width / 4, width * 3 / 4);
    }
    else if (width > 10)
    {
        x += random(5, width - 1);
    }
    else
    {
        x += random(1, width);
    }

    if (height > 20)
    {
        y += random(height / 4, height * 3 / 4);
    }
    else if (height > 10)
    {
        y += random(5, height - 1);
    }
    else
    {
        y += random(1, height);
    }

    press(x, y, press_time);

    debug_str = "click (" + x + ", " + y + ") " + press_time + "ms";
    debug_str += " In Rect(" + rect.left + ", " + rect.top + ", " 
                            + rect.right + ", " + rect.bottom + ")";
    DUMP_OUT_DEBUG(debug_str)
}

function go_back()
{
    var retry_count = 0;
    var back_view = className("android.widget.TextView").desc("返回").findOne(1000);

    while (!back_view)
    {
        back_view = className("android.widget.TextView").desc("返回").findOne(1000);
        retry_count++;

        if (5 < retry_count)
        {
            break;
        }
    }

    if (back_view)
    {
        back_view.click();
    }
    else
    {
        DUMP_OUT_ERR("Not find back!!!");
    }
}

//dialogs.info("请开启\"无障碍服务\"");
function accessibility_services ()
{
    /* 检测“无障碍服务”是否开启 */
    try {
        auto(); // 如果无障碍服务未启动会停止脚本
        // auto.waitFor(); // 在无障碍服务启动后继续运行
        // auto.setMode("fast"); // 启用控件缓存,从而选择器获取屏幕控件更快
    } catch (error) {
        return RET_ERR_AUTO_FAIED;
    }

    return RET_SUCCES;
}

/**
 * 获取截屏权限
 */
function get_screenshot_privileges()
{
    if(!requestScreenCapture()){
        return RET_ERR_GET_SCREENSHOT_PRI_FAILED;
    }

    return RET_SUCCES;
}

/**
 * 获取截屏
 */
function getCaptureImg ()
{
    var img0 = captureScreen();

    if(!img0 || typeof(img0) == "undifined")
    {
        return ERR_RET_GET_CAPTURE_SCREEN_FAILED;
    }
    else
    {
        return img0;
    }
}

/* 进入"蚂蚁森林" */
function ant_forest_enter(time_interval, retry_times)
{
    var enter_flag = 1; // 0: success 1:fail
    var index = 0;
    
    /*
     * time_interval: 
     * retry_times: 尝试等待"蚂蚁森林"的打开最大次数
     * return: 0 成功
     *         1 失败
     */
    if (1000 > time_interval || time_interval > 5000)
    {
        return RET_ERR_INVALID_TIME_INTERVAL;
    }

    if (1 > retry_times || 20 < retry_times)
    {
        return RET_ERR_INVALID_RETRY_TIMES;
    }

    for (index = 0; index <= retry_times; index++)
    {

        /* 通过下面三个"控件"来判断成功进入了蚂蚁森林 */
        var close_exist = className("android.widget.ImageView").desc("关闭").exists();
        var stock_tree_exist = className("android.widget.Button").desc("种树").exists();
        var mytree_exist = className("android.widget.Button").desc("我的大树养成记录").exists();
        if(close_exist 
            && stock_tree_exist 
            && mytree_exist)
        {
            enter_flag = 0;
            break;
        }
        else
        {
            if (index)
            {
                debug_str = "Retry enter into ant forest: " + index  + " times.\n    close: " + close_exist 
                    + ", stock_tree: " + stock_tree_exist + " mytree: " + mytree_exist;
                DUMP_OUT_DEBUG(debug_str);
                // DUMP_OUT_DEBUG("Retry enter into ant forest: %d times.\n    close:%d, stock_tree:%d, mytree:%d", 
                //     index, close_exist, stock_tree_exist, mytree_exist);

            }
        }

        if (0 == index % 5)
        //if (0)
        {
            /* 如何获取data(支付宝客户端的标准scheme)(简而言之:百度)
            * http://myjsapi.alipay.com/jsapi/h5app-lifecycle.html
            * https://www.jianshu.com/p/5ea0b9d84caa
            * (百度)获取得到蚂蚁森林的scheme("URL"): alipay://platformapi/startapp?appId=60000002
            * packageName:通过Auto.js的"布局分析"可以获得
            */
            app.startActivity({        
                action: "android.intent.action.VIEW",
                data: "alipays://platformapi/startapp?appId=60000002",
                packageName: "com.eg.android.AlipayGphone"
            });
        }

        sleep(time_interval);
    }

    /* 如果进入蚂蚁森林失败,则退出程序 */
    if (enter_flag)
    {
        return RET_ERR_ENTER_FOREST_FAILED;
    }
    return RET_SUCCES;
}

/*
 * 功能: 收集能量
 * 1. 确保已经进入自己的主页或者好友的主页
 * 2. 确定好能量球个数上限,可以防止其他异常情况导致死循环(有好友有保护罩导致死循环的情况。)
 */
function collect_energy (max_energy_num)
{
    var index = 0;
    if (0 > max_energy_num || 50 < max_energy_num)
    {
        return RET_ERR_INVALID_ENERGY_NUM;
    }

    if (0) { /* #if 0 */
    if (className("android.widget.Button").descContains("收集能量").exists())
    {
        var energy_button = className("android.widget.Button").descContains("收集能量").find();
        energy_button.forEach (function (object)
        {
            debug_str = "energy exist1: " + index + ", " + object.desc();
            DUMP_OUT_DEBUG(debug_str);
            //DUMP_OUT_DEBUG("energy exist1: %d, %s", index, object.desc());
            // TODO
            //click(object.bounds().centerX(), object.bounds().centerY());
            index++;

            if (index > max_energy_num)
            {
                return RET_ERR_OVER_MAX_COLLECT_TIMES;
            }
            sleep(2000);
        });
    }
    } else if (0){ /* #else */
    /*
     * findOne() : 阻塞
     * findOne(timeout) : timeout毫秒后,未找到则返回null (非阻塞)
     * descContains(str) : 找desc中包含str的UiSeletor
     */
    var energy_button = className("android.widget.Button").descContains("收集能量").findOne(1000);
    while (energy_button)
    {
        debug_str = "energy exist2: " + index + ", " + energy_button.desc();
        DUMP_OUT_DEBUG(debug_str);
        //DUMP_OUT_DEBUG("energy exist2: %d, %s", index, energy_button.desc());
        
        // TODO: collect this energy
        energy_button.click();
        index++;   
        if (index > max_energy_num)
        {
            return RET_ERR_OVER_MAX_COLLECT_TIMES;
        }
        sleep(2000);
        energy_button = className("android.widget.Button").descContains("收集能量").findOne(1000);
    }
    } /* #elseif */
    else
    {
        var barrier_free_view = className("android.view.View").idEndsWith("J_barrier_free").findOne(1000);

        barrier_free_view.children().forEach(function(child_button)
        {
            if (!child_button)
            {
                return false;
            }

            index++;

            if (child_button.desc() != "地图"
                && child_button.desc() != "成就"
                && child_button.desc() != "通知"
                && child_button.desc() != "攻略"
                && child_button.desc() != "任务"
                && child_button.desc() != "背包"
                && child_button.desc() != "发消息"
                && child_button.desc() != "弹幕"
                && child_button.desc() != "浇水"
                )
            {
                debug_str = "energy exist3: " + index + ", " + child_button.desc();
                DUMP_OUT_DEBUG(debug_str);
                //child_button.click();
                var rect = child_button.bounds();
                random_click(rect);
                sleep(500);
            }
        });
    }/* #endif */
    return RET_SUCCES;
}

function lookup_more_friend ()
{
    /* 调用次方法前需确保已经进入了"蚂蚁森林"界面 */
    var index = 0;
    var centerX = 0;
    var centerY = 0;
    var more_friend_view = className("android.view.View").descContains("查看更多好友").findOne(1000);
    while (!more_friend_view || !more_friend_view.bounds())
    {
        index++;

        if (index > 4)
        {
            return RET_ERR_NOT_FIND_LOOPUP_MORE_FRIEND;
        }
        debug_str = "Not find loopup more firend: " + index;
        DUMP_OUT_DEBUG(debug_str);
        //DUMP_OUT_DEBUG("not find loopup more firend: %d", index);

        more_friend_view = className("android.view.View").descContains("查看更多好友").findOne(1000);
    }

    centerX = more_friend_view.bounds().centerX();
    centerY = more_friend_view.bounds().centerY();
    
    debug_str = "Find lookup more friend: (" + centerX + ", " + centerY + ")";
    DUMP_OUT_DEBUG(debug_str);

    // DUMP_OUT_DEBUG("Find lookup more friend: (%d, %d)", centerX, centerY);
    
    var enter_flag = 1; // 0: success 1:fail
    var retry_times = 4;
    /* 进入"好友排行榜" */
    for (index = 0; index <= retry_times; index++)
    {
        /* TODO: 通过坐标点击"查看更多好友"无法进入"好友排行榜", 原因未知 */
        //press(centerX, centerY, 2000);
        //click(centerX, centerY);
        more_friend_view.click();

        /* 通过下面三个"控件"来判断成功进入了"好友排行榜" */
        var close_exist = className("android.widget.ImageView").desc("关闭").exists();
        var more_exist = className("android.widget.ImageView").desc("更多").exists();
        var friend_ranking_list_exist = className("android.widget.TextView").text("好友排行榜").exists();
        var stock_tree_exist = className("android.widget.Button").desc("种树").exists();
        if(close_exist 
            && more_exist 
            && friend_ranking_list_exist
            && !stock_tree_exist)
        {
            enter_flag = 0;
            break;
        }
        else
        {
            if (index)
            {
                debug_str = "Retry enter into friend ranking list: " + index + " times.\n    close: " 
                    + close_exist + ", more: " + more_exist + ", friend ranking list: " 
                    + friend_ranking_list_exist + ", stock tree: " + stock_tree_exist;
                DUMP_OUT_DEBUG(debug_str);
                // DUMP_OUT_DEBUG("Retry enter into friend ranking list: %d times.\n    close:%d, more:%d, friend ranking list:%d, stock tree:%d", 
                //     index, close_exist, more_exist, friend_ranking_list_exist, stock_tree_exist);
            }
        }

        sleep(2000);
    }

    /* 如果进入"好友排行榜"失败,返回错误 */
    if (enter_flag)
    {
        return RET_ERR_ENTER_FRIEND_RANKING_LIST_FAILED;
    }

    return RET_SUCCES;
}

function go_friend_homepage_steal (max_friend_num)
{
    var index = 0;
    var retry_count = 0;
    var may_finish = 0;
    var max_click_times = 0;
    var debug_str = null;
    var old_indexInParent = 0;
    var cur_indexInParent = 0;
    var rank_list_more_view = null;
    var ranking_list = null;
    if (0 > max_friend_num || 1000 < max_friend_num)
    {
        return RET_ERR_INVALID_MAX_FRIEND_NUM;
    }

    /* 每一次点击可以刷出20个好友, 加上20,10算是容错范围 */
    max_click_times = max_friend_num / 20;
    max_click_times = max_click_times > 10 ? (max_click_times + 20) : (max_click_times + 10);

    /*
     * 注意: J_rank_list_more 的desc刚开始应该是"查看更多"
     *                            如果人工下一次且未到底,desc为null
     *                            如果人工下拉到底,desc为"没有更多了"
     *                            如果使用脚本调用控件的click()下拉一次且未到底,desc为null
     *                            如果使用脚本调用控件的click()下拉一次到底,desc为null
     *       所以不建议使用desc来判断是否到底了
     *       下面的思路使用的是 J_rank_list_more 在父空间中的 indexInParent ,测试过没有问题
     */
    
    //var lookup_more_view = className("android.view.View").descContains("查看更多").findOne(1000);
    //var not_more_view = className("android.view.View").descContains("没有更多了").findOne(1000);

    retry_count = 0;
    while (1)
    {
        sleep(1000);
        rank_list_more_view = className("android.view.View").idEndsWith("J_rank_list_more").findOne(1000);
        if (rank_list_more_view)
        {
            old_indexInParent = 0;
            new_indexInParent = rank_list_more_view.indexInParent();
            break;
        }
        
        retry_count++;
        if (5 < retry_count)
        {
            /* 异常情况, 未获取到控件, 按理说不应该发生 */
            return RET_ERR_NOT_FIND_RANK_LIST_MORE_IN_FRIEND_RANKING_LIST;
        }
        
    }

    retry_count = 0;
    may_finish = 0;
    while (retry_count <= max_click_times)
    {
        retry_count++;

        if (!may_finish)
        {
            debug_str = "Loding more firend: " + retry_count + "/" + max_click_times;
        }
        else
        {
            debug_str = "Loding more firend may finish: " + retry_count + "/" + max_click_times;
        }
        DUMP_OUT_DEBUG(debug_str);

        /* 如果rank list more在父空间的index不变了,那么很可能已经刷新到底了。 */
        if (old_indexInParent == new_indexInParent)
        {
            /* 仍然尝试三次再退出 */
            may_finish++;
            retry_count--;
            if (1 < may_finish)
            {
                break;
            }
        }
        else
        {
            may_finish = 0;
        }

        sleep(2000);
        rank_list_more_view = className("android.view.View").idEndsWith("J_rank_list_more").findOne(1000);
        if (rank_list_more_view)
        {
            rank_list_more_view.click();
        }
        else
        {
            /* 异常情况, 未获取到控件, 按理说不应该发生 */
            DUMP_OUT_WARNING("Not find rank list more in friend ranking list!");
            continue;
        }
        old_indexInParent = new_indexInParent;
        new_indexInParent = rank_list_more_view.indexInParent();
    }
    
    /* 超过最大尝试次数 */
    if (retry_count >= max_click_times)
    {
        return RET_ERR_OVER_MAX_LOOKUP_MORE_CLICK_TIMES;
    }

    debug_str = "Refresh rank list more int friend ranking list successful."
    DUMP_OUT_DEBUG(debug_str);

    index = 0;
    retry_count = 0;

    max_click_times = max_friend_num / 6 + 3;
    while (1)
    {
        sleep(1000);
        ranking_list = className("android.view.View").idEndsWith("J_rank_list").findOne(1000);
        /* 获取到好友列表 */
        if (ranking_list)
        {
            index = 0;
            /* forEach 使用异常来提前结束 */
            try
            {
                max_click_times = ranking_list.childCount() / 6 + 3;
                ranking_list.children().forEach(function(friend_view)
                {
                    index++;

                    //debug_str = "Friend : " + index;
                    //DUMP_OUT_DEBUG(debug_str);

                    /* 判断是否需要进入该好友主页 */
                    /* 方法1: 取好友所在这个控件的右上角三个点,都时白色的话则认为不需要处理该好友 */
                    if (1)
                    {
                        var friend_right = 0;
                        var friend_top = 0;
                        
                        var screen_img = getCaptureImg();
                        var rect = friend_view.bounds();
                        
                        if (!rect)
                        {
                            throw new Error("END_error");
                        }

                        /* 为了 random_click 能点击成功,需要处在屏幕内(350代表"好友排行榜"的高度) */
                        if (rect.bottom <= device.height * 2 / 9
                            || rect.top <= device.height * 2 / 9)
                        {
                           return false;
                        }
                        else if (rect.bottom >= device.height)
                        {
                            throw new Error("END_foreach");
                        }

                        friend_right = rect.right;
                        friend_top = rect.top;
                        
                        /*
                         * 采用反向思维来判断,如果这里不是白色(ARGB = 0XFFFFFFFF)
                         * 手机屏幕的坐标,左上角是(0, 0)。向右为x正方向。向下为y轴正方向
                         */
                        var argb_1 = images.pixel(screen_img, rect.right - 10, rect.top + 10);
                        var argb_2 = images.pixel(screen_img, rect.right - 11, rect.top + 11);
                        var argb_3 = images.pixel(screen_img, rect.right - 12, rect.top + 12);

                        debug_str = "Friend " + index + ": " + (argb_1 & 0xffffff).toString(16) 
                            + " " + (argb_2 & 0xffffff).toString(16) + " " + (argb_3 & 0xffffff).toString(16);
                        //DUMP_OUT_VERBOSE(debug_str);

                        /* argb_1可能是64bit的,不和0xffffffff与的话,当颜色为白色时,等式无法成立 */
                        if ((argb_1 & 0xffffff) == 0xffffff 
                            && (argb_2 & 0xffffff) == 0xffffff 
                            && (argb_3 & 0xffffff) == 0xffffff)
                        {
                            debug_str = "Friend " + index + " has Nothing. 0xFFFFFF"
                            DUMP_OUT_DEBUG(debug_str);
                            return false;
                        }
                        /* 暂不支持帮好友收取能量 */
                        // else if ((argb_1 & 0xffffff) == 0xf99137 
                        //     || (argb_2 & 0xffffff) == 0xf99137 
                        //     || (argb_3 & 0xffffff) == 0xf99137)
                        // {
                        //     debug_str = "Friend " + index + " can Help. 0xf99137"
                        //     DUMP_OUT_DEBUG(debug_str);
                        //     return false;
                        // }
                        else
                        {
                            debug_str = "Friend " + index + " can Steal.";
                            DUMP_OUT_VERBOSE(debug_str);
                        }

                        debug_str = "Find lookup more friend handle: (" + friend_right + ", " + friend_top + ")";
                        //DUMP_OUT_DEBUG(debug_str);

                        random_click(rect);
                        // TODO
                        sleep(2000)
                        //friend_view.click(); // 控件点击方法无效
                        collect_energy(10);
                        sleep(2000)
                        go_back();
                        sleep(2000)

                    }
                    /* 方法二: 使用了多点找色,找出绿色底的白色小手 */
                    // TODO:稍后支持
                    else
                    {
                        var friend_right = 0;
                        var friend_top = 0;
                        
                        var screen_img = getCaptureImg();
                        var p = null;
                        var hand_pixel_1 = 0;
                        var hand_pixel_2 = 0;
                        var hand_pixel_3 = 0;

                        var rect = friend_view.bounds();
                        
                        if (!rect)
                        {
                            throw new Error("END_error");
                        }

                        /* 为了 random_click 能点击成功,需要处在屏幕内 */
                        if (rect.top <= 0)
                        {
                            return 0;
                        }
                        else if (rect.bottom >= device.height)
                        {
                            throw new Error("END_foreach");
                        }

                        friend_right = rect.right;
                        friend_top = rect.top;

                        debug_str = "Find lookup more friend handle: (" + friend_right + ", " + friend_top + ")";
                        DUMP_OUT_DEBUG(debug_str);

                        //hand_pixel_1 = images.pixel(screen_img, friend_right - 1, friend_top);

                        //411宽度 #a2cbb4  1032,1820  #30bf6c  1032,1787   -33     #52ca84  1032,1832   12     #ffffff  1032,1835   15
                        // p = images.findMultiColors(screen_img, "#a2cbb4",[[0, -33, "#30bf6c"], [0,12, "#52ca84"],[0,15, "#ffffff"]], {
                        //     region: [1032, 180, 1, 1700]
                        // });

                        if (p)
                        {
                            debug_str = "Friend " + index + " has nothing."
                            DUMP_OUT_DEBUG(debug_str);
                        }
                        else
                        {
                            debug_str = "Friend " + index + " can steal/help.";
                            DUMP_OUT_VERBOSE(debug_str);
                        }

                        random_click(rect);
                        //friend_view.click(); // 控件点击方法无效
                    }
                });
            }
            catch (e)
            {
                if (e.message == "END_error")
                {
                    DUMP_OUT_ERR("执行出错");
                    break;
                }
                else if (e.message == "END_foreach")
                {
                    debug_str = "Next " + retry_count + "/" + max_click_times + " ......";
                    DUMP_OUT_DEBUG(debug_str);
                }
                else
                {
                    DUMP_OUT_ERR("未知异常");
                    throw e;
                }
            }
        }
        
        retry_count++;
        //if (max_click_times < index)
        if (5 < retry_count && !ranking_list)
        {
            /* 异常情况, 未获取到控件, 按理说不应该发生 */
            return RET_ERR_NOT_FIND_RANK_LIST_MORE_IN_FRIEND_RANKING_LIST;
        }

        /* 已经遍历过所有的好友,结束 */
        if (max_click_times < retry_count)
        {
            break;
        }

        /* 滑动 */
        gesture(random(300,600), [random(50, device.width - 50), random(device.height * 7 / 9, device.height * 7 / 9 - 100)]
                                 , [random(50, device.width - 50), random(device.height * 2 / 9, device.height * 2 / 9 - 100)]
                                 //, [random(50, device.width - 50), random(device.height * 5 / 8, device.height * 6 / 8 - 10)]
                                 );
        /* 可变参数不会写,稍后支持 */
        //random_gesture();
    }

    return RET_SUCCES;
}

function user_define_main ()
{
    var ret = 0;
    //setScreenMetrics(1080, 1920);
    setScreenMetrics(1440, 2560);

    var debug_str = "Get device: (" + device.width + ", " + device.height + ")";
    DUMP_OUT_DEBUG(debug_str);
    // DUMP_OUT_DEBUG("Get device: (%d, %d)", device.width, device.height);

    /* 开启"无障碍服务"" */
    DUMP_OUT_VERBOSE("\"无障碍服务\" start...");
    ret = accessibility_services();
    if (ret)
    {
        anti_forest_err_return(ret);
        DUMP_OUT_ERR("程序异常终止");
        return ret;
    }
    else
    {
        DUMP_OUT_VERBOSE("\"无障碍服务\"成功开启");
    }
    DUMP_OUT_VERBOSE("\"无障碍服务\" end...");
    
    /* 获取"截屏"权限 */
    DUMP_OUT_VERBOSE("\"截屏权限\"获取 start...");
    ret = get_screenshot_privileges ();
    if (ret)
    {
        anti_forest_err_return(ret);
        DUMP_OUT_VERBOSE("程序异常终止");
        return ret;
    }
    else
    {
        DUMP_OUT_VERBOSE("\"截屏权限\"获取成功");
    }
    DUMP_OUT_VERBOSE("\"截屏权限\"获取 end...");

    /* 进入蚂蚁森林 */
    DUMP_OUT_VERBOSE("\"蚂蚁森林\"进入 start...");
    ret = ant_forest_enter(2000, 15);
    if (ret)
    {
        anti_forest_err_return(ret);
        DUMP_OUT_VERBOSE("程序异常终止");
        return ret;
    }
    else
    {
        DUMP_OUT_VERBOSE("\"蚂蚁森林\"进入成功");
    }
    DUMP_OUT_VERBOSE("\"蚂蚁森林\"进入 end...");

    /* 收集自己的能量 */
    DUMP_OUT_VERBOSE("\"收集自己的能量\" start...");
    var ret = collect_energy(5);
    if (RET_ERR_OVER_MAX_COLLECT_TIMES == ret)
    {
        anti_forest_err_return(ret);
        // 不退出程序
    }
    else if (ret)
    {
        anti_forest_err_return(ret);
        DUMP_OUT_VERBOSE("程序异常终止");
        return ret;
    }
    else
    {
        DUMP_OUT_VERBOSE("\"收集自己的能量\"完成");
    }
    DUMP_OUT_VERBOSE("\"收集自己的能量\" end...");

    /* 收集他人的能量 */
    DUMP_OUT_VERBOSE("\"收集他人的能量\" start...")
    ret = lookup_more_friend ();
    if (ret)
    {
        anti_forest_err_return(ret);
        DUMP_OUT_VERBOSE("程序异常终止");
        return ret;
    }
    else
    {
        DUMP_OUT_VERBOSE("\"查看更多好友\"进入成功");
    }

    sleep(2000);
    ret = go_friend_homepage_steal (200);
    if (ret)
    {
        anti_forest_err_return(ret);
        DUMP_OUT_VERBOSE("程序异常终止");
        return ret;
    }
    else
    {
        DUMP_OUT_VERBOSE("\"偷取/帮收\"能量成功");
    }
    DUMP_OUT_VERBOSE("\"收集他人的能量\" end...");

    /* 退出"蚂蚁森林" */
    back();
    back();
    exit();
}

/* 程序开始处 */
DUMP_OUT_VERBOSE("程序执行开始..........................");
user_define_main ();
DUMP_OUT_VERBOSE("程序执行结束..........................");
exit();
/* 程序结束处 */


说明

本文提供的代码仅供参考。
可能有些地方在最新版本的Auto.js上面需要做修改,才能运行。

Auto.js简介

Auto.js是利用安卓系统的“辅助功能”实现类似于按键精灵一样,可以通过代码模拟一系列界面动作的辅助工作。
与“按键精灵”不同的是,它的模拟动作并不是简单的使用在界面定坐标点来实现,而是类似与win一般,找窗口句柄来实现的。

Auto.js使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。

开发文档

Auto.js Pro开发文档优化版
文档尚在完善中,可能有文档描述和代码实际行为有出入的情况。
模板、样式、generator来自Node.js。

为什么要使用Auto.js Pro开发脚本,有什么特点?

吸引我使用Auto.js Pro的原因有很多。最主要的几个原因是:

  • Auto.js Pro能开发免ROOT的安卓脚本
  • Auto.js Pro基于节点操作,能开发全分辨率的脚本,自动适配各种安卓机型
  • Auto.js Pro丰富的UI组件,能自定义各种样式的安卓界面
  • Auto.js Pro使用的javascript的语法比较优雅,代码可读性强
  • Auto.js Pro的命令库非常的丰富,接口比较多
  • Auto.js Pro脚本文件体积比较小。1000行的代码,打包后的apk文件只有3-5M,还没有广告

相关教程

Auto.js Pro安卓全分辨率免ROOT引流脚本开发教程

你可能感兴趣的:(脚本源码)