自动偷取蚂蚁森林能量

之前写的微信抢红包软件效果还可以,反正过年家里的群里面的红包永远是我第一个抢到;其实微信抢红包还是比较简单的,稍微理一下逻辑也是比较容易实现的,基本上没什么难点。但是想要实现自动偷取蚂蚁森林的能量还是有点难度的,这里分享一下实现思路。

要实现的功能

功能是这样的,运行辅助软件后,自动跳转到支付宝页面,然后我们手动打开蚂蚁森林,手动进入好友总排名,然后辅助就开始找到那些可以收取能量的好友,进去收取能量,然后返回来继续。其实是可以实现全自动的,但是我实现以后觉得有点蠢,还是只实现偷好友能量这步比较好。

未标题-1.png-113.8kB

实现方法

蚂蚁森林的界面都是一个标题栏加一个网页,内容都在网页里面。单纯的靠Android辅助功能是无法获取里面控件,无法实现这个功能的;图象识别配合模拟点击是万能的;只要识别出页面中这个可收取的能量的这个手的图标的位置,再通过模拟点击,就可以进入朋友的森林界面,再次通过图象识别,识别出可以收取的能量的位置,就可以进行能量的收取;

屏幕截图

首先是获取屏幕的截图,获取截图可以使用Android的录屏功能来实现,在开启辅助前,开启录屏功能,然后到这个界面的时候,通过当前页面的类名和标题是可以知道当前处于总排行榜界面的,这时候获取当前界面的截屏,然后进行图象识别,获取到第一个可收取能量的图标的位置,点击进入朋友的森林界面,进行能量的收取,然后返回,返回的时候,重新截图识别,找下一个可收取能量的图标;当识别不到可收取的图标的时候,模拟滑动进行翻页,然后继续进行识别。

    //蚂蚁森林界面的标题控件
        nodeInfo = findViewByID(ANT_FOREST_TITLE_ID);
        String title = null;
        if (nodeInfo != null && nodeInfo.getText() != null) {
            title = nodeInfo.getText().toString();
        }
        //标题存在,且在朋友列表
        if (title != null && ANT_FOREST_TITLE.equals(title)) {
            nodeInfo = findViewByID(ANT_FOREST_BACK_ID);
            if (nodeInfo != null) {
                //在更多好友界面,判断界面是处于非滑动状态
                if (!uiScrolling) {
                    //找到可以收取能量的按钮进行点击
                    findEnergyItem();
                    return;
                }
            } 

图像识别

图象识别的话,之前有使用过openCV,里面的模板匹配应该比较符合这里的用法;这样的图象识别在做辅助软件的时候特别容易用到,之前都是根据需要写的一些用颜色作为识别的算法,每次都要重新写,比较操心,所以我自己想写一些通用的、简单的图象识别方法,可以复用,类似两张图片,找出小的图片在大图中的位置这种模板匹配;自己利用图象上的点的颜色来进行对比判断写了个识别方法(如果两张图片每个点颜色都相同,那图片肯定就一样了呀),还行能用,识别一张图片2960x1440的大概需要700毫秒左右;如下图,识别出图标的位置,我使用半透明的黄色标志了一下位置

/**
     * 找有能量的item
     */
    @RequiresApi(api = Build.VERSION_CODES.N)
    private void findEnergyItem() {
        //进行截屏
        Bitmap bitmap = ScreenRecordUtil.getInstance().getScreenShot();
        //进行图象识别
        List<Rect> rects = cross.matching(bitmap, template);
        if (rects.size() > 0) {
            Rect rect = rects.get(0);
            //点击识别出的坐标,进入下一个界面,触发下一个界面的方法进行处理
            clickOnScreen((rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2, 10, null);
            SystemClock.sleep(1000);
            return;
        }
        //未找到按钮
        uiScrolling = true;
        //进行滑动操作
        performScrollDownward(ScreenUtil.SCREEN_HEIGHT - 100, ScreenUtil.SCREEN_HEIGHT / 2, new AccessibilityService.GestureResultCallback() {
            @Override
            public void onCompleted(GestureDescription gestureDescription) {
                super.onCompleted(gestureDescription);
                //滑动完成继续识别
                uiScrolling = false;
            }
        });
    }
未标题-2.png-92.5kB

在好友的森林界面的偷能量,也是通过当前页面的类名和标题去判断当前界面处于好友的森林界面

 if (nodeInfo != null) {
            //在好友的森林里面
            if (title != null && !title.equals(ANT_FOREST_TITLE) && title.contains(ANT_FOREST_TITLE)) {
                //进行偷能量操作
                if (!isCollecting) {
                    getEnergy();
                    //返回上一页
                    performBackClick();
                    SystemClock.sleep(WAIT_SLIPPING_TIME);
                    isCollecting = false;
                }
            }
        }

颜色识别偷能量

未标题-3.png-83.6kB

偷能量的操作,也是图象识别去实现,看图可以知道可收取的能量的颜色有些不同,写个简单的算法,通过颜色来判断一个点是否有可以获取的能量,然后模拟点击进行收取

/**
     * 收取能量
     */
    private void getEnergy() {
        isCollecting = true;
        //获取屏幕截屏
        Bitmap bitmap = ScreenRecordUtil.getInstance().getScreenShot();
        int width = bitmap.getWidth();
        int startPointY = (int) (bitmap.getHeight() * START_HEIGHT_TOP_SCALE);
        int endPointY = (int) (bitmap.getHeight() * START_HEIGHT_BOTTOM_SCALE);
        for (int y = startPointY; y < endPointY; y = y + 25) {
            for (int x = 0; x < width; x = x + 10) {
                int currentColor = bitmap.getPixel(x, y);
                //颜色对比可收取能量
                if (labColorLike.isLike(ENERGY_COLOR, currentColor, 10)) {
                    //点击收取能量
                    clickOnScreen(x, y - 40, 10, null);
                    SystemClock.sleep(50);
                }
            }
        }
    }

总体效果还是不错的,收收能量没什么问题;其实也实现也比较简单,就是图像识别加上模拟点击。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容