1. 程式人生 > >用這個工具,發朋友圈都可以自動了

用這個工具,發朋友圈都可以自動了

今天推薦是一個比較騷氣的工具,自動發朋友圈(不用root手機),對於一天發10多條,甚至20條朋友圈的朋友,每次編輯比較麻煩。我之前也寫過搶紅包工具,當時上架應用市場時,又恰逢過年,那下載量,比我吃了一桶老壇酸菜面還爽。後來由於應用市場的限制,就下架了,後來反正也不是很麼高超的技術,就開源在我的github上了,今天分享這個自動發朋友圈的工具,也是和搶紅包原理類似。通過開啟輔助工具。進行監控螢幕上的按鈕。延伸想想,那些喜歡點讚的朋友,是不是可以稍微改下,就變成了自動開啟朋友圈,挨個朋友點贊。想想有木有很激動。哈哈~話不多說,我們進入司徒文德分享的文章。原文連結:https://www.jianshu.com/p/8b4ea121d188

一、效果圖

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

二、測試Android裝置
我在這兩款裝置測試正常,其它裝置如果有什麼問題,歡迎給我反饋_
夜神模擬器(Android 4.3)、華為榮耀8青春版(Android 7.0)

三、原理

整個app的核心是AccessibilitySampleService類,它繼承了AccessibilityService服務。在輔助功能開啟之後,AccessibilitySampleService類會監聽目標APP(微信)頁面的狀態變化。之後使用Android官方提供的UI Automator Viewer工具,檢視目標APP(微信)的佈局結構樹。

640?wx_fmt=png

根據rescoure-id搜尋出相應的控制元件,再對這些控制元件執行點選、複製、貼上等操作。

看下核心實現邏輯

@TargetApi(18)
public class AccessibilitySampleService extends AccessibilityService {
   @Override
   protected void onServiceConnected()
{
       super.onServiceConnected();
       flag = false;
   }
   private AccessibilityNodeInfo accessibilityNodeInfo;
   /**
    * 是否已經發送過朋友圈,true已經發送,false還未傳送
    */


   public static boolean flag = false;
   @Override
   public void onAccessibilityEvent(AccessibilityEvent event)
{
       SharedPreferences sharedPreferences = getSharedPreferences(Constant.WECHAT_STORAGE, Activity.MODE_PRIVATE);
       int eventType = event.getEventType();
       LogUtil.e(eventType + "             " + Integer.toHexString(eventType) + "         " + event.getClassName());
       accessibilityNodeInfo = getRootInActiveWindow();
       if (accessibilityNodeInfo == null) {
           return;
       }
       switch (eventType) {
           case AccessibilityEvent.TYPE_VIEW_SCROLLED:
               if (!flag && event.getClassName().equals("android.widget.ListView")) {
                   clickCircleOfFriendsBtn();//點擊發送朋友圈按鈕
               }
               break;
           case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
               if (event.getClassName().equals("com.tencent.mm.ui.LauncherUI")) {//第一次啟動app
                   flag = false;
                   jumpToCircleOfFriends();//進入朋友圈頁面
               }
               if (!flag && event.getClassName().equals("com.tencent.mm.plugin.sns.ui.SnsUploadUI")) {
                   String content = sharedPreferences.getString(Constant.CONTENT, "");
                   inputContentFinish(content);//寫入要傳送的朋友圈內容
               }
               break;
       }
   }
   /**
    * 跳進朋友圈
    */

   private void jumpToCircleOfFriends() {
       new Handler().postDelayed(new Runnable() {
           @Override
           public void run()
{
               List<AccessibilityNodeInfo> accessibilityNodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("android:id/list");
               if (accessibilityNodeInfoList != null && accessibilityNodeInfoList.size() != 0) {
                   AccessibilityNodeInfo accessibilityNodeInfo = accessibilityNodeInfoList.get(0);
                   if (accessibilityNodeInfo != null) {
                       accessibilityNodeInfo = accessibilityNodeInfo.getChild(1);
                       if (accessibilityNodeInfo != null) {
                           accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                       }
                   }
               }
           }
       }, 1500);
   }
   /**
    * 寫入朋友圈內容
    *
    * @param contentStr
    */

