博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android实现微信自己主动抢红包的程序
阅读量:5315 次
发布时间:2019-06-14

本文共 8172 字,大约阅读时间需要 27 分钟。

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

AndroidManifest.xml

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

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;/** * 

Created by Administrator

*

* 抢红包外挂服务 */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
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
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
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; } } } }}

转载于:https://www.cnblogs.com/yangykaifa/p/7291692.html

你可能感兴趣的文章
Unity 5.4 测试版本新特性---因吹丝停
查看>>
7.5 文件操作
查看>>
MyEclipse中将普通Java项目convert(转化)为Maven项目
查看>>
node js 安装.node-gyp/8.9.4 权限 无法访问
查看>>
windows基本命令
查看>>
VMware中CentOS设置静态IP
查看>>
[poj1006]Biorhythms
查看>>
Hyper-V虚拟机上安装一个图形界面的Linux系统
查看>>
Hover功能
查看>>
js千分位处理
查看>>
Mac---------三指拖移
查看>>
字符串类型的相互转换
查看>>
HTTP状态码
查看>>
iOS如何过滤掉文本中特殊字符
查看>>
基础学习:C#中float的取值范围和精度
查看>>
MongoDB-CRUD
查看>>
javaagent 简介
查看>>
python升级安装后的yum的修复
查看>>
Vim配置Node.js开发工具
查看>>
web前端面试题2017
查看>>