likes
comments
collection
share

【玩转Android自动化】微信好友状态检查(拉群方式)

作者站长头像
站长
· 阅读数 12

拉群方式

  • 开始之前先说一下为什么可以通过拉群的方式判断,当你新建群拉用户的时候其实微信是会对当前好友关系做一次校验,如果对方把你拉黑、删除、或者好友账号异常,微信都会在群聊天页有文字提示,借助于这些提示文案我们就可以判断好友的状态了,而且只要不在群里发消息,被拉入群的用户是不知道这个群的存在,这样一来对被检测者是无感的,没有打扰到好友,检测之后再解散群和删除群,就可以做到神不知鬼不觉了,这也是敢通过拉群的方式操作的前提。

  • 相比假转账的方法之所以更加推荐拉群的方法,是因为这种检测一次可以检测多个好友,检测效率会更高,而且步骤也相对简单一些。

【玩转Android自动化】微信好友状态检查(拉群方式)

拉好友建群都需要哪些流程呢,接下来就来分析具体步骤。

路径分析

  • 打开微信点击首页【右上角+】按钮点击【发起群聊】(进入发起群聊页) → 依次选择需要入群的好友点击右下角【完成】按钮(进入群聊页)→ 根据提示文案判断状态检测完成后进行删除群的操作

  • 删除群又分两种方案:彻底解散删除群直接退出群聊

1、彻底解散删除群:

点击群聊页右上角按钮(进入聊天信息页) → 点击群管理(进入群管理页) → 点击解散该群点击解散群弹框确认(自动回到群聊页) → 再次点击群聊页右上角按钮(进入聊天信息页) → 点击删除点击删除的弹框确认 → 完毕。

2、直接退出群聊:

点击群聊页右上角按钮(进入聊天信息页) → 点击退出群聊点击弹框确认(自动回到首页) → 完毕。

可以看到直接退出群聊操作更简单一点,但是这样做是不厚道的,只是你自己退出了群聊,但这个群对微信来说是依然存在的,只是无人能再对其操作罢了。

一旦以后微信修改了规则,限制了每个人建群的数量,这里埋得坑就会显现出来,所以为了保险起见,我们就先解散群然后在删除群,这样的话这个群就真的不存在了。

具体实现步骤

1、打开微信

  • 打开微信的方法跟上一篇文章介绍的一样,直接调用我们的封装好的扩展方法即可
fun Context.goToWx() = Intent(Intent.ACTION_MAIN)
    .apply {
        addCategory(Intent.CATEGORY_LAUNCHER)
        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
        component = ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI")
    }
    .apply(::startActivity)

2、点击首页【右上角+】按钮

【玩转Android自动化】微信好友状态检查(拉群方式)

\--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/by3 → description =  → isClickable = false → isScrollable = false → isEditable = false
  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/by2 → description =  → isClickable = false → isScrollable = false → isEditable = false
    +--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/gsl → description = 搜索 → isClickable = true → isScrollable = false → isEditable = false
    |  \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/f15 → description =  → isClickable = false → isScrollable = false → isEditable = false
    \--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/grs → description = 更多功能按钮 → isClickable = true → isScrollable = false → isEditable = 
      \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/f15 → description =  → isClickable = false → isScrollable = false → isEditable = false
  • 其中id = com.tencent.mm:id/grs → description = 更多功能按钮就是我们要点击的按钮,获取这个节点触发点击即可
wxAccessibilityService.clickById(NodeInfo.HomeRightTopPlusNode.nodeId)

3、点击【发起群聊】

【玩转Android自动化】微信好友状态检查(拉群方式)

  • 上一步点击后就会弹出一个窗口,里边有我们需要的发起群聊的按钮,节点信息如下
