分享一个Android实现微信自动抢红包的代码实例

简单实现了微信自动抢红包的服务,原理就是根据关键字找到相应的View, 然后自动点击。主要是用到AccessibilityService这个辅助服务,基本可以满足自动抢红包的功能,但是有些逻辑需要优化,比如,拆完一个红包后,必须手动点击返回键,才能进行下一次自动抢红包。

AndroidManifest.xml
   
<?xml version=1.0 encoding=utf-8?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
    package=com.jackie.webchatenvelope >
 
    <application
        android:allowBackup=true
        android:icon=@mipmap/ic_launcher
        android:label=@string/app_name
        android:theme=@style/AppTheme >
        <activity
            android:name=.MainActivity
            android:label=@string/app_name >
            <intent-filter>
                <action android:name=android.intent.action.MAIN />
 
                <category android:name=android.intent.category.LAUNCHER />
            </intent-filter>
        </activity>
 
        <service
            android:enabled=true
            android:exported=true
            android:label=@string/app_name
            android:name=.EnvelopeService
            android:permission=android.permission.BIND_ACCESSIBILITY_SERVICE>
            <intent-filter>
                <action android:name=android.accessibilityservice.AccessibilityService/>
            </intent-filter>
            <meta-data
                android:name=android.accessibilityservice
                android:resource=@xml/envelope_service_config/>
        </service>
    </application>
 
</manifest>
   
envelope_service_config.xml
   
<?xml version=1.0 encoding=utf-8?>
<accessibility-service xmlns:android=http://schemas.android.com/apk/res/android
    android:accessibilityEventTypes=typeNotificationStateChanged|typeWindowStateChanged
    android:accessibilityFeedbackType=feedbackGeneric
    android:accessibilityFlags=
    android:canRetrieveWindowContent=true
    android:description=@string/accessibility_description
    android:notificationTimeout=100
    android:packageNames=com.tencent.mm />
   
activity_main.xml
   
<RelativeLayout xmlns:android=http://schemas.android.com/apk/res/android
    xmlns:tools=http://schemas.android.com/tools
    android:layout_width=match_parent
    android:layout_height=match_parent
    android:paddingBottom=@dimen/activity_vertical_margin
    android:paddingLeft=@dimen/activity_horizontal_margin
    android:paddingRight=@dimen/activity_horizontal_margin
    android:paddingTop=@dimen/activity_vertical_margin
    tools:context=.MainActivity>
 
    <Button
        android:id=@+id/start
        android:layout_width=wrap_content
        android:layout_height=wrap_content
        android:padding=10dp
        android:layout_centerInParent=true
        android:textSize=18sp
        android:text=打开辅助服务/>
 
</RelativeLayout>
   
MainActivity.java
   
package com.jackie.webchatenvelope; 
   
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 
   
public class MainActivity extends Activity { 
    private Button startBtn; 
   
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
   
        startBtn = (Button) findViewById(R.id.start); 
        startBtn.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                try { 
                    //打开系统设置中辅助功能 
                    Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS); 
                    startActivity(intent); 
                    Toast.makeText(MainActivity.this, 找到抢红包,然后开启服务即可, Toast.LENGTH_LONG).show(); 
                } catch (Exception e) { 
                    e.printStackTrace(); 
                } 
            } 
        }); 
    } 
   
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        // Inflate the menu; this adds items to the action bar if it is present. 
        getMenuInflater().inflate(R.menu.menu_main, menu); 
        return true; 
    } 
   
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
        // Handle action bar item clicks here. The action bar will 
        // automatically handle clicks on the Home/Up button, so long 
        // as you specify a parent activity in AndroidManifest.xml. 
        int id = item.getItemId(); 
   
        //noinspection SimplifiableIfStatement 
        if (id == R.id.action_settings) { 
            return true; 
        } 
   
        return super.onOptionsItemSelected(item); 
    } 
}
   
EnvelopeService.java
   
package com.jackie.webchatenvelope;
 
import android.accessibilityservice.AccessibilityService;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.PendingIntent;
import android.os.Build;
import android.os.Handler;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;
 
import java.util.List;
 
/**
 * <p>Created by Administrator</p>
 * <p/>
 * 抢红包外挂服务
 */
public class EnvelopeService extends AccessibilityService {
 
    static final String TAG = Jackie;
 
