【玩转Android自动化】微信自动抢红包

2,780 阅读12分钟

前面两篇文章【玩转Android自动化】微信好友状态检查(假转账方式)【玩转Android自动化】微信好友状态检查(拉群方式)实现了微信僵尸好友检测的功能,相信你对自动化流程已经非常熟悉了,接下我们就去实现一些更有意思功能。本章我们来介绍一下如何自动抢红包。

背景

  • 逢年过节的时候或者年会活动上,大家都喜欢老板发红包的环节,如果能碰到财大气粗的老板一晚上能抢不少红包呐,这个时候就是拼手速的时刻了,所以市面上涌现很多抢红包的插件,甚至有些手机厂商自己内置的就有红包提醒功能。

  • 很多三方红包插件都是需要安装在Root的手机上,但是现在大家玩机已经不像几年前那么热情了,已经没多少人会把自己设备Root了,所有很多插件也就没法去安装了,印象中五六年前我也写过一个抢红包工具,当时只是自己随便写写玩的,有很多bug,现在看当初写的代码真是一坨xiang,趁着最近学习自动化操作的机会,重新实现一次。

流程分析

  • 要想快人一步抢红包就要实时自动监听消息的内容,一旦来了红包消息就自动触发点击操作,自动点击肯定是比人为点击要快的,这也就是能比别人抢的快的原因。

  • 当我们没有打开微信或者没在聊天页的时候,收到红包微信会通过消息通知提醒你,这个时候我们可以监听通知状态变化即可,当我们在聊天页正在聊天的时候收到红包消息(其实不限消息类型),都会触发窗口内容变化的事件,我们要做的只是在内容发生变化的时候获取一下当前窗体的元素,看看有没有红包就可以了,有的话就触发自动点击的操作,没有就不处理。

步骤拆分

红包通知

  • 通过观察会发现当我们不在微信首页或者聊天页的时候来条红包消息会收到TYPE_NOTIFICATION_STATE_CHANGED事件,内容如下
EventType: TYPE_NOTIFICATION_STATE_CHANGED; EventTime: 301132503; PackageName: com.tencent.mm; MovementGranularity: 0; Action: 0; ContentChangeTypes: []; WindowChangeTypes: [] [ ClassName: android.app.Notification; Text: [马可波罗: [微信红包]恭喜发财,大吉大利]; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; Enabled: false; Password: false; Checked: false; FullScreen: false; Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; AddedCount: -1; RemovedCount: -1; ParcelableData: Notification(channel=message_channel_new_id pri=0 contentView=null vibrate=null sound=null tick defaults=0x0 flags=0x11 color=0x00000000 category=msg vis=PRIVATE) ]; recordCount: 0
  • 可以很明确的看到Text: [马可波罗: [微信红包]恭喜发财,大吉大利]的字样,这类消息就是红包的,所有我们只需监听eventType是TYPE_NOTIFICATION_STATE_CHANGED并且text字段包含: [微信红包]恭喜发财,大吉大利]字符就可以了,当然也有朋友为了恶搞,会发出[微信红包]恭喜发财,大吉大利]的消息假装发了红包,所以我们在匹配的字符上加了: ,不是看过消息体的人一般是不知道有这个冒号的存在的,这样做一定程度规避了红包消息误判的问题,但是并不能100%哦。

  • 检测到是红包类型的消息通知我们就要触发自动跳转到消息详情页了,页面跳转可以通过获取event中的parcelableData,因为是通知类型的消息,所有其实他是Notification对象,就可以调用他的send方法进行页面跳转了。

