请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
wmp4
9年前发布

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;                  }              }          }      }  }