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——實現自動遍歷點贊功能
/** * 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 在很多的網站上有很多不同的點贊,我不知道他們是怎麼實現的,下面我來分享一下我寫的點贊實現,共大家參考下, 這是我在一個專案抽取的程式碼