\--- className = android.widget.FrameLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  \--- className = android.widget.ListView → 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.ImageView → text =  → id = com.tencent.mm:id/f15 → 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/knx → description =  → isClickable = false → isScrollable = false → isEditable = false
    |    \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/c8n → 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.ImageView → text =  → id = com.tencent.mm:id/f15 → 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/knx → description =  → isClickable = false → isScrollable = false → isEditable = false
    |    \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/c8n → 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.ImageView → text =  → id = com.tencent.mm:id/f15 → 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/knx → description =  → isClickable = false → isScrollable = false → isEditable = false
    |    \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/c8n → 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.ImageView → text =  → id = com.tencent.mm:id/f15 → 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/knx → description =  → isClickable = false → isScrollable = false → isEditable = false
        \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/c8n → description =  → isClickable = false → isScrollable = false → isEditable = false

  • 找到发起群聊 → id = com.tencent.mm:id/knx触发点击事件
wxAccessibilityService.clickById(NodeInfo.CreateGroupNode.nodeId)

4、选择需要入群的好友

  • 这个页面操作是整个流程中最重要的,所以先分析一下发起群聊页的页面元素
+--- className = androidx.recyclerview.widget.RecyclerView → text =  → id = com.tencent.mm:id/j9o → description =  → isClickable = false → isScrollable = true → isEditable = 
|  +--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/ev2 → description =  → isClickable = true → isScrollable = false → isEditable = false
|  |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/eu_ → description =  → isClickable = false → isScrollable = false → isEditable = false
|  +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = true → isScrollable = false → isEditable = false
|  |  \--- className = android.widget.TextView → text = 选择一个群 → id = com.tencent.mm:id/bsk → description =  → isClickable = false → isScrollable = false → isEditable = 
|  +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = true → isScrollable = false → isEditable = false
|  |  \--- className = android.widget.TextView → text = 面对面建群 → id = com.tencent.mm:id/bsk → description =  → isClickable = false → isScrollable = false → isEditable = 
|  +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = true → isScrollable = false → isEditable = false
|  |  \--- className = android.widget.TextView → text = 企业微信联系人 → id = com.tencent.mm:id/bsk → description =  → isClickable = false → isScrollable = false → isEditable 
|  +--- className = android.widget.RelativeLayout → text =  → id =  → description =  → isClickable = true → isScrollable = false → isEditable = false
|  |  +--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/evg → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |  |  \--- className = android.widget.TextView → text = B → id = com.tencent.mm:id/evf → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/j_7 → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |    +--- className = android.widget.CheckBox → text =  → id = com.tencent.mm:id/j9g → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |    \--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/fa6 → description =  → isClickable = false → isScrollable = false → isEditable = 
|  |      +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/a27 → 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.TableLayout → text =  → id = com.tencent.mm:id/hg2 → description =  → isClickable = false → isScrollable = false → isEditable = 
|  |            \--- className = android.widget.TableRow → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |              \--- className = android.widget.TextView → text = 百里守约 → id = com.tencent.mm:id/hg4 → description =  → isClickable = false → isScrollable = false
|  +--- className = android.widget.RelativeLayout → text =  → id =  → description =  → isClickable = true → isScrollable = false → isEditable = false
|  |  +--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/evg → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |  |  \--- className = android.widget.TextView → text = C → id = com.tencent.mm:id/evf → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/j_7 → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |    +--- className = android.widget.CheckBox → text =  → id = com.tencent.mm:id/j9g → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |    \--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/fa6 → description =  → isClickable = false → isScrollable = false → isEditable = 
|  |      +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/a27 → 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.TableLayout → text =  → id = com.tencent.mm:id/hg2 → description =  → isClickable = false → isScrollable = false → isEditable = 
|  |            \--- className = android.widget.TableRow → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |              \--- className = android.widget.TextView → text = 蔡文姬 → id = com.tencent.mm:id/hg4 → description =  → isClickable = false → isScrollable = false
+--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/bpe → description =  → isClickable = true → isScrollable = false → isEditable = false
|  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/iwc → description =  → isClickable = false → isScrollable = false → isEditable = false
|    \--- className = androidx.recyclerview.widget.RecyclerView → text =  → id = com.tencent.mm:id/h7n → description =  → isClickable = false → isScrollable = false
|      \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/iwc → description =  → isClickable = false → isScrollable = false → isEditable = false
|        +--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/h7p → description =  → isClickable = false → isScrollable = false → isEditable = false
|        \--- className = android.widget.EditText → text = 搜索 → id = com.tencent.mm:id/h7o → description =  → isClickable = true → isScrollable = false → isEditable = true
+--- className = android.view.View → text =  → id = com.tencent.mm:id/j9p → description =  → isClickable = false → isScrollable = false → isEditable = false
\--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/j_m → description =  → isClickable = true → isScrollable = false → isEditable = false
  \--- className = android.widget.RelativeLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    \--- className = android.widget.Button → text = 完成 → id = com.tencent.mm:id/e9s → description =  → isClickable = true → isScrollable = false → isEditable = false

