阅读 1807

在微信8.0上,教你写一个放烟花辅助|牛气冲天新年征文

前言

看完你也可以写一个烟花,给家人或者女盆友或者男朋友放一场环保的烟花。看了,岂不很浪漫。没有女盆友的就放给家人看吧!没有男盆友的,这点我可以帮助一下你。

先看个效果吧

是不是看着好像手动一样。哈哈,但是要是一直发100条,就不一样了。

下载地址

需要去github下载 助手apk地址

《青玉案·元夕》

宋·辛弃疾

东风夜放花千树,更吹落,星如雨。宝马雕车香满路。

凤箫声动,玉壶光转,一夜鱼龙舞。

蛾儿雪柳黄金缕,笑语盈盈暗香去。

众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。

其中东风夜放花千树,更吹落,星如雨。就是描写烟花的。

使用方法,我相信很多人根本不关心是如何实现的,因为我也一样。

进入主界面,去开启无障碍服务,不同品牌可能开启的页面不一样,注意到是放烟花那个服务开启就好,可以参考一下我的小米手机。

app界面

单位为秒是发送烟花间隔时间

放烟花次数这个就是发送烟花的次数

去打开烟花

开启成功后

开启成功后

使用方法就是在输入框里面输入开始放烟花啦,就可以开始发送烟火了,由于是监控输入框,可能不太及时,多试二次就好。遇到问题或在下方评论。

唠叨

本来早早就要写的了,出于种种原因没有写,问就是懒。当然也有一个原因,一直没办法拿到微信的聊天记录,那些聊天就是是一个view,没有文字。在微信8.0上,写了一个放烟花辅助,当然放炸弹也行。这里我就不从入门开始写了,因为我不擅长写入门文章,好吧!归根到底是我懒。

AccessibilityService

AccessibilityService设计初衷在于帮助残障用户使用android设备和应用,在后台运行,可以监听用户界面的一些状态转换,例如页面切换、焦点改变、通知、Toast等,并在触发AccessibilityEvents时由系统接收回调。后来被开发者另辟蹊径,用于一些插件开发,比如自动聊天助手,微信红包助手,这个我相信很多人都用过,小米开源了红包助手,把AccessibilityService推向了高潮。

开始吧

起初我想拿到微信聊天记录来触发放烟火的,由于一直拿不到微信的聊天记录。我只能退而求次,换个思路出发了。后面想想,think again ,think again ,think again.想到监听输入框来当命令吧。

android 工具uiautomatorviewer

这个工具是用来获取页面的布局数据的,工具在你的androidSdk\SDK\tools\bin(具体得你的安装目录)

第一步先监听触发命令

监听输入框,把输入框文字作为命令。代码写的挺简单的,没啥水平,也很急。所以凑合看吧。 这里步骤主要是

1,查找输入框节点,这个查找输入框节点下面说。

2,监听输入框。

3,消息发出去。

4,触发烟花发送。

5,重置一下数据。

    private fun listenerInputCmd() {

        if (isStart) return

        val editText = findInput() ?: return

        if (editText.text.isNullOrEmpty()) return

        if ("开始放烟花啦" != editText.text.toString()) {
            Log.d(TAG, "AccessibilityEvent editText1:" + editText.text)
            return
        }
        //寻找发送按钮
        val sendBtn = findSendButton() ?: return
        //把消息发出去,然后开始!
        val isSuccess = sendBtn.performAction(AccessibilityNodeInfo.ACTION_CLICK)
        if (!isSuccess) return
        
        reSet()
        
        isStart = true
    }

复制代码

我们使用工具uiautomatorviewer能分析到输入框的节点,如图所示,我们知道输入框节点为com.tencent.mm:id/auj了,那么我们就可以开始写代码了。

    /**
     * 查找输入框
     */
    private fun findInput(): AccessibilityNodeInfo? {
        //查找节点
        val input = rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/auj")
        if (input.isNullOrEmpty()) {
            return null
        }
        if (input[input.size - 1].className != "android.widget.EditText") {
            return null
        }
        return input[input.size - 1]
    }
复制代码

把烟花设置到输入框中,接着就按下发送按钮。

烟花设置到输入框中

来让我看看,是怎么把内容设置进去的。这块支持还是很多api的玩法。直接调用AccessibilityNodeInfo的performAction来设置内容。

 val arguments = Bundle()
 arguments.putCharSequence(
 AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "[庆祝]" )
 val editText = findInput()
 //输入框中输入礼花
 editText.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments)

复制代码

按下发送按钮

第一步我们要查找按钮,找到发送按钮的节点。如图中所示:

接着我们就知道按钮的节点ID是com.tencent.mm:id/ay5,那么我们就可以去调戏它了。还是利用findAccessibilityNodeInfosByViewId去准确定位节点。跟上面差不多的,我相信聪明的你一看就懂了。不懂可以私聊我。

    private fun findSendButton(): AccessibilityNodeInfo? {
        //消息发送按钮的节点。
        val sendButton =
            rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/ay5")
        if (sendButton.isNullOrEmpty()) {
            return null
        }
        sendButton.forEach {
            //匹配button
            if (it.className == "android.widget.Button") {
                Log.d(TAG, "found send button!")
                return it
            }
        }
        return null

    }


复制代码

历经千辛万苦,要进入发礼花的主题了

其实这个比较简单,这里忽略一下细节的判断,就从大的方面出发,我们分几步走。

1,发送休眠时间,发送太频繁,是发送不成功的,因为服务器受不了。这里建议休眠0.8秒浮动。

2,点击按钮发送按钮

3,查找输入框,设置礼花。

4,发送礼花到达最大次数,发送结束,重置参数。


   //进入循环
        while (count < maxSendMessageCount) {
            if (!isStart) return
            Thread.sleep(sleepTime.toLong())
            val isSuccess = sendBtn?.performAction(AccessibilityNodeInfo.ACTION_CLICK)
            Log.d(TAG, "startFireworks: //ing$count--- $isSuccess")

            if (isSuccess!!) {
                count++
            }
            val arguments = Bundle()
            //输入框中输入礼花
            arguments.putCharSequence(
                AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,
                "[庆祝]"
            )
            val editText = findInput()

            if (editText == null) {
                runningType = 0
                return
            }
            editText.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments)
        }
        //重置参数
        reSet()

复制代码

当然代码中还有一些细节这里没有说,可自行看代码去,比如发送次数的判断,还是防止多次进去的判断。

apk下载地址

需要去github下载

助手apk地址

完整代码地址

代码地址

总结

本来想写红包助手的,哈哈,由于时间(其实是我写不出来),变成了礼花助手。思路都多变的,举一反三,还可以变成朋友圈点赞助手。

本人知识有限,如有描述错误之处,愿虎正。

你看这个像不像你欠我的赞。

谢谢大家。祝大家新年快乐,如果快乐不易,那我祝你平安。你的赞就像冬日暖阳,温暖心窝。

今天这个特殊的日子里,送海子的诗你:

陌生人,我也为你祝福

愿你有一个灿烂的前程

愿你有情人终成眷属

愿你在尘世获得幸福