   private void inputContentFinish(final String contentStr) {
       new Handler().postDelayed(new Runnable() {
           @Override
           public void run()
{
               List<AccessibilityNodeInfo> accessibilityNodeInfoList1 = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/dba");
               if (accessibilityNodeInfoList1.size() > 0) {
                   ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                   ClipData clip = ClipData.newPlainText("text", contentStr);
                   if (clipboard == null) {
                       return;
                   }
                   clipboard.setPrimaryClip(clip);
                   accessibilityNodeInfoList1.get(0).performAction(AccessibilityNodeInfo.ACTION_FOCUS);
                   accessibilityNodeInfoList1.get(0).performAction(AccessibilityNodeInfo.ACTION_PASTE);
                   LogUtil.e("寫入內容");
               }
               List<AccessibilityNodeInfo> accessibilityNodeInfoList =
                       accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/h5");//點擊發送
               if (accessibilityNodeInfoList == null || accessibilityNodeInfoList.size() == 0) {
                   LogUtil.e("傳送朋友圈失敗");
                   return;
               }
               accessibilityNodeInfoList.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
               Toast.makeText(getApplicationContext(), "傳送朋友圈成功", Toast.LENGTH_LONG).show();
               flag = true;//標記為已傳送
           }
       }, 1500);
   }
   /**
    * 選擇圖片
    *
    * @param startPicIndex 從第startPicIndex張開始選
    * @param picCount      總共選picCount張
    */

   private void choosePicture(final int startPicIndex, final int picCount) {
       new Handler().postDelayed(new Runnable() {
           @Override
           public void run()
{
               List<AccessibilityNodeInfo> accessibilityNodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cyh");
               for (int i = 0; i < accessibilityNodeInfoList.size(); i++) {
                   for (int j = startPicIndex; j < startPicIndex + picCount; j++) {
                       AccessibilityNodeInfo childNodeInfo = accessibilityNodeInfoList.get(i).getChild(j);
                       if (childNodeInfo != null) {
                           List<AccessibilityNodeInfo> childNodeInfoList = childNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/bnl");
                           if (childNodeInfoList != null && childNodeInfoList.size() != 0) {
                               childNodeInfoList.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                           }
                       }
                   }
               }
               List<AccessibilityNodeInfo> finishList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/h5");//點選確定
               if (finishList != null && finishList.size() != 0) {
                   finishList.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                   LogUtil.e("完成圖片選擇!");
               }
           }
       }, 1500);
   }
   /**
    * 點擊發送朋友圈按鈕
    */

   private void clickCircleOfFriendsBtn() {
       new Handler().postDelayed(new Runnable() {
           @Override
           public void run()
{
               if (accessibilityNodeInfo == null) {
                   return;
               }
               List<AccessibilityNodeInfo> accessibilityNodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/g1");
               if (accessibilityNodeInfoList != null && accessibilityNodeInfoList.size() != 0 &&
                       accessibilityNodeInfoList.get(0) != null && accessibilityNodeInfoList.get(0).getParent() != null) {
                   accessibilityNodeInfoList.get(0).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
               }
               openAlbum();
           }
       }, 1500);
   }
   /**
    * 開啟相簿
    */

   private void openAlbum() {
       new Handler().postDelayed(new Runnable() {
           @Override
           public void run()
{
               if (accessibilityNodeInfo == null) {
                   return;
               }
               List<AccessibilityNodeInfo> accessibilityNodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/axk");
               if (accessibilityNodeInfoList != null && accessibilityNodeInfoList.size() != 0 && accessibilityNodeInfoList.get(0).getChildCount() != 0) {
                   accessibilityNodeInfoList.get(0).getChild(1).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                   LogUtil.e("開啟相簿!");
                   SharedPreferences sharedPreferences = getSharedPreferences(Constant.WECHAT_STORAGE, Activity.MODE_PRIVATE);
                   if (sharedPreferences != null) {
                       int index = sharedPreferences.getInt(Constant.INDEX, 0);
                       int count = sharedPreferences.getInt(Constant.COUNT, 0);
                       choosePicture(index, count);
                   }
               }
           }
       }, 1500);
   }
   @Override
   public void onInterrupt()
{
   }
   /**
    * Called by the system to notify a Service that it is no longer used and is being removed.  The
    * service should clean up any resources it holds (threads, registered
    * receivers, etc) at this point.  Upon return, there will be no more calls
    * in to this Service object and it is effectively dead.  Do not call this method directly.
    */

   @Override
   public void onDestroy()
{
       super.onDestroy();
       LogUtil.e("服務被殺死!");
   }
}

四、注意事項
1、Android裝置必須安裝微信app
2、Android Sdk Version>18
特別提醒(不需要獲取root許可權)

五、開源地址
點選【閱讀原文】

640?wx_fmt=jpeg