4.1、选择好友
  • 从节点信息androidx.recyclerview.widget.RecyclerView → text = → id = com.tencent.mm:id/j9o分析出页面是用RecyclerView实现的,找到RecyclerView的节点,在去遍历他的子节点中ID为text = 百里守约 → id = com.tencent.mm:id/hg4的节点。然后点击当前节点就相当于选中了。

  • 那么怎么自动选择指定个数的好友呐,其实跟假转账法文章中介绍的类似,也要有一个查找的参照值。同样需要根据上一个选择的好友,定位的上一个好友的索引值,去找到下一个好友,进行点击选中。如果传入的上一个是空的话说明是第一次选择,就应该从第一个开始,否则就要先定位到上次选择的位置,从他后面继续选择。

  • 假如我们定义一次建群拉20个好友,第一次的时候一个好友也没选择,就要从第一个好友开始依次点击20个好友,不够20个的话就自动滑动一页继续点击,直到选中20个好友为止。

  • 下一次拉群的时候会传入上一次拉群好友中最后一个好友,先定位到他的位置(通过滚动查找的方法),然后从他后边继续执行选择20个好友的操作,满足条件就点击完成进行建群。

suspend fun AccessibilityService?.selectChildByScroll(
    parentViewId: String,
    childViewId: String,
    maxSelectCount: Int = Int.MAX_VALUE,
    lastText: String? = null,
): List<String> {
    this ?: return listOf()
    val rootNode = rootInActiveWindow
    val findTexts = mutableListOf<String>()
    val select = selectChild(parentViewId, childViewId, maxSelectCount, lastText)
    findTexts.addAll(select)
    if (findTexts.size == maxSelectCount) return findTexts
    val parentNode = rootNode.findNodeById(parentViewId) ?: return findTexts
    var isEnd = false
    while (parentNode.isScrollable && findTexts.size < maxSelectCount && !isEnd) {
        parentNode.scrollForward()
        Log.d("selectChildByScroll", "滚动了一屏")
        delay(1000)
        val findNextNodes = selectChild(parentViewId, childViewId, maxSelectCount - findTexts.size, findTexts.lastOrNull() ?: lastText)
        isEnd = findNextNodes.isEmpty()
        Log.d("selectChildByScroll", "=============是否搜索到底了  isEnd = $isEnd")
        findTexts.addAll(findNextNodes)
    }
    return findTexts
}

温馨提示:微信建群规则是 1、最多同时邀请40人创建群;2、超过30人的群会出现单独向用户发送群聊邀请的消息,为了不向好友发送入群聊邀请我们一定要把单次建群同时选择人数量控制在30以内。

我就因为刚开始不知道这个规则,自动拉了个群,导致有人收到了入群邀请,并通过邀请入群了,导致群内所有成员都收到某某某进群的消息了,相当于的这个群暴露在这批次所有好友面前了,太尴尬了。。。

4.2、点击发起群聊页的【完成】按钮
+--- className = android.view.View → text =  → id = com.tencent.mm:id/j9p → description =  → isClickable = false → isScrollable = false → isEditable = false
\--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/j_m → description =  → isClickable = true → isScrollable = false → isEditable = false
  \--- className = android.widget.RelativeLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    \--- className = android.widget.Button → text = 完成 → id = com.tencent.mm:id/e9s → description =  → isClickable = true → isScrollable = false → isEditable = false
  • 选择好要检测的好友后就点击右下角的完成按钮,进行建群了
wxAccessibilityService.clickById(NodeInfo.CreateGroupCompleteNode.nodeId)
4.3、在群聊页检测好友状态
  • 建好群之后就可以在这个页面根据提示的信息进行解析了