    /**
     * 微信的包名
     */
    static final String WECHAT_PACKAGENAME = com.tencent.mm;
    /**
     * 红包消息的关键字
     */
    static final String ENVELOPE_TEXT_KEY = [微信红包];
 
    Handler handler = new Handler();
 
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        final int eventType = event.getEventType();
 
        Log.d(TAG, 事件----> + event);
 
        //通知栏事件
        if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
            List<CharSequence> texts = event.getText();
            if (!texts.isEmpty()) {
                for (CharSequence t : texts) {
                    String text = String.valueOf(t);
                    if (text.contains(ENVELOPE_TEXT_KEY)) {
                        openNotification(event);
                        break;
                    }
                }
            }
        } else if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            openEnvelope(event);
        }
    }
 
    /*@Override
    protected boolean onKeyEvent(KeyEvent event) {
        //return super.onKeyEvent(event);
        return true;
    }*/
 
    @Override
    public void onInterrupt() {
        Toast.makeText(this, 中断抢红包服务, Toast.LENGTH_SHORT).show();
    }
 
    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        Toast.makeText(this, 连接抢红包服务, Toast.LENGTH_SHORT).show();
    }
 
    private void sendNotificationEvent() {
        AccessibilityManager manager = (AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE);
        if (!manager.isEnabled()) {
            return;
        }
        AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED);
        event.setPackageName(WECHAT_PACKAGENAME);
        event.setClassName(Notification.class.getName());
        CharSequence tickerText = ENVELOPE_TEXT_KEY;
        event.getText().add(tickerText);
        manager.sendAccessibilityEvent(event);
    }
 
    /**
     * 打开通知栏消息
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void openNotification(AccessibilityEvent event) {
        if (event.getParcelableData() == null || !(event.getParcelableData() instanceof Notification)) {
            return;
        }
        //以下是精华,将微信的通知栏消息打开
        Notification notification = (Notification) event.getParcelableData();
        PendingIntent pendingIntent = notification.contentIntent;
        try {
            pendingIntent.send();
        } catch (PendingIntent.CanceledException e) {
            e.printStackTrace();
        }
    }
 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void openEnvelope(AccessibilityEvent event) {
        if (com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI.equals(event.getClassName())) {
            //点中了红包,下一步就是去拆红包
            checkKey1();
        } else if (com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI.equals(event.getClassName())) {
            //拆完红包后看详细的纪录界面
            //nonething
        } else if (com.tencent.mm.ui.LauncherUI.equals(event.getClassName())) {
            //在聊天界面,去点中红包
            checkKey2();
        }
    }
 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void checkKey1() {
        AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
        if (nodeInfo == null) {
            Log.w(TAG, rootWindow为空);
            return;
        }
        List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(拆红包);
        for (AccessibilityNodeInfo n : list) {
            n.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
    }
 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void checkKey2() {
        AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
        if (nodeInfo == null) {
            Log.w(TAG, rootWindow为空);
            return;
        }
        List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(领取红包);
        if (list.isEmpty()) {
            list = nodeInfo.findAccessibilityNodeInfosByText(ENVELOPE_TEXT_KEY);
            for (AccessibilityNodeInfo n : list) {
                Log.i(TAG, -->微信红包: + n);
                n.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                break;
            }
        } else {
            //最新的红包领起
            for (int i = list.size() - 1; i >= 0; i--) {
                AccessibilityNodeInfo parent = list.get(i).getParent();
                Log.i(TAG, -->领取红包: + parent);
                if (parent != null) {
                    parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    break;
                }
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


网页授权获取用户信息的方法
报错config:invalid signature的解决方案
微信开发百思不得姐实战教程
详解微信开发input输入框
教你libco是如何支撑巨大数据信息量的
微信二次开发之文本消息请求与发送
微信开发H5轻游戏
scroll-view完成列表页的方法详解
Java微信开发之自定义菜单的创建
微信开发之input控件的实例详解
微信开发Emoji表情的实例教程
微信开发中详解textarea的使用方法
微信开发中使元素占满全屏的方法介绍
微信开发之数据访问的方法详解
微信二次开发之各类型消息封装
微信开发之数据库操作
如何获取微信好友的地理位置信息
分享3款微信开发开源框架
微信开发之获取服务器IP
微信开发之公交换乘功能代码详解