微信,QQ 抢红包

微信QQ抢红包,相信随便搜索一下,结果真不少。我这里的版本是尽可能的完善到完美。


不错,我们都是用AccessbilityServcie类来处理。在使用之前先生成它的配置文件,在res目录下创建一个xml文件夹,创建这个配置文件

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:canRetrieveWindowContent="true"
    android:description="@string/fetch_luncky_money"
    android:notificationTimeout="100"
    android:packageNames="com.tencent.mm,com.tencent.mobileqq" />

这里,我们需要监听的微信和QQ的包名都写上去。

然后创建Service类继承AccessbilityServcie类,然后在Manifest中声明并引用配置。

<service
            android:name=".RedPocketService"
            android:enabled="true"
            android:exported="true"
            android:label="@string/app_name"
            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/red_pocket" />
        </service>

重点是在我们自己创建的Service类继承Accessiblity类中,重写onAccessibilityEvent的方法,这里我们希望利用这个事件去分析,到底鉴定到了什么,我们需要把这些内容打印出来

        Log.e(TAG,"《=======================================================");
        Log.e(TAG,"【packagename】: "+event.getPackageName());
        Log.e(TAG,"【classname】: "+event.getClassName());
        Log.e(TAG,"【source】: "+event.getSource());
        Log.e(TAG,"【evenType】: "+AccessibilityEvent.eventTypeToString(event.getEventType()));
        Log.e(TAG,"========================================================》");

通过上面答应出来的evenType,就可以看到当我们操作微信/QQ的时候说触发的时间,以及相应的一些类名,控件等。比如我们需要拆开红包这个例子:
 AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
        if (nodeInfo != null) {
            List<AccessibilityNodeInfo> list = new ArrayList<AccessibilityNodeInfo>();
            //中文版
            list.addAll(nodeInfo.findAccessibilityNodeInfosByText("拆红包"));
            //英文版
            list.addAll(nodeInfo.findAccessibilityNodeInfosByText("Open"));
            //部分中文版text上面没有任何字
            if(list.size()==0) {
                int nodeSize = nodeInfo.getChildCount();
                for (int i = 0; i < nodeSize; i++) {
                    if (nodeInfo.getChild(i).getClassName().toString().equals("android.widget.Button")) {
                        list.add(nodeInfo.getChild(i));
                    }
                }
            }

            if(list!=null && list.size()!=0)
                list.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
思路是通过getRootInActiveWindow()来获取当前活动页面的所有ui控件的节点,在通过节点的findAccessibilityNodeInfosByText就是根据控件的属性text去寻找到相应的节点,然后通过节点在进行一个模拟点击。不要企图用findAccessibilityNodeInfosByViewId去选择ui控件,因为编译后的id跟我们平常写代码定义的id不太一样,这里的id是会变动的,它相当于我们R.java文件所指向的id地址。

利用Android SDK目录下的tools工具uiautomatorviewer去分析ui上面的控件类型和相应的text属性上面的文字信息。

当然,一般搜到的晚上的代码只有通知消息,但是我希望当停留在软件聊天的时候依然可以抢红包,然后发现了一些事件被触发时候就可以调用到,比如在微信聊天时候,聊天记录所在的listview会发生滚动,则,我们需要监听这个listview的滚动时间,再做一个红包判断处理。

具体代码见

https://github.com/arjinmc/GrabLuckyMoney



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值