快到年底了,又到了拼手速抢红包的时候了;其实很早之前就做过抢红包软件了,包括QQ和微信;所以自己开始重新写一个抢红包的软件(其实是因为实在是太简单了),只做微信,因为QQ发红包的确用的太少了,而且QQ红包花样也太多了,什么唱歌、画画、成语接龙...
配置要求
序列号 | CPU | RAM | HDD | 带宽 | 售价(美元) | 免费试用 |
---|---|---|---|---|---|---|
香港服务器1 | E5-2620 | 32G | 1T HDD | 50M/无限流量 | $196.00 | 立即申请 |
香港服务器2 | E5-2650 | 32G | 1T HDD | 50M/无限流量 | $256.00 | 立即申请 |
香港服务器3 | E5-2680 | 32G | 1T HDD | 50M/无限流量 | $316.00 | 立即申请 |
香港服务器4 | E5-2690 | 32G | 1T HDD | 50M/无限流量 | $336.00 | 立即申请 |
香港服务器5 | E5-2697 | 32G | 1T HDD | 50M/无限流量 | $376.00 | 立即申请 |
香港服务器6 | E5-2620*2 | 32G | 1T HDD | 50M/无限流量 | $376.00 | 立即申请 |
香港服务器7 | E5-2650*2 | 32G | 1T HDD | 50M/无限流量 | $436.00 | 立即申请 |
香港服务器8 | E5-2680*2 | 32G | 1T HDD | 50M/无限流量 | $476.00 | 立即申请 |
香港服务器9 | E5-2690*2 | 32G | 1T HDD | 50M/无限流量 | $556.00 | 立即申请 |
香港服务器10 | E5-2697*2 | 32G | 1T HDD | 50M/无限流量 | $596.00 | 立即申请 |
香港服务器11 | E5-2680v4*2 | 32G | 1T HDD | 50M/无限流量 | $696.00 | 立即申请 |
香港服务器12 | E5-2698v4*2 | 32G | 1T HDD | 50M/无限流量 | $796.00 | 立即申请 |
Android系统 7.0及以上,辅助功能7.0以上支持模拟点击,模拟点击不是必须的,但是对于实现快很重要。
实现原理
实现方法就是利用Android辅助功能,开启辅助功能相当于开启了一个服务,在手机界面改变的时候,就能监听到该页面的一些信息并且能拿到界面的一些控件,然后可以对控件进行模拟点击,从而实现我们想要的功能。
除此以外,不仅能够对获取到的控件进行模拟点击,在Android7.0及以上的版本,我们可以模拟任意位置的点击包括触摸、滑动等等,就是说我们可以实现任何人能够进行的操作,这个是很有用的,可以做出很多有意思的东西,如果再配上截图、录屏和图像识别,就更有意思了。
模拟点击,就是说我们的手机界面自己动,整个流程像是一只手在帮你操作一样的;其实我见过更牛逼的方法,连解锁都不需要直接就领了红包,界面没有任何变化的;感觉上是通过通信,发数据给微信服务器实现的,当然这种是需要root权限的,并且得去解析微信的通信协议,我自然没时间去搞(其实有时间也不一定能搞出来)。
具体实现
辅助功能
首先是辅助功能,新建一个Service继承AccessibilityService
public class LuckMoneyService extends AccessibilityService
然后去AndroidManifest文件里面去注册一下这个Service
android:name=".service.LuckMoneyService" android:label="小圆脸的红包助手" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> android:name="android.accessibilityservice" android:resource="@xml/accessible_service_wx_config" />
在meta-data节点下有个resource值,这是个xml文件,里面配置了该辅助的一些信息,在res目录下新建一个文件夹,名字叫xml,然后新建一个xml文件,名字和resource配置的一样就行了
android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged|typeNotificationStateChanged" android:accessibilityFeedbackType="feedbackAllMask" android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews|flagReportViewIds" android:canRetrieveWindowContent="true" android:canRequestFilterKeyEvents="true" android:description="@string/wx_luck_money" android:canRequestEnhancedWebAccessibility="true" android:notificationTimeout="20" android:packageNames="com.tencent.mm" android:canPerformGestures="true" /> 里面配置了一些参数,比如notificationTimeout是指定多少毫秒监听一次界面变化的,packageNames是指定监听哪个应用的,删掉这个配置就是监听全局,建议一定要删除掉,我这里只是展示用,description是对于该辅助的描述,其他配置不管也罢。 然后在LuckMoneyService里面重写一下onAccessibilityEvent方法 @Override public void onAccessibilityEvent(AccessibilityEvent event) { //界面发生了变化 } 每当界面改变的时候就会回调这个方法,通过event我们就可以获取到界面的信息包括界面上的控件 简单的用法 //获取当前界面包名 String packageName = event.getPackageName().toString(); //获取当前类名 String className = event.getClassName().toString(); //获取当前界面父布局的控件 AccessibilityNodeInfo accessibilityNodeInfo = getRootInActiveWindow(); //在父布局里面根据子控件**显示的文字**找到该子控件 List //在父布局里面根据子控件的**id**找到该子控件 List //点击该控件 nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); 上面的操作都比较基础,根据控件显示的文字查找控件,找出来的肯定是TextView和Button了,根据ID查找控件,ID就是指的写布局文件的时候设置的控件的ID 模拟触摸 模拟触摸就是可以模拟人的触摸动作,也比较简单 protected void gestureOnScreen(Path path, long startTime, long duration, AccessibilityService.GestureResultCallback callback) { GestureDescription.Builder builde = new GestureDescription.Builder(); builde.addStroke(new GestureDescription.StrokeDescription(path, startTime, duration)); GestureDescription gestureDescription = builde.build(); dispatchGesture(gestureDescription, callback, null); } 可以看到需要传入path就是一个路径嘛,模拟滑动的路径,用canvas画过画的都知道这东西还是比较简单的,不清楚也没关系,继续看,startTime就是多久后开始模拟事件,duration就是该滑动的时间,其他回调什么的为空就可以了; 辅助功能能做的东西大概就上面这些了,接下来看看 微信应用外的红包处理 首先实现在微信界面外怎么抢红包,在微信界面外有红包出现必然会在通知栏会显示微信红包(如果没开通知消息,那你自己开一下不就完事了吗),只需要在回调方法里面判断一下是不是通知消息,如果是通知消息,获取里面的信息,判断是不是微信红包通知消息,是就点击该消息,会自动跳转到聊天界面; 因为我们是监听界面变化来实现功能的,所以在一个界面触发了界面变化的时候,接下来的处理就应该交给下一个界面的方法了,所以微信界面外的操作就是这些了 /** * 红包标识字段 */ public static final String HONG_BAO_TXT = "[微信红包]"; //通知栏消息,判断是不是红包消息 if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) { Notification notification = (Notification) event.getParcelableData(); //获取通知消息详情 String content = notification.tickerText.toString(); //解析消息 String[] msg = content.split(":"); String text = msg[1].trim(); if (text.contains(HONG_BAO_TXT)) { PendingIntent pendingIntent = notification.contentIntent; try { //点击消息,进入聊天界面 pendingIntent.send(); } catch (PendingIntent.CanceledException e) {