zoukankan      html  css  js  c++  java
  • Android实现微信自己主动抢红包的程序

    简单实现了微信自己主动抢红包的服务,原理就是依据keyword找到对应的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";
        /**
         * 红包消息的keyword
         */
        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;
                    }
                }
            }
        }
    }



  • 相关阅读:
    PythonStudy——数据类型总结 Data type summary
    PythonStudy——可变与不可变 Variable and immutable
    PythonStudy——列表操作 List operatio
    PythonStudy——列表的常用操作 List of common operations
    PythonStudy——列表类型 List type
    PythonStudy——字符串扩展方法 String extension method
    PythonStudy——字符串重要方法 String important method
    AWT,Swing,RCP 开发
    JQuery插件机制
    最新知识网站
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7291692.html
Copyright © 2011-2022 走看看