\--- className = android.widget.FrameLayout → text =  → id = com.tencent.mm:id/b5n → description =  → isClickable = false → isScrollable = false → isEditable = false
  +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  \--- className = androidx.recyclerview.widget.RecyclerView → text =  → id = com.tencent.mm:id/b79 → description =  → isClickable = false → isScrollable = true → isEditable = false
    +--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
    |  +--- className = android.widget.TextView → text = 下午1:49 → id = com.tencent.mm:id/b8z → 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.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.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
//android.widget.TextView → text = 你邀请XXX、XXX加入了群聊 → id = com.tencent.mm:id/b4b → description =  → clickable = true → scrollable = false → editable = false
//android.widget.TextView → text = 你无法邀请未添加你为好友的用户进去群聊,请先向XXX发送朋友验证申请。对方通过验证后,才能加入群聊。 → id = com.tencent.mm:id/b4b → description =  → clickable = true → scrollable = false → editable = false
//android.widget.TextView → text = XXX、XXX拒绝加入群聊 → id = com.tencent.mm:id/b4b → description =  → clickable = true → scrollable = false → editable = false
//android.widget.TextView → text = 由于账号安全原因,XXX、XXX无法加入当前群聊。 → id = com.tencent.mm:id/b4b → description =  → clickable = true → scrollable = false → editable = false

val list = mutableListOf<WxUserInfo>()
wxAccessibilityService.findChildNodes(
    NodeInfo.GroupChatContentListNode.nodeId,
    NodeInfo.GroupChatMsgNode.nodeId
).forEach {
    val resultText = it.text.default()
    val result = when {
        resultText.startsWith("你邀请") -> analyzeNormal(resultText)
        resultText.startsWith("你无法邀请未添加你为好友的用户进去群聊") -> analyzeDelete(resultText)
        resultText.startsWith("由于账号安全原因") -> analyzeException(resultText)
        resultText.endsWith("拒绝加入群聊") -> analyzeBlack(resultText)
        else -> listOf<WxUserInfo>()
    }
    list.addAll(result)
}

在群聊页检测完成后就开始解散群和删除群的操作了

5、点击群聊页右上角按钮

+--- className = android.widget.RelativeLayout → text =  → id = com.tencent.mm:id/bxy → 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/g0 → description =  → isClickable = true → isScrollable = false → isEditable = false
|  |    \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/yn → description = 返回 → isClickable = false → isScrollable = false → isEditable = false
|  +--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/fe → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |  +--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/ko7 → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |  |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/ko6 → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |  |    +--- className = android.widget.TextView → text = 群聊(3) → id = com.tencent.mm:id/ko4 → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |  |    \--- className = android.widget.TextView → text =  → id = com.tencent.mm:id/ko8 → description =  → isClickable = false → isScrollable = false → isEditable = false
|  |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/k9p → description =  → isClickable = false → isScrollable = false → isEditable = false
|  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/by3 → description =  → isClickable = false → isScrollable = false → isEditable = false
|    \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/by2 → 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 =  → description =  → isClickable = false → isScrollable = false → isEditable = false
|          \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/eo → description = 聊天信息 → isClickable = true → isScrollable = false → isEditable = false
\--- className = androidx.appcompat.widget.LinearLayoutCompat → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
  • 找到id = com.tencent.mm:id/eo → description = 聊天信息就是右上角的按钮,进行点击
wxAccessibilityService?.findById(NodeInfo.GroupChatRightTopNode.nodeId).click()

6、在聊天信息页点击【群管理】按钮

+--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/iwg → description =  → isClickable = true → 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/br8 → description =  → isClickable = false → isScrollable = false → isEditable = 
|    |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/kp3 → description =  → isClickable = false → isScrollable = false → isEditable = 
|    |    \--- className = android.widget.LinearLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
|    |      \--- className = android.widget.TextView → text = 群公告 → id = com.tencent.mm:id/ivs → description =  → isClickable = false → isScrollable = false
|    \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/its → description =  → isClickable = false → isScrollable = false → isEditable = 
|      \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/isy → description =  → isClickable = false → isScrollable = false → isEditable = 
+--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/iwg → description =  → isClickable = true → 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/br8 → 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 = com.tencent.mm:id/kp3 → 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.TextView → text = 群管理 → id = android:id/title → description =  → isClickable = false → isScrollable = false
|    \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/its → description =  → isClickable = false → isScrollable = false → isEditable = 
|      \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/isy → description =  → isClickable = false → isScrollable = false → isEditable = 
  • 定位到text = 群管理 → id = android:id/title节点进行点击去打开群管理页面