(event.parcelableData as? Notification)?.let {
    try {
        it.contentIntent.send()
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

红包消息

  • 通过通知跳到聊天页后就可以获取聊天页的节点元素,进行去查找有没有红包类型的节点即可
+--- className = androidx.recyclerview.widget.RecyclerView → text =  → id = com.tencent.mm:id/b79 → description =  → isClickable = false → isScrollable = true → isEditable = false
  +--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/hp → description =  → isClickable = false → isScrollable = false → isEditable = false
  |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/b4_ → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    +--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/b3v → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |  +--- className = android.view.View → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |  +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/b3s → description = 马可波罗头像 → isClickable = true → isScrollable = false → isEditable = false
  |    |  \--- className = android.widget.ImageView → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/b3p → description =  → isClickable = false → isScrollable = false → isEditable = false
  |      \--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/b4_ → description =  → isClickable = false → isScrollable = false → isEditable = false
  |        +--- className = android.widget.TextView → text = 马可波罗 → id = com.tencent.mm:id/b9_ → description =  → isClickable = false → isScrollable = false → isEditable = false
  |        \--- className = android.widget.FrameLayout → text =  → id = com.tencent.mm:id/b47 → description =  → isClickable = true → isScrollable = false → isEditable = false
  |          +--- className = android.widget.FrameLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |          \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |            +--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/ape → description =  → isClickable = false → isScrollable = false → isEditable = false
  |            |  +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/xu → description =  → isClickable = false → isScrollable = false → isEditable = false
  |            |  \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |            |    +--- className = android.widget.TextView → text = 恭喜发财,大吉大利 → id = com.tencent.mm:id/y0 → description =  → isClickable = false → isScrollable = false → isEditable = false
  |            |    \--- className = android.widget.TextView → text = 已领取 → id = com.tencent.mm:id/xs → description =  → isClickable = false → isScrollable = false → isEditable = false
  |            +--- className = android.view.View → text =  → id = com.tencent.mm:id/xt → description =  → isClickable = false → isScrollable = false → isEditable = false
  |            \--- className = android.widget.RelativeLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |              +--- className = android.widget.TextView → text = 微信红包 → id = com.tencent.mm:id/y4 → description =  → isClickable = false → isScrollable = false → isEditable = false
  |              \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |  \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    \--- className = android.widget.TextView → text =   你领取了马可波罗的红包 → id = com.tencent.mm:id/b4b → description =  → isClickable = true → isScrollable = false → isEditable = false
  +--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/hp → description =  → isClickable = false → isScrollable = false → isEditable = false
  |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/b4_ → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    +--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/b4_ → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |  \--- className = android.widget.FrameLayout → text =  → id = com.tencent.mm:id/b47 → description =  → isClickable = true → isScrollable = false → isEditable = false
  |    |    +--- className = android.widget.FrameLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |    \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |      +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |      |  +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/xu → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |      |  \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |      |    \--- className = android.widget.TextView → text = 恭喜发财,大吉大利 → id = com.tencent.mm:id/y0 → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |      +--- className = android.view.View → text =  → id = com.tencent.mm:id/xt → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |      \--- className = android.widget.RelativeLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |        +--- className = android.widget.TextView → text = 微信红包 → id = com.tencent.mm:id/y4 → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    |        \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |    \--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/b3v → description =  → isClickable = false → isScrollable = false → isEditable = false
  |      +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/b3s → description = 程咬金头像 → isClickable = true → isScrollable = false → isEditable = false
  |      +--- className = android.view.View → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  |      \--- className = android.widget.ImageView → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  \--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/hp → description =  → isClickable = false → isScrollable = false → isEditable = false
    +--- className = android.widget.TextView → text = 下午3:13 → id = com.tencent.mm:id/b8z → description =  → isClickable = false → isScrollable = false → isEditable = false
    \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/b4_ → description =  → isClickable = false → isScrollable = false → isEditable = false
      +--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/b3v → description =  → isClickable = false → isScrollable = false → isEditable = false
      |  +--- className = android.view.View → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
      |  +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/b3s → description = 马可波罗头像 → isClickable = true → isScrollable = false → isEditable = false
      |  \--- className = android.widget.ImageView → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
      \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/b3p → description =  → isClickable = false → isScrollable = false → isEditable = false
        \--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/b4_ → description =  → isClickable = false → isScrollable = false → isEditable = false
          +--- className = android.widget.TextView → text = 马可波罗 → id = com.tencent.mm:id/b9_ → description =  → isClickable = false → isScrollable = false → isEditable = false
          \--- className = android.widget.FrameLayout → text =  → id = com.tencent.mm:id/b47 → description =  → isClickable = true → isScrollable = false → isEditable = false
            +--- className = android.widget.FrameLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
            \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
              +--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/ape → description =  → isClickable = false → isScrollable = false → isEditable = false
              |  +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/xu → description =  → isClickable = false → isScrollable = false → isEditable = false
              |  \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
              |    \--- className = android.widget.TextView → text = 恭喜发财,大吉大利 → id = com.tencent.mm:id/y0 → description =  → isClickable = false → isScrollable = false → isEditable = false
              +--- className = android.view.View → text =  → id = com.tencent.mm:id/xt → description =  → isClickable = false → isScrollable = false → isEditable = false
              \--- className = android.widget.RelativeLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
                +--- className = android.widget.TextView → text = 微信红包 → id = com.tencent.mm:id/y4 → description =  → isClickable = false → isScrollable = false → isEditable = false
                \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  • 通过以上节点的分析会发现,红包节点的特征text = 恭喜发财,大吉大利 → id = com.tencent.mm:id/y0,然后我们去取这个特定ID节点的数据,发现会包含已领取自己发的红包,这样的话我们还需要过滤掉已经领取的红包,还要区分红包是自己发的,一般情况自己发的红包就不触发自动抢了,否则岂不是太尴尬了。

  • 因为上边我们是按照text = 恭喜发财,大吉大利 → id = com.tencent.mm:id/y0去取的节点,这个节点只有自己的信息,没有什么子节点了,所有没法继续判断了,只能从他的父布局查找了,通过观察还能发现消息的根节点是className = android.widget.LinearLayout → text = → id = com.tencent.mm:id/b4_,第一步先找到这个根节点,然后过滤出所有包含text = 恭喜发财,大吉大利 → id = com.tencent.mm:id/y0的节点,就得到红包消息的节点,然后在过滤掉所有包含text = 已领取 → id = com.tencent.mm:id/xs的节点就是未领取的节点,最后在过滤掉自己发的,自己发的也是有特征的,我们都知道消息是分自己发的和别人发的,自己发的在右边,布局是消息内容,自己的头像昵称信息,别人发的在左边,布局是头像昵称信息和消息内容,注意不同点哦,就是顺序不同,我们可以根据根节点的第一个子节点是不是昵称就可以区分了。

  • 这么分析下来也太麻烦了吧,找个别人红包节点都要找好几个判断,势必会影响查找效率,那么接下来继续一行一行的分析整个布局节点信息,会发现有个className = android.widget.LinearLayout → text = → id = com.tencent.mm:id/ape的节点,这个ID的节点只会出现在别人发的红包消息上面,这不正是我们需要的唯一判断的值吗,真是柳暗花明又一村啊,一次判断就可以找到所有需要点击的别人发的红包了,然后过滤掉已经领取的节点就完事了

wxHbAccessibilityService
    .findNodesById(NodeInfo.HBPatentNode.nodeId)
    .filter {
        it.findNodeById(NodeInfo.HBReceiveNode.nodeId) == null
    }

抢红包

  • 通过上边的步骤已经成功找到了需要点击的红包消息了,直接触发节点的点击事件就好了,点击红包消息后就会弹出红包弹框,分析一下页面信息
+--- className = android.widget.RelativeLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  +--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/m_d → description =  → isClickable = false → isScrollable = false → isEditable = false
  \--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/gii → description =  → isClickable = false → isScrollable = false → isEditable = false
    +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/gia → description =  → isClickable = false → isScrollable = false → isEditable = false
    +--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/gcf → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  +--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/gj3 → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/gig → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  \--- className = android.widget.TextView → text = 马可波罗的红包 → id = com.tencent.mm:id/gih → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  \--- className = android.widget.TextView → text = 恭喜发财,大吉大利 → id = com.tencent.mm:id/gim → description =  → isClickable = false → isScrollable = false → isEditable = false
    +--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/gea → description =  → isClickable = false → isScrollable = false → isEditable = false
    +--- className = android.widget.Button → text =  → id = com.tencent.mm:id/giq → description = 开 → isClickable = true → isScrollable = false → isEditable = false
    \--- className = android.widget.ImageButton → text =  → id = com.tencent.mm:id/gir → description = 开 → isClickable = true → isScrollable = false → isEditable = false
\--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/gip → description = 关闭 → isClickable = true → isScrollable = false → isEditable = false

  • 我们需要的是点击id = com.tencent.mm:id/gir → description = 开的按钮就自动抢了,点击之后会跳到红包详情页,然后直接返回就可以继续抢了。
+--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/k6i → description = 返回 → isClickable = true → isScrollable = false → isEditable = false
+--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/k6q → description = 更多 → isClickable = true → isScrollable = false → isEditable = false
\--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/gcp → description =  → isClickable = false → isScrollable = false → isEditable = false
  \--- className = android.widget.FrameLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    +--- className = android.view.View → text =  → id = com.tencent.mm:id/gcy → description =  → isClickable = false → isScrollable = false → isEditable = false
    +--- className = androidx.recyclerview.widget.RecyclerView → text =  → id = com.tencent.mm:id/gdh → description =  → isClickable = false → isScrollable = false → isEditable = 
    |  +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = true → isScrollable = false → isEditable = false
    |  |  +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |  +--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/ge1 → description =  → isClickable = false → isScrollable = false → isEditable = 
    |  |  |  |  +--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/gdk → description =  → isClickable = false → isScrollable = false → isEditable = 
    |  |  |  |  |  +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/gdl → description =  → isClickable = false → isScrollable = false → isEditable = 
    |  |  |  |  |  \--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/ge4 → description =  → isClickable = false → isScrollable = false → 
    |  |  |  |  |    \--- className = android.widget.TextView → text = 马可波罗的红包 → id = com.tencent.mm:id/ge3 → description =  → isClickable = false → isScrollable = false → 
    |  |  |  |  \--- className = android.widget.TextView → text = 恭喜发财,大吉大利 → id = com.tencent.mm:id/ge6 → description =  → isClickable = false → isScrollable = false → 
    |  |  |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/gck → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |    +--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/gcl → description =  → isClickable = false → isScrollable = false → isEditable = 
    |  |  |    |  +--- className = android.widget.TextView → text = 0.01 → id = com.tencent.mm:id/gcj → description =  → isClickable = false → isScrollable = false → isEditable = 
    |  |  |    |  \--- className = android.widget.TextView → text = 元 → id = com.tencent.mm:id/gcm → description =  → isClickable = false → isScrollable = false → isEditable = 
    |  |  |    \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/gd6 → description =  → isClickable = true → isScrollable = false → isEditable = 
    |  |  |      +--- className = android.widget.TextView → text = 已存入零钱,可用于发红包 → id = com.tencent.mm:id/gdz → description =  → isClickable = false → isScrollable = 
    |  |  |      \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/ge0 → description =  → isClickable = false → isScrollable = false → isEditable = 
    |  |  +--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/gja → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/gje → description =  → isClickable = true → isScrollable = false → isEditable = false
    |  |  |    +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/gjd → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |    \--- className = android.widget.TextView → text = 回复表情到聊天 → id = com.tencent.mm:id/gjf → description =  → isClickable = false → isScrollable = false → 
    |  |  \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  +--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/iwc → description =  → isClickable = true → isScrollable = false → isEditable = false
    |  |  +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |  +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/giv → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |  \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |    +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |    |  +--- className = android.widget.TextView → text = 程咬金 → id = com.tencent.mm:id/giz → description =  → isClickable = false → isScrollable = false → isEditable 
    |  |  |    |  \--- className = android.widget.TextView → text = 0.01元 → id = com.tencent.mm:id/git → description =  → isClickable = false → isScrollable = false → isEditable 
    |  |  |    \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |      +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |      |  \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |      \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  |  |        \--- className = android.widget.TextView → text = 14:30 → id = com.tencent.mm:id/gj0 → description =  → isClickable = false → isScrollable = false → isEditable 
    |  |  \--- className = android.view.View → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  \--- className = android.widget.RelativeLayout → text =  → id =  → description =  → isClickable = true → isScrollable = false → isEditable = false
    |    \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    \--- className = android.widget.ImageView → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
className = android.widget.FrameLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  • 返回红包详情页使用id = com.tencent.mm:id/k6i → description = 返回节点,这样一次完整的抢红包流程就结束了。回头看下代码吧
suspend fun fuckMoney() {
    findHBNodes().forEach { openHB(it) }
}

private suspend fun findHBNodes(): List<AccessibilityNodeInfo> {
    val inPage = inPage()
    if (!inPage) return listOf()
    return wxHbAccessibilityService
        .findNodesById(NodeInfo.HBPatentNode.nodeId)
        .filter {
            it.findNodeById(NodeInfo.HBReceiveNode.nodeId) == null
        }
}

private suspend fun openHB(nodeInfo: AccessibilityNodeInfo) {
    val inPage = inPage()
    if (!inPage) return
    val click = clickHb(nodeInfo)
    if (!click) return
    val open = clickOpenHb()
    if (!open) return
    val inHbDetails = inHbDetails()
    if (!inHbDetails) return
    val hbInfo = getHbInfo()
    backFromHBDetail(hbInfo)
}
  • 至此我们就实现了抢红包的功能了,让我们跑一下代码看看效果吧
【判断是否在聊天页面】开始执行
【判断是否在聊天页面】任务执行成功,轮训总次数:1, 耗时:15 ms
【点击红包】开始执行
【点击红包】任务执行成功,轮训总次数:1, 耗时:51 ms
【点击开红包】开始执行
【点击开红包】第 1 次执行
【点击开红包】任务执行成功,轮训总次数:2, 耗时:743 ms
【判断当前是否在红包详情页】开始执行
【判断当前是否在红包详情页】第 1 次执行
【判断当前是否在红包详情页】第 2 次执行
【判断当前是否在红包详情页】任务执行成功,轮训总次数:3, 耗时:1041 ms
【获取红包信息】开始执行
【获取红包信息】任务执行成功,轮训总次数:1, 耗时:27 ms
【孙尚香的红包,抢到:0.01 元  点击返回】开始执行
【孙尚香的红包,抢到:0.01 元  点击返回】任务执行成功,轮训总次数:1, 耗时:18 ms

自动抢红包.gif

最后

  • 微信相关的自动化功能基本上都已经介绍完毕了,做了这么多功能后其实发现我们所做的一切都是依赖于当前版本页面的元素id或者text的唯一性去做的,一旦微信升级后这些id或text变动的话这些功能就全部失效了,所有接下来我们的重点工作要放在版本适配上.

  • 适配的目的是让我们以后随着微信版本的变化在不改变业务流程的基础上只修改节点配置文件就算达到目的了,接下来请关注【玩转Android自动化】微信版本适配

感兴趣的可以下载demo体验一下,在阅读源码过程遇到任何问题欢迎提Issues,如果对你有帮助,希望动动你的发财小手点个赞呗