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



  • 相关阅读:
    获取UltraWebTree指定节点的所有父节点内容
    OnClientClick
    ListControl控件经典用法
    DataTable添加列时容易被忽略的问题!
    利用数据库来填充UltraWebTree
    Web导出Word需要添加头文件
    程序中添加动态用户密码
    重构oninit,应用在模式窗口的方法
    防SQL注入
    获得connect string简单方法
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7291692.html
Copyright © 2011-2022 走看看