wxAccessibilityService.clickByText("群管理")

7、在群管理页点击【解散该群】按钮和点击确认解散弹框按钮

【玩转Android自动化】微信好友状态检查(拉群方式)

+--- className = android.widget.TextView → text =  → id = com.tencent.mm:id/jn6 → description =  → isClickable = true → isScrollable = false → isEditable = false
\--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/iwg → description =  → isClickable = true → 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/khj → description =  → isClickable = false → isScrollable = false → isEditable 
  • 解散该群的节点信息text = 解散该群聊 → id = com.tencent.mm:id/khj,触发点击之后就会出现二次确认弹框。

  • 确认解散弹框节点信息如下

+--- className = android.widget.FrameLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
|  \--- className = android.widget.ScrollView → text =  → id = com.tencent.mm:id/bsd → 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/ahl → 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/kpi → description =  → isClickable = false → isScrollable = false → isEditable = false
|      |    \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/c7p → description =  → isClickable = false → isScrollable = false → isEditable = false
|      \--- className = androidx.recyclerview.widget.RecyclerView → text =  → id = com.tencent.mm:id/ahh → 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.RelativeLayout → text =  → id = com.tencent.mm:id/mdj → description =  → isClickable = false → isScrollable = false → isEditable = false
|          |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/kid → description =  → isClickable = false → isScrollable = false → isEditable = false
|          |    \--- className = android.widget.TextView → text = 解散 → id = com.tencent.mm:id/knx → description =  → isClickable = false → isScrollable = false → isEditable = false
|          \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/c7p → description =  → isClickable = false → isScrollable = false → isEditable = false
\--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/ah_ → description =  → isClickable = true → isScrollable = false → isEditable = false
  +--- className = android.view.View → text =  → id = com.tencent.mm:id/aq6 → description =  → isClickable = false → isScrollable = false → isEditable = false
  \--- className = android.widget.TextView → text = 取消 → id = com.tencent.mm:id/aq7 → description =  → isClickable = false → isScrollable = false → isEditable = false
  • 继续点击text = 解散 → id = com.tencent.mm:id/knx节点就解散了群,然后会自动回到群聊天页。然后继续上面已经写过的操作,再次点击点击群聊页右上角按钮,再次进到聊天信息页,里边就会出现删除的按钮了,就可以去真正的删除群了

8、在聊天信息页点击【删除】按钮和点击弹框中的确定删除按钮

【玩转Android自动化】微信好友状态检查(拉群方式)

+--- className = android.widget.TextView → text =  → id = com.tencent.mm:id/jn6 → description =  → isClickable = true → isScrollable = false → isEditable = false
+--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/iwg → description =  → isClickable = true → 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/khj → description =  → isClickable = false → isScrollable = false → isEditable = false
  • 找到text = 删除 → id = com.tencent.mm:id/khj节点进行点击操作,就会出现二次确认弹框

【玩转Android自动化】微信好友状态检查(拉群方式)

