分享一个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" ><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid: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><serviceandroid: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-dataandroid: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"><Buttonandroid: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.javapackage 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);startBtn = (Button) findViewById(R.id.start);startBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic 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();}}});}@Overridepublic 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;}@Overridepublic 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 SimplifiableIfStatementif (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);} }EnvelopeService.javapackage 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();@Overridepublic 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);}}/*@Overrideprotected boolean onKeyEvent(KeyEvent event) {//return super.onKeyEvent(event);return true;}*/@Overridepublic void onInterrupt() {Toast.makeText(this, "中断抢红包服务", Toast.LENGTH_SHORT).show();}@Overrideprotected 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;}}}}}以上就是分享一个Android实现微信自动抢红包的代码实例的详细内容,更多请关注小潘博客其它相关文章!