1. 程式人生 > >AccessibilityService——實現自動遍歷點贊功能

AccessibilityService——實現自動遍歷點贊功能

/**
 * Created by jiangzn on 17/2/6.
 */
public class MyAccessibilityService extends AccessibilityService {

    @Override
    protected void onServiceConnected() {
        LogUtils.d("onServiceConnected");
    }

    String description;

    ArrayList<Integer> topList = new ArrayList<>();

    List<AccessibilityNodeInfo> lvs;

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        try {

            //微信UI介面的根節點,開始遍歷節點
            AccessibilityNodeInfo rootNodeInfo = getRootInActiveWindow();
            if (rootNodeInfo == null) {
                return;
            }
            description = "";
            if (rootNodeInfo.getContentDescription() != null) {
                description = rootNodeInfo.getContentDescription().toString();
            }

            //自動點贊流程
            if (mUserName.equals("")) {
                //Lv
                lvs = rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cn0");
                LogUtils.d("找到的Lv數量: " + lvs.size());
                //如果size不為0,證明當前在朋友圈頁面下,開始執行邏輯
                if (lvs.size() != 0) {
                    //1.先記錄使用者名稱
                    List<AccessibilityNodeInfo> userNames =
                            rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/afa");
                    if (userNames.size() != 0) {
                        if (userNames.get(0).getParent() != null && userNames.get(0).getParent().getChildCount() == 4) {
                            mUserName = userNames.get(0).getText().toString();
                            if (!mUserName.equals("") && !ifOnce) {
                                LogUtils.d("初始化,只會執行一次");
                                LogUtils.d("當前的使用者名稱:" + mUserName);
                                ifOnce = true;
                                //測試朋友圈點贊
                                test3(rootNodeInfo);
                            }
                        }
                    }
                } else {
                    ifOnce = false;
                    mUserName = "";
                }

            }


        } catch (Exception e) {
            if (e != null && e.getMessage() != null) {
                LogUtils.d("報錯:" + e.getMessage().toString());
            }
        }

    }

    String mUserName = "";
    private boolean ifOnce = false;

    /**
     * com.tencent.mm:id/cn0
     * 朋友圈點贊 (目前實現手動滾動全部點贊)
     * 上方固定顯示的名字:com.tencent.mm:id/afa
     * 下方點贊:顯示id:com.tencent.mm:id/cnn
     * 每發現一個【評論按鈕】,就去搜索當前同父元件下的點贊區域有沒有自己的ID。
     * 如果有就不點贊,如果沒有就點贊
     * 這裡要改成不通過Id抓取提高穩定性
     *
     * @param rootNodeInfo
     */
    private synchronized void test3(AccessibilityNodeInfo rootNodeInfo) {
        LogUtils.d("當前執行緒:" + Thread.currentThread());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        topList.clear();

        if (!mUserName.equals("")) {

            //測試獲得評論按鈕的父節點,再反推出點贊按鈕
            List<AccessibilityNodeInfo> fuBtns =
                    rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/co0");

            LogUtils.d("fuBtns數量:" + fuBtns.size());

            if (fuBtns.size() != 0) {

                //刪掉超出螢幕的fuBtn
                AccessibilityNodeInfo lastFuBtn = fuBtns.get(fuBtns.size() - 1);
                Rect lastFuBtnOutBound = new Rect();
                lastFuBtn.getBoundsInScreen(lastFuBtnOutBound);
                if (lastFuBtnOutBound.top > Config.height) {
                    fuBtns.remove(lastFuBtn);
                }

                for (int i = 0; i < fuBtns.size(); i++) {
                    AccessibilityNodeInfo fuBtn = fuBtns.get(i);
                    LogUtils.d("fuBtn的子節點數量:" + fuBtn.getChildCount());//3-4個
                    List<AccessibilityNodeInfo> plBtns = fuBtn.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cj9");
                    LogUtils.d("從這裡發現評論按鈕:" + plBtns.size());

                    if (plBtns.size() == 0) {
                        if (lvs.get(0).performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)) {
                            test3(getRootInActiveWindow());
                        }
                        return;
                    }

                    AccessibilityNodeInfo plbtn = plBtns.get(0);    //評論按鈕
                    List<AccessibilityNodeInfo> zanBtns = fuBtn.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cnn");
                    LogUtils.d("從這裡發現點贊文字顯示區域:" + zanBtns.size());
                    if (zanBtns.size() != 0) {
                        //2.如果不為空,則查詢有沒有自己點過贊,有則不點,沒有則點
                        AccessibilityNodeInfo zanbtn = zanBtns.get(0);
                        LogUtils.d("點讚的人是:" + zanbtn.getText().toString());
                        if (zanbtn != null && zanbtn.getText() != null &&
                                zanbtn.getText().toString().contains(mUserName)) {
                            LogUtils.d("*********************這一條已經被贊過辣");
                            //判斷是否需要翻頁,如果當前所有頁面的父節點都沒點過了,就需要翻頁
                            boolean ifxuyaofanye = false;
                            LogUtils.d("O(≧口≦)O: i=" + i + "  fuBtns.size():" + fuBtns.size());
                            if (i == fuBtns.size() - 1) {
                                ifxuyaofanye = true;
                            }
                            if (ifxuyaofanye) {
                                //滑動前檢測一下是否還有沒有點過的點
                                if (jianceIfLou()) {
                                    LogUtils.d("還有遺漏的點!!!!再檢查一遍!!!!!!!!!!");
                                    test3(getRootInActiveWindow());
                                } else {
                                    if (lvs.get(0).performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)) {
                                        test3(getRootInActiveWindow());
                                        return;
                                    }
                                }
                            }

                        } else {
                            LogUtils.d("**************************:自己沒有贊過!");
                            //開始執行點贊流程
                            if (plBtns.size() != 0) {
                                Rect outBounds = new Rect();
                                plbtn.getBoundsInScreen(outBounds);
                                int top = outBounds.top;

                                //根據top判斷如果已經點開了就不重複點開了
                                if (topList.contains(top)) {
                                    return;
                                }
                                //com.tencent.mm:id/cj5 贊
                                if (plbtn.performAction(AccessibilityNodeInfo.ACTION_CLICK)) {
                                    List<AccessibilityNodeInfo> zanlBtns = rootNodeInfo.
                                            findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cj3");
                                    if (zanlBtns.size() != 0) {
                                        if (!topList.contains(top) && zanlBtns.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK)) {
                                            topList.add(top);
                                            LogUtils.d("topList:" + topList.toString());

                                            //判斷是否需要翻頁,如果當前所有頁面的父節點都沒點過了,就需要翻頁
                                            boolean ifxuyaofanye = false;
                                            LogUtils.d("O(≧口≦)O: i=" + i + "  fuBtns.size():" + fuBtns.size());
                                            if (i == fuBtns.size() - 1) {
                                                ifxuyaofanye = true;
                                            }
                                            if (ifxuyaofanye) {
                                                //滑動前檢測一下是否還有沒有點過的點
                                                if (jianceIfLou()) {
                                                    LogUtils.d("還有遺漏的點!!!!再檢查一遍!!!!!!!!!!");
                                                    test3(getRootInActiveWindow());
                                                } else {
                                                    if (lvs.get(0).performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)) {
                                                        test3(getRootInActiveWindow());
                                                        return;
                                                    }
                                                }


                                            }

                                        }
                                    }
                                }
                            }
                        }

                    } else {
                        LogUtils.d("**************************:點贊區域為空!plBtns.size() :" + plBtns.size());

                        //開始執行點贊流程
                        if (plBtns.size() != 0) {

                            Rect outBounds = new Rect();
                            plbtn.getBoundsInScreen(outBounds);
                            int top = outBounds.top;

                            //根據top判斷如果已經點開了就不重複點開了
                            if (topList.contains(top)) {
                                return;
                            }
                            //com.tencent.mm:id/cj5 贊
                            if (plbtn.performAction(AccessibilityNodeInfo.ACTION_CLICK)) {
                                List<AccessibilityNodeInfo> zanlBtns = rootNodeInfo.
                                        findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cj3");
                                if (zanlBtns.size() != 0) {
                                    if (!topList.contains(top) && zanlBtns.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK)) {
                                        topList.add(top);
                                        LogUtils.d("topList:" + topList.toString());

                                        //判斷是否需要翻頁,如果當前所有頁面的父節點都沒點過了,就需要翻頁
                                        boolean ifxuyaofanye = false;
                                        LogUtils.d("O(≧口≦)O: i=" + i + "  fuBtns.size():" + fuBtns.size());
                                        if (i == fuBtns.size() - 1) {
                                            ifxuyaofanye = true;
                                        }
                                        if (ifxuyaofanye) {
                                            //滑動前檢測一下是否還有沒有點過的點
                                            if (jianceIfLou()) {
                                                LogUtils.d("還有遺漏的點!!!!再檢查一遍!!!!!!!!!!");
                                                test3(getRootInActiveWindow());
                                            } else {
                                                if (lvs.get(0).performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)) {
                                                    test3(getRootInActiveWindow());
                                                    return;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

        }
    }


    private boolean jianceIfLou() {
        boolean result = false;
        List<AccessibilityNodeInfo> fuBtns =
                getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/co0");
        LogUtils.d("檢查的父節點數量:" + fuBtns.size());
        if (fuBtns.size() != 0) {
            for (AccessibilityNodeInfo fuBtn : fuBtns) {
                //點贊區域
                List<AccessibilityNodeInfo> zanBtns = fuBtn.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cnn");
                LogUtils.d("檢查的父節點的點贊區域數量:" + zanBtns.size());
                if (zanBtns.size() != 0) {
                    AccessibilityNodeInfo zanbtn = zanBtns.get(0);
                    LogUtils.d(" zanbtn.getText().toString():" + zanbtn.getText().toString());
                    if (zanbtn != null && zanbtn.getText() != null &&
                            zanbtn.getText().toString().contains(mUserName)) {
                        result = false;
                    } else {
                        result = true;
                    }
                } else {
                    result = true;
                }
            }
        }

        return result;
    }


    @Override
    public void onInterrupt() {
        LogUtils.d("onInterrupt");
    }

}
輔助服務類的配置方法可以參考上文AccessibilityService——實現微信切換賬號功能

相關推薦

AccessibilityService——實現自動功能

/** * Created by jiangzn on 17/2/6. */ public class MyAccessibilityService extends AccessibilityService { @Override protected void onServiceConn

Redis應用2-Redis實現開發者頭條頁面功能

開發者頭條是一個資源豐富的程式猿學習網站。當網站釋出新的內容的時候,內容優秀的總是會被點贊。今天就利用Redis實現這個小小的功能。 為什麼使用Redis而不是MySQL實現? Redis 和 MySQL應用場景不同。 從效率來說: Redis

php + ajax實現 帖子功能

data inpu 局部刷新 瀏覽器 query 實現 script 函數 syn 知識: 一、首先頁面需要加載jquery框架 二、ajax常用參數解釋: ①、type:傳輸數據方式,get或者post ②、url:處理數據的PHP腳本 ③、data:傳輸的數據索引及值,

mongodb 用戶功能理論實現[轉載]

mongod div select AC 數組 pan exist class TP 在 posts(文章) 集合中儲存對該文章點贊的用戶的 _id 的數組,例如: // posts { _id: ObjectID(‘4e7020cb7cac81af7136236

微信小程式實現、取消功能

最近接觸到小程式,發現很有意思,在專案中遇到了一點小問題,就是點贊+取消點贊有些衝突,還有就是多項的點選,話不多說咱們直接上程式碼! 效果圖 wxml ? 1

WordPress非外掛實現文章功能

功能豐富的WordPress點贊外掛不少,但對於要在主題中整合簡單文章點贊功能的需求,外掛就顯得不合適,於是乎非外掛實現文章點贊功能的方法就誕生,實現思路是:可以通過ajax實時顯示點贊數量,自定義欄位儲存贊數量,Cookies禁止重新點贊。 具體操作步驟。 1、在當前主

Redis + DB +訊息佇列 實現高效的文章功能

需求說明 使用者可點贊或踩,每贊一次,“贊”數量+1,每踩一次,“踩”數量+1,“點贊”和“點踩” 當天內二選一當天內有效 場景:使用者A 點贊 文章a,文章a 點贊量+1 ,同一使用者,同一文章 當天再次點選無效,贊與踩二選一,隔天再次點選有效 表設計 文章的

Android中Listview實現功能

最近這段時間一直在看Android,利用Listview去實現點贊功能 基本思路: 進入介面–》獲取資料–》 在Listview中顯示–》 通過map集合(position,boolean)儲存每一行是否被點選–》 利用實體類去儲存相應的物件–》 g

騰訊優測優分享-手機應用自動實現

摘要: 騰訊優測是專業的app自動化測試平臺,安卓平臺上的自動化遍歷如果框架嫌麻煩可以嘗試下,我在工作中也在不斷地學習探索,目前處在探索的初期階段。 關鍵詞: 安卓自動化遍歷  android適配  移動研發 在我看來,遍歷自動化的難點主要集中在以下兩個方面:

利用UiAutomator寫一個自動渠道包關鍵功能的指令碼

本人在做自動化測試的過程中,出現了一個需求。原因是,在發出去的渠道包裡面,偶然一次有兩個渠道包微博登入失敗的bug,所以想著利用UiAutomator寫了一個自動遍歷每個渠道包的登入方式的指令碼。經過嘗試第一版終於完成,分享程式碼和思路,供大家參考。 思路:把所有渠道包放在

一個“功能實現程式碼

“點贊”是最近很流行的一個詞,自己也琢磨了一下程式碼,暫時只實現了功能性程式碼,要新增漂亮效果,可以繼續用Jquery來實現。看效果請點選:http://www.i5wl.com/example/praise/。 主要有兩個檔案:一是:index.htm,呈現前端頁面,主要是利用Jquery的$.get()

基於ssm下用jQuery簡單實現功能

    自己寫專案的時候了用到了這個點贊與取消讚的功能,然後突然心血來潮,想在這裡寫篇部落格,也算是小小的總結一下,廢話不多說了,給大家上圖上碼才是重點。    下圖是知乎裡面的我的文章的截圖,現在就是要實現他的點贊功能。下圖是我自己寫的頁面jsp頁面點贊那一塊的程式碼:&l

區域性重新整理ListView,實現功能

今天看到一個需要實現一個點讚的功能。自己想沒想明白,後來看了http://blog.csdn.net/nupt123456789/article/details/39432781 這篇部落格,才有了思路。特意感謝 這是我要用的ListView的item。要給ListView

C語言如何實現目錄的功能

如何用C語言實現linux下的ls命令   首先我講一下寫這篇東西的目的。我覺得對於很多linux新手。尤其是在自學的同學。最好的學習的方法就是通過具體的例子。通過一個實踐的例子,在學習相關的知識點的同時,就把它們應用到這例子中。這樣不僅知道了原理。也知道了怎麼去應用。下面就開始用一個常用的命令”ls”

jquery ajax之功能實現

之前,一直想用一下ajax的技術到專案中,看他到底好處在哪裡,為什麼會被這麼多人所推崇。 還記得之前也是看過jquery,但是現在回過來想想,其實能夠記起來的東西很少,只有將知識應用起來,可能才會記憶深刻吧!今年開始我逐漸開始積累起自己的一些程式碼和 新知識,這樣的話到以後

python學習筆記:實現一個檔案尋找字串的功能

為了熟練使用python,打算有事沒事用python寫一些實用的小指令碼 我剛剛進入計算機專業一年,一些專業用語不是很清楚,有說錯的地方歡迎大家批評指正 -----------------------

Spring Boot + Redis + MQ實現高併發功能:專案實戰

開心一笑 【最後一次警告看我CSDN部落格的人,你們都他媽給老子小心點,首先我不管你是什麼身份,什麼背景,混的有多牛逼,是不是老闆,是不是社會人,這些我都不知道,我也都不在意,你們給我記住,都給我認真點看清楚:最近天氣實在很涼,大家多穿衣服,彆著涼了,知道不!

iOS UICollectionView 按鈕選變色(收藏功能實現

1.前言 專案需求要實現點選收藏功能,但是頁面資料進行了分頁功能,當載入了第二頁資料後,收藏按鈕的顯示就紊亂,具體原因是點選收藏後,請求收藏介面成功後要對資料進行重新整理,這個時候因為分頁的原因,載入過來的資料只是第二頁的(或者第一頁,反正只有一頁),這

.NET 實現頁面功能

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebTest.WebForm2" %> <!DOCTYPE html>

Ajax+jQuery+bootstrap+Java實現非同步功能,並限制選次數

(下面截圖是自己專案的截圖) 當已經點贊後,滑鼠再經過時,就會顯示 "禁止的圖示"  (相應的class 會變化) cursor:not-allowed 在很多的網站上有很多不同的點贊,我不知道他們是怎麼實現的,下面我來分享一下我寫的點贊實現,共大家參考下, 這是我在一個專案抽取的程式碼