+--- className = android.widget.FrameLayout → text =  → id =  → description =  → isClickable = false → isScrollable = false → isEditable = false
|  \--- className = android.widget.ScrollView → text =  → id = com.tencent.mm:id/bsd → 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/ahl → 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/kpi → description =  → isClickable = false → isScrollable = false → isEditable = false
|      |    \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/c7p → description =  → isClickable = false → isScrollable = false → isEditable = false
|      \--- className = androidx.recyclerview.widget.RecyclerView → text =  → id = com.tencent.mm:id/ahh → 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.RelativeLayout → text =  → id = com.tencent.mm:id/mdj → description =  → isClickable = false → isScrollable = false → isEditable = false
|          |  \--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/kid → description =  → isClickable = false → isScrollable = false → isEditable = false
|          |    \--- className = android.widget.TextView → text = 确定 → id = com.tencent.mm:id/knx → description =  → isClickable = false → isScrollable = false → isEditable = false
|          \--- className = android.widget.ImageView → text =  → id = com.tencent.mm:id/c7p → description =  → isClickable = false → isScrollable = false → isEditable = false
\--- className = android.widget.LinearLayout → text =  → id = com.tencent.mm:id/ah_ → description =  → isClickable = true → isScrollable = false → isEditable = false
  +--- className = android.view.View → text =  → id = com.tencent.mm:id/aq6 → description =  → isClickable = false → isScrollable = false → isEditable = false
  \--- className = android.widget.TextView → text = 取消 → id = com.tencent.mm:id/aq7 → description =  → isClickable = false → isScrollable = false → isEditable = false
  • 找到text = 确定 → id = com.tencent.mm:id/knx进行点击就真正的删除群了。

至此就实现了通过建群检测好友的方法了,最后我们来看一下完整的解决方案吧。

完整流程

private suspend fun singleTask() {
    val isHome = WXHomePage.backToHome()
    if (!isHome) return
    //微信首页添加好友的图标
    val isClickPlusBtn = WXHomePage.clickRightTopPlusBtn()
    if (!isClickPlusBtn) return
    //点击发起群聊按钮
    val isClickCreateGroup = WXHomePage.clickCreateGroupBtn()
    if (!isClickCreateGroup) return
    //判断当前是在发起群聊页
    val isCreateGroupPage = WXCreateGroupPage.inPage()
    if (!isCreateGroupPage) return
    //选择这次选择入群的好友列表
    val selectUser = WXCreateGroupPage.selectUser()
    //当发现选择建群的用户少于2个人的时候,无法建群(即选择一个人是无法拉群的)
    if (selectUser.size <= 1) {
        if (selectUser.size == 1) {
            FriendStatusHelper.addCheckResults(mutableListOf(WxUserInfo(selectUser.first())))
        }
        WXHomePage.backToHome()
        return
    }
    //点击完成,开始建群
    val isClickComplete = WXCreateGroupPage.clickCompleteBtn()
    if (!isClickComplete) return
    //判断是否进入到群聊页,因为创建群需要一定的时间
    val inGroupCHatPage = WXGroupChatPage.inPage()
    if (!inGroupCHatPage) return
    //在群里判断好友状态
    val result = WXGroupChatPage.checkUserStatus()
    FriendStatusHelper.addCheckResults(result)

    //=======检测完毕开始解散群和删除群=======

    //点击群聊右上角按钮
    val isClickMore = WXGroupChatPage.clickMoreBtn()
    if (!isClickMore) return
    //点击群管理按钮
    val clickGroupManager = WXGroupInfoPage.clickGroupManager()
    if (!clickGroupManager) return
    //点击解散该群聊按钮
    val clickDisbandGroup = WXGroupManagerPage.clickDisbandGroup()
    if (!clickDisbandGroup) return
    //点击弹框确定解散按钮
    val clickDisbandGroupDialog = WXGroupManagerPage.clickDisbandGroupDialog()
    if (!clickDisbandGroupDialog) return
    //再次点击群聊右上角按钮
    val clickMoreAgain = WXGroupChatPage.clickMoreBtn()
    if (!clickMoreAgain) return
    //点击删除按钮
    val clickDeleteGroup = WXGroupInfoPage.clickDeleteGroup()
    if (!clickDeleteGroup) return
    //点击弹框确定删除按钮
    val clickDeleteGroupDialog = WXGroupInfoPage.clickDeleteGroupDialog()
    if (!clickDeleteGroupDialog) return

    delay(2000)
    //循环执行以上步骤
    singleTask()
}

最后

  • 至此我们完成了通过拉群的方式检测好友状态的全部流程的分析了,相信看到这里你对这种方式已经非常了解了

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

  • 检测好友状态的两种方式我们已经全部介绍完了,有兴趣的可以去把玩一下。通过这两篇文章的讲解相信应该能勾起你对Android无障碍模式实现自动化操作的兴趣了,那么就让我们继续开发一些有意思的功能吧

预告