Accessibility Service - 자동 으로 좋아요 누 르 기 기능 구현

개요:
Accessibility Service 체 제 를 이용 하여 비교적 재 미 있 는 기능 을 실현 하 였 으 며, 위 챗 모멘트 는 자동 으로 '좋아요' 를 누 르 고 있다.끊 임 없 는 스크롤 + 좋아요 누 르 기 를 통 해 모든 친구 들 을 한 번 씩 칭찬 하 는 것 이다.
물론 그 중에서 판단 알고리즘 도 언급 해 야 한다. 예 를 들 어 이 친구 권 이 이미 칭찬 을 받 았 다 면 뛰 어 넘 고 현재 화면 에 칭찬 할 만 한 친구 권 이 없 을 때 페이지 를 넘 기 는 것 이다.사실 시행 착 오 는 매우 번 거 로 운 과정 으로 이 효과 도 이틀 정도 차이 가 나 지 않 는 다.
사용 방법:
실행 프로그램 - 무장 애 서 비 스 를 시작 하고 위 챗 메 인 인터페이스 로 전환 하여 친구 권 에 들 어가 면 자동 으로 좋아요 프로그램 을 실행 합 니 다.
효과 도 는 다음 과 같다.
실현 원리 절차 및 난점:
1. 먼저 위 챗 모멘트 라 는 인터페이스의 ListView 결점 을 얻 거나 루트 노드 설명 을 통 해 이 인터페이스 에 들 어 갈 지 여 부 를 판단 해 야 합 니 다.
2. 모멘트 인터페이스 에 도착 하면 프로그램 방법 체 를 실행 할 수 있 지만 boolean 값 판단 이 있어 야 한 번 만 실행 할 수 있 습 니 다.
왜 이 방법 체 는 한 번 만 실행 할 수 있 습 니까?(코드 는 아래 에 있 습 니 다) 만약 에 수 동적 으로 onAccessibility Event 에 우리 의 방법 을 호출 시 키 면 많은 문제 가 발생 할 수 있 습 니 다. 예 를 들 어 결산 점 이 너무 빨리 갱신 되 고 여러 번 의 트리거 방법 으로 인해 좋아요 단 계 를 동시에 N 번 실행 한 다음 에 무한 사 순환 을 합 니 다. onAccessibility Event 의 트리거 가 너무 빨 라 서 약 0. 몇 밀리초 에 한 번 촉발 되 기 때문에 저 는 마지막 으로 방법론 을 한 번 만 촉발 시 켰 습 니 다.1 초 에 한 번 씩 휴면 하면 결점 을 갱신 할 시간 이 충분 하고 집행 의 안정성 도 확보 할 수 있다.
3. 사용자 의 이름 을 기록 합 니 다. 예 를 들 어 제 이름 은 '진 나라 까지 의 참외' 입 니 다. 그리고 저 는 아래 의 모든 아 이 템 의 결산 점 에서 좋아요 구역 을 찾 은 다음 에 '진 나라 까지 의 참외' 라 는 필드 가 있 는 지 찾 습 니 다. 어떤 것 은 이 친구 들 이 이미 찬 사 를 했 고 뛰 어 넘 었 으 며 없 으 면 좋아요 가 실 행 됩 니 다.
3. 좋아요 프로그램의 실행 은 어렵 지 않 습 니 다. 코드 를 알 아 볼 수 있 고 여 기 는 지나 갑 니 다. 
코드 구현:
/**
 * Created by jiangzn on 17/2/6.
 */
public class MyAccessibilityService extends AccessibilityService {

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

    String description;

    ArrayList topList = new ArrayList<>();

    List 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 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 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 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 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 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 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 fuBtns =
                getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/co0");
        LogUtils.d("        :" + fuBtns.size());
        if (fuBtns.size() != 0) {
            for (AccessibilityNodeInfo fuBtn : fuBtns) {
                //    
                List 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");
    }

}
보조 서비스 류 의 설정 방법 은 상기 Accessibility Service 를 참고 하여 위 챗 전환 계 정 기능 을 실현 할 수 있 습 니 다.
현재 코드 는 두 단락 이 거의 중복 되 어 있 습 니 다. 여 기 는 추출 되 지 않 았 습 니 다. 그 후에 제 가 더 최적화 해 야 하기 때 문 입 니 다. (네, 이것 이 바로 demo 버 전 입 니 다. 고치 고 싶 지 않 습 니 다.)
이렇게 많아

좋은 웹페이지 즐겨찾기