微信搶紅包遊戲繞過指定尾數

塵封的記憶0發表於2017-01-08

最近朋友推薦玩微信紅包賭博遊戲,大概的意思就是你搶到了制定尾數的紅包,你就要給那個人發相同數量的金額。比如你發紅包的時候這邊寫10/2或者10.....2等等的寫法,就表示發了10塊錢,指定尾數是2,如果搶到尾數是2的紅包,你就要給最初發紅包的那個人轉10塊錢。之前博主天真的認為這是概率,大家都是公平的,就隨便玩玩,結果沒想到原來很多人靠這個發財致富。他們可以作弊,不過作弊的軟體只能在蘋果機子上用,一個好幾千,就自動跳過指定的尾數。結果輸了幾百塊錢,後面分析了其中的原理,在安卓上開發了一個小軟體,下面將程式碼公開,希望大牛能做得更好,終於把之前輸的錢贏回來了,不過這種搶紅包遊戲小賭怡情,大賭傷身,強賭灰飛煙滅的。希望大家如果玩的話要慎重。


網上有很多自動強紅包的例子和程式碼,博主也是做了一些優化。 
先說說自己的兩個個優勢 
1.可以在聊天介面自動強不依賴於通知欄推送 ,就不會錯過任何一個紅包了
2.可以在螢幕熄滅的時候的時候點亮螢幕自動搶,繞過指定尾數
先上圖:

這裡寫圖片描述


原理: 
通過AccessibilityService監聽到狀態列通知,進行模擬點選,獲取螢幕中view節點為領取紅包的list並且點選最後一個。 
如果不通過狀態列通知,通過檢視變化AccessibilityEvent的2048事件也是就

public static final int TYPE_WINDOW_CONTENT_CHANGED = 0x00000800;
  • 1
  • 1

每次接受到新訊息都會有這個時間的回撥:

public void onAccessibilityEvent(AccessibilityEvent event) {
        int eventType = event.getEventType();
        if (auto)
            Log.e("AAAAAAAA", "有事件" + eventType);
        switch (eventType) {
            //當通知欄發生改變時
            case 2048:
                pubclassName = event.getClassName().toString();

                Log.e("AAAAAAAA", "有2048事件" + pubclassName + auto);

                if (!auto && pubclassName.equals("android.widget.TextView") && ALL) {
                    Log.e("AAAAAAAA", "有2048事件被識別" + auto + pubclassName);
                    getLastPacket(1);
                }
                if (auto && WXMAIN) {
                    getLastPacket();
                    auto = false;
                }

                break;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

所以在接受的時候,去處理一下去點選領取紅包。然而這個方法會被頻發呼叫,我們就加一個”Android.widget.TextView”事件類的篩選,然後還是會被很頻繁呼叫,會比較遲效能耗電。 
那就加個布林ALL標誌位,讓使用者控制是否開啟聊天介面內也搶紅包的模式。 
為了不反覆領取要記錄上次介面內的紅包數量在紅包增加的時候才去領取:

private void getLastPacket(int c) {

        Log.e("AAAAAAAA", "新方法" + parents.size());
        AccessibilityNodeInfo rootNode = getRootInActiveWindow();
        recycle(rootNode);
        Log.e("AAAAAAAA", "last++" + lastbagnum + "當前頁面紅包數" + parents.size());
        if (parents.size() > 0 && WXMAIN) {
            Log.e("AAAAAAAA", "頁面大於O且在微信介面");
            if (lastbagnum < parents.size())
                parents.get(parents.size() - 1).performAction(AccessibilityNodeInfo.ACTION_CLICK);
            lastbagnum = parents.size();
            parents.clear();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

目前在通過外掛領過幾個紅包後,一個聊天介面突然發第一個紅包(沒有通知欄)會有一定機率領取不到,再繼續發就正常了,應該是清空問題,該bug博主者也在更改邏輯中。

點亮螢幕方法(有密碼肯定是不行的):

private void wakeAndUnlock2(boolean b)
    {
        if(b)
        {
            //獲取電源管理器物件
            pm=(PowerManager) getSystemService(Context.POWER_SERVICE);

            //獲取PowerManager.WakeLock物件,後面的引數|表示同時傳入兩個值,最後的是除錯用的Tag
            wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");

            //點亮螢幕
            wl.acquire();

            //得到鍵盤鎖管理器物件
            km= (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
            kl = km.newKeyguardLock("unLock");

            //解鎖
            kl.disableKeyguard();
        }
        else
        {
            //鎖屏
            kl.reenableKeyguard();

            //釋放wakeLock,關燈
            wl.release();
        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

接受到通知欄的紅包訊息亮屏設定標誌位為自動領取,調取領取函式:

if (content.contains("[微信紅包]")) {
                            if (event.getParcelableData() != null &&
                                    event.getParcelableData() instanceof Notification) {
                                Notification notification = (Notification) event.getParcelableData();
                                PendingIntent pendingIntent = notification.contentIntent;
                                try {
                                    auto = true;
                                    wakeAndUnlock2(true);
                                    pendingIntent.send();
                                    Log.e("demo", "進入微信" + auto + event.getClassName().toString());
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

點選介面控制元件方法:(不同微信版本控制元件id不一樣我的是6.3.25)如果不知道怎麼獲取這個id可以看下面的參考文獻最後一個,右側的resource-id就是這個id

順便說一下目前安卓最新版6.3.31開紅包按鈕的id是com.tencent.mm:id/bg7換成這個就好了

這裡寫圖片描述

 click("com.tencent.mm:id/bag");
  • 1
  • 1

在Activity中設定聊天中領取開關:

public void start(View v) {
        if (AirAccessibilityService.ALL) {
            AirAccessibilityService.ALL = false;
            ((Button) v).setText("對話內監控+關");
        } else {
            AirAccessibilityService.ALL = true;
            ((Button) v).setText("對話內監控+開");
        }
        ;

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

AccessibilityService的確很吊,你用AccessibilityService或者root後的安卓手機能幹太多事了,或好或壞,但畢竟技術是無罪的。

大嬸們多多搞出點事情,讓技術造福人類。哈哈哈哈。


想買原始碼或者買外掛的,留言。。。

相關文章