一款QQ抢红包软件的源码,包含打开加Q群页面, 打开QQ会话窗口功能
核心service代码:
package com.moyan.hongbao.service;
import java.util.List;
import java.util.ArrayList;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.KeyguardManager;
import android.app.KeyguardManager.KeyguardLock;
import android.content.Intent;
import android.content.Context;
import android.os.Build;
import android.os.PowerManager;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.util.Log;
public class HongBaoService extends AccessibilityService {
private static final String TAG = "QiangHongBao";
private static final String QQ_CLASSNAME_CHAT = "com.tencent.mobileqq.activity.SplashActivity";
private static final String QQ_CLASSNAME_WALLET = "cooperation.qwallet.plugin.QWalletPluginProxyActivity";
private static final String QQ_KEYWORD_NOTIFICATION = "[QQ红包]";
private static final String[] QQ_KEYWORD_HONGBAO= new String[]{"点击拆开","口令红包"};
private static final String[] QQ_KEYWORD_SEND_LIST= new String[]{"点击输入口令","发送"};
private static final String QQ_KEYWORD_FAILD_CLICK= "已拆开";
/*
*静态变量来保存戳口令红包时第2步和第3步的节点
*避免每次都进行查找,提高戳红包效率
*/
private static List<AccessibilityNodeInfo> sendNodeList;
//返回状态,判断是否需要戳返回键
private boolean isNeedBack=false;
//运行状态,从开始戳红包到结束时,不应该再有其它操作
private boolean runState=false;
//窗口状态,这个主要是区分窗口状态改变和内容改变时对屏幕的读取
private boolean windowState=false;
// 键盘管理器
private KeyguardManager mKeyguardManager;
// 键盘锁
private KeyguardLock mKeyguardLock;
// 电源管理器
private PowerManager mPowerManager;
// 唤醒锁
private PowerManager.WakeLock mWakeLock;
long time;
@Override
protected void onServiceConnected() {
super.onServiceConnected();
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType()==AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
List<CharSequence> texts = event.getText();
if (!texts.isEmpty()) {
for (CharSequence text : texts) {
String content = text.toString();
if (content.contains(QQ_KEYWORD_NOTIFICATION)) {
openNotify(event);
return;
}
}
}
}
openHongBao(event);
}
@Override
public void onInterrupt() {
}
/** 打开通知栏消息*/
private void openNotify(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();
}
}
private void openHongBao(AccessibilityEvent event){
String className=event.getClassName().toString();
Log.i(TAG,className);
if(className.equals(QQ_CLASSNAME_WALLET)&&isNeedBack){
performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
isNeedBack=false;
}else if(className.equals(QQ_CLASSNAME_CHAT)||(event.getEventType()==AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED&&windowState)) {
//wakeAndUnlock(true);
windowState=true;
if(!runState){
AccessibilityNodeInfo info = event.getSource();
if(info == null) return;
getAllHongBao(info);
}
}else{
windowState=false;
}
}
private void onClick(){
if(sendNodeList==null||sendNodeList.size()==0){
AccessibilityNodeInfo info = getRootInActiveWindow();
if(info == null) return;
sendNodeList=new ArrayList<AccessibilityNodeInfo>();
for(String s:QQ_KEYWORD_SEND_LIST){
List<AccessibilityNodeInfo> infolist = info.findAccessibilityNodeInfosByText(s);
if(infolist.isEmpty()){
/**
*这里如果没查找到
*说明前面查找到的节点不对
* 再继续查找显然并没有什么卵用
*/
return;
}
for(AccessibilityNodeInfo node:infolist){
if(node.getText()==null||!node.getText().toString().equals(s)) continue;
sendNodeList.add(node);
}
}
}
for(AccessibilityNodeInfo node:sendNodeList){
AccessibilityNodeInfo in=getClickableNode(node);
if(in==null) continue;
Log.i(TAG,"模拟点击>>>" node.getText().toString());
in.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
isNeedBack=true;
}
private void getAllHongBao(AccessibilityNodeInfo info){
runState=true;
Log.i(TAG,"获取所有红包");
time=System.currentTimeMillis();
List<AccessibilityNodeInfo> list=new ArrayList<AccessibilityNodeInfo>();
//查找出当前页面所有的红包,包括手气红包和口令红包
for(String word:QQ_KEYWORD_HONGBAO){
List<AccessibilityNodeInfo> infolist = info.findAccessibilityNodeInfosByText(word);
if(!infolist.isEmpty()){
for(AccessibilityNodeInfo node:infolist){
//这里进行过滤可点击的红包,放到后面去过滤的话感觉非常操蛋
if(node.getText()==null||
//过滤出包含关键字的节点,只取和关键字相同的
!node.getText().toString().equals(word)||
/**
* 下面这个条件是过滤已拆开的红包
* 如果口令红包的口令设置成"口令红包"
* 会让插件陷入死循环,所以必须加个新的判断条件
* 不过这样会耗费更多的时间,所以口令尽量不要设置成关键字
*/
node.getParent().getChildCount()!=3||
!node.getParent().findAccessibilityNodeInfosByText(QQ_KEYWORD_FAILD_CLICK).isEmpty())
continue;
list.add(node);
}
}
}
if(list.size()==0) {
runState=false;
return ;
}
Log.i(TAG,"数量>>>" list.size() " 获取红包耗时:" (System.currentTimeMillis()-time) "ms");
clickAction(list);
}
private void clickAction(List<AccessibilityNodeInfo> infolist){
for(AccessibilityNodeInfo node :infolist){
String text=node.getText().toString();
AccessibilityNodeInfo info=getClickableNode(node);
if(info==null) continue;
Log.i(TAG,"模拟点击>>>" text);
info.performAction(AccessibilityNodeInfo.ACTION_CLICK);
if(text.equals(QQ_KEYWORD_HONGBAO[1])){
onClick();
}else{
isNeedBack=true;
}
}
runState=false;
Log.i(TAG,"总共耗时:" (System.currentTimeMillis()-time) "ms");
}
/**
* 获取一个可以点击的节点
*/
private AccessibilityNodeInfo getClickableNode(AccessibilityNodeInfo node){
AccessibilityNodeInfo parent=node;
while(parent!=null){
if(parent.isClickable()){
break;
}
parent=parent.getParent();
}
return parent;
}
private void wakeAndUnlock(boolean b){
if(b){
//获取电源管理器对象
mPowerManager=(PowerManager)getApplicationContext().getSystemService(Context.POWER_SERVICE);
//获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是调试用的Tag
mWakeLock = mPowerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
//点亮屏幕
mWakeLock.acquire();
//得到键盘锁管理器对象
mKeyguardManager= (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
mKeyguardLock= mKeyguardManager.newKeyguardLock("unLock");
//解锁
mKeyguardLock.disableKeyguard();
}else{
//锁屏
mKeyguardLock.reenableKeyguard();
//释放wakeLock,关灯
mWakeLock.release();
}
}
}
主界面代码:
package com.moyan.hongbao.ui;
import java.net.InetAddress;
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.widget.TextView;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebChromeClient;
import com.moyan.hongbao.R;
public class MainActivity extends Activity implements OnClickListener {
TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//txt=(TextView)findViewById(R.id.txtHelp);
findViewById(R.id.btnSetting).setOnClickListener(this);
findViewById(R.id.btnAuthor).setOnClickListener(this);
findViewById(R.id.btnJoin).setOnClickListener(this);
}
@Override
public void onClick(View p1){
switch(p1.getId()){
case R.id.btnSetting:
openSetting();
break;
case R.id.btnAuthor:
contactAuthor("269139812");
break;
case R.id.btnJoin:
joinQQGroup("nwEuPSLNqjGGyj538_vPXhn4MVcX0_kJ");
break;
}
}
private void openSetting() {
try {
Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean joinQQGroup(String key) {
Intent intent = new Intent();
intent.setData(android.net.Uri.parse("mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D" key));
try {
startActivity(intent);
return true;
} catch (Exception e) {
return false;
}
}
public void contactAuthor(String u){
WebView webView = new WebView(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://wpa.qq.com/msgrd?v=1&uin=" u "&site=qq&menu=yes");
webView.setWebChromeClient(new WebChromeClient(){});
}
}
资源文件列表
红包机器人/.gradle/1.12/taskArtifacts/cache.properties , 32
红包机器人/.gradle/1.12/taskArtifacts/cache.properties.lock , 17
红包机器人/.gradle/1.12/taskArtifacts/fileHashes.bin , 21069
红包机器人/.gradle/1.12/taskArtifacts/fileSnapshots.bin , 51911
红包机器人/.gradle/1.12/taskArtifacts/outputFileStates.bin , 19202
红包机器人/.gradle/1.12/taskArtifacts/taskArtifacts.bin , 47407
红包机器人/.idea/.name , 14
红包机器人/.idea/compiler.xml , 734
红包机器人/.idea/copyright/profiles_settings.xml , 76
红包机器人/.idea/encodings.xml , 171
红包机器人/.idea/gradle.xml , 580
红包机器人/.idea/misc.xml , 406
红包机器人/.idea/modules.xml , 377
红包机器人/.idea/scopes/scope_settings.xml , 143
红包机器人/.idea/vcs.xml , 173
红包机器人/.idea/workspace.xml , 93453
红包机器人/app/app.iml , 4992
红包机器人/app/build.gradle , 551
红包机器人/app/proguard-rules.pro , 695
红包机器人/app/src/main/AndroidManifest.xml , 1659
红包机器人/app/src/main/java/com/moyan/hongbao/ui/SplashActivity.java , 2079
红包机器人/app/src/main/java/com/moyan/hongbao/ui/MainActivity.java , 2057
红包机器人/app/src/main/java/com/moyan/hongbao/service/HongBaoService.java , 8134
红包机器人/app/src/main/res/drawable-hdpi/bg2.jpg , 10626
红包机器人/app/src/main/res/drawable-hdpi/bg3.jpg , 11664
红包机器人/app/src/main/res/drawable-hdpi/bg4.jpg , 11199
红包机器人/app/src/main/res/drawable-hdpi/btn_light_bg.png , 5184
红包机器人/app/src/main/res/drawable-hdpi/ic_launcher.png , 696
红包机器人/app/src/main/res/drawable-hdpi/bg1.jpg , 13187
红包机器人/app/src/main/res/layout/main.xml , 2329
红包机器人/app/src/main/res/values/strings.xml , 1101
红包机器人/app/src/main/res/values/styles.xml , 923
红包机器人/app/src/main/res/values/colors.xml , 491
红包机器人/app/src/main/res/values-v21/styles.xml , 146
红包机器人/app/src/main/res/xml/config.xml , 528
红包机器人/app/src/main/res/anim/from_in_bottom.xml , 302
红包机器人/app/src/main/res/anim/activity_anim.xml , 278
红包机器人/app/src/main/res/drawable/btn_selector.xml , 336
红包机器人/app/build/bin/gen/AndroidManifest.xml , 1562
红包机器人/app/build/bin/res/drawable-hdpi/btn_light_bg.png , 5184
红包机器人/app/build/bin/res/drawable-hdpi/ic_launcher.png , 805
红包机器人/app/build/bin/resources.ap_ , 61424
红包机器人/app/build/bin/classes2/com/moyan/hongbao/service/HongBaoService.class , 6753
红包机器人/app/build/bin/classes2/com/moyan/hongbao/service/RobMoney.dex , 8668
红包机器人/app/build/bin/classes2/com/moyan/hongbao/service/RobMoney$100000000.dex , 1428
红包机器人/app/build/bin/classes2/com/moyan/hongbao/service/RobMoney$100000001.dex , 1428
红包机器人/app/build/bin/classes2/com/moyan/hongbao/service/HongBaoService.dex , 7008
红包机器人/app/build/bin/classes2/com/moyan/hongbao/service/HongBaoService$100000000.dex , 1116
红包机器人/app/build/bin/classes2/com/moyan/hongbao/BuildConfig.class , 314
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R.class , 687
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$anim.class , 408
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$attr.class , 313
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$color.class , 593
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$drawable.class , 556
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$id.class , 579
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$layout.class , 365
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$string.class , 582
红包机器人/app/build/bin/classes2/com/moyan/hongbao/BuildConfig.dex , 524
红包机器人/app/build/bin/classes2/com/moyan/hongbao/MainActivity.dex , 984
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R.dex , 916
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$attr.dex , 692
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$drawable.dex , 932
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$layout.dex , 760
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$string.dex , 956
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$style.dex , 820
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$xml.dex , 756
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$style.class , 432
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$xml.class , 361
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$color.dex , 964
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$id.dex , 956
红包机器人/app/build/bin/classes2/com/moyan/hongbao/ui/MainActivity.class , 2801
红包机器人/app/build/bin/classes2/com/moyan/hongbao/ui/MainActivity$100000000.class , 602
红包机器人/app/build/bin/classes2/com/moyan/hongbao/ui/SplashActivity.class , 1856
红包机器人/app/build/bin/classes2/com/moyan/hongbao/ui/MainActivity.dex , 3284
红包机器人/app/build/bin/classes2/com/moyan/hongbao/ui/SplashActivity.dex , 2336
红包机器人/app/build/bin/classes2/com/moyan/hongbao/ui/SplashActivity$100000000.dex , 1976
红包机器人/app/build/bin/classes2/com/moyan/hongbao/ui/SplashActivity$100000000.class , 1582
红包机器人/app/build/bin/classes2/com/moyan/hongbao/ui/MainActivity$100000000.dex , 904
红包机器人/app/build/bin/classes2/com/moyan/hongbao/R$anim.dex , 800
红包机器人/app/build/bin/classes2/LogCatBroadcaster.class , 2332
红包机器人/app/build/bin/classes2/LogCatBroadcaster.dex , 2560
红包机器人/app/build/bin/classes.dex , 16988
红包机器人/app/build/bin/红包机器人.apk , 73092
红包机器人/app/build/gen/com/moyan/hongbao/BuildConfig.java , 159
红包机器人/app/build/gen/com/moyan/hongbao/R.java , 2729
红包机器人/build.gradle , 456
红包机器人/gradle.properties , 870
红包机器人/gradle/wrapper/gradle-wrapper.jar , 49896
红包机器人/gradle/wrapper/gradle-wrapper.properties , 236
红包机器人/gradlew , 5244
红包机器人/gradlew.bat , 2404
红包机器人/settings.gradle , 16
红包机器人/红包机器人.iml , 847
