فهرست منبع

新增多选转发

yangyang 8 ماه پیش
والد
کامیت
34526ff2df

+ 2 - 2
app/build.gradle

@@ -9,8 +9,8 @@ android {
         applicationId "com.rk.worktool"
         minSdkVersion 24
         targetSdkVersion 30
-        versionCode 20250414
-        versionName "2.9.4"
+        versionCode 20250528
+        versionName "2.9.6"
     }
 
     buildTypes {

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -42,6 +42,7 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
         android:usesCleartextTraffic="true"
+        android:persistent="true"
         android:requestLegacyExternalStorage="true">
 
         <activity

+ 1 - 1
app/src/main/java/org/yameida/worktool/activity/ListenActivity.kt

@@ -372,7 +372,7 @@ class ListenActivity : AppCompatActivity() , HttpCallback {
                             }
                         }
 
-                    }, 1000)
+                    }, 2000)
                 }
             }
         }, 5000)

+ 1 - 0
app/src/main/java/org/yameida/worktool/model/WeworkMessageBean.java

@@ -312,6 +312,7 @@ public class WeworkMessageBean {
     public List<GroupList> groupList;
     public Integer weCom;
     public String weworkSchema;
+    public List<String> ids;
 
     public boolean isRelay;
 

+ 7 - 3
app/src/main/java/org/yameida/worktool/service/GlobalMethod.kt

@@ -162,16 +162,20 @@ fun getRoot(ignoreCheck: Boolean, share: Boolean = false): AccessibilityNodeInfo
                     val tvANR = AccessibilityUtil.findOnceByText(root, "关闭应用", exact = true)
                     val tvANRTow =
                         AccessibilityUtil.findOnceByText(root, "企业微信没有响应", exact = true)
+                    sleep(Constant.BASE_POP_WINDOW_INTERVAL)
                     if (tvANR != null) {
-                        AccessibilityUtil.performClick(tvANR)
                         LogUtils.e("点击关闭应用ANR")
+                        AccessibilityUtil.performClick(tvANR)
                         error("点击关闭应用ANR")
                     } else if (tvANRTow != null) {
                         val findOnceByText =
                             AccessibilityUtil.findOnceByText(root, "确定", exact = true)
+                        sleep(Constant.BASE_POP_WINDOW_INTERVAL)
+                        LogUtils.e("点击ANR确定")
                         AccessibilityUtil.performClick(findOnceByText)
-                        LogUtils.e("点击关闭应用ANR")
-                        error("点击关闭应用ANR")
+                        error("点击关闭确定")
+                    } else {
+                        LogUtils.v("tvANR=:null----tvANRTow=:null")
                     }
 
                 }

+ 12 - 1
app/src/main/java/org/yameida/worktool/service/WeworkLoopImpl.kt

@@ -483,12 +483,16 @@ object WeworkLoopImpl {
                     val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView)
                     if (list != null) {
                         var findDayFlag = false
+                        var num = 0
                         while (!findDayFlag) {
                             val childCount = list.childCount
                             for (i in 0 until list.childCount) {
                                 if (findDayFlag) {
                                     break
                                 }
+                                if (num > 20) {
+                                    break
+                                }
                                 val item = list.getChild(childCount - 1 - i)
                                 if (AccessibilityUtil.findOnceByText(item, "午") != null) {
                                     findDayFlag = true
@@ -542,6 +546,10 @@ object WeworkLoopImpl {
                             if (findDayFlag) {
                                 break
                             }
+                            if (num > 20) {
+                                break
+                            }
+                            num++
                             AccessibilityUtil.performScrollUp(list)
                             sleep(Constant.CHANGE_PAGE_INTERVAL)
                             list.refresh()
@@ -766,7 +774,10 @@ object WeworkLoopImpl {
                         && spotNode.text != null
                         && spotNode.text.toString().replace("+", "").isDigitsOnly()
                     ) {
-                        if (item.getChild(2).getChild(0).text != null && (item.getChild(2).getChild(0).text.toString() == "客户朋友圈" || item.getChild(2).getChild(0).text.toString() == "学员朋友圈")) {
+                        if (item.getChild(2).getChild(0).text != null && (item.getChild(2)
+                                .getChild(0).text.toString() == "客户朋友圈" || item.getChild(2)
+                                .getChild(0).text.toString() == "学员朋友圈")
+                        ) {
                             continue
                         }
                         spotNodeList.add(spotNode)

+ 183 - 113
app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt

@@ -2532,13 +2532,22 @@ object WeworkOperationImpl {
         for (title in LinkedHashSet(titleList)) {
             if (WeworkRoomUtil.intoRoom(title) || WeworkRoomUtil.intoRoom(title, fastIn = false)) {
                 var hasOpenMulti = false
-                for (subMessageBean in messageList) {
+                // 倒序排序
+                val reversedList = messageList.reversed()
+                for (subMessageBean in reversedList) {
                     val receivedName = subMessageBean.nameList?.firstOrNull()
                     val textType = subMessageBean.textType
                     val originalContent = subMessageBean.itemMessageList?.firstOrNull()?.text ?: ""
                     LogUtils.d("receivedName $receivedName textType $textType originalContent $originalContent")
                     if (!hasOpenMulti) {
                         if (!receivedName.isNullOrEmpty()) {
+                            AccessibilityUtil.scrollAndFindByText(
+                                WeworkController.weworkService,
+                                getRoot(),
+                                originalContent,
+                                exact = true
+                            )
+                            sleep(500)
                             if (WeworkTextUtil.longClickMessageItem(
                                     //聊天消息列表 1ListView 0RecycleView xViewGroup
                                     AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView),
@@ -2609,6 +2618,13 @@ object WeworkOperationImpl {
                             }
                         }
                     } else {
+                         AccessibilityUtil.scrollAndFindByText(
+                            WeworkController.weworkService,
+                            getRoot(),
+                            originalContent,
+                            exact = true
+                        )
+                        sleep(500)
                         if (!receivedName.isNullOrEmpty()) {
                             if (WeworkTextUtil.longClickMessageItem(
                                     //聊天消息列表 1ListView 0RecycleView xViewGroup
@@ -4204,111 +4220,111 @@ object WeworkOperationImpl {
         val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView)
         //暂时注释掉这个判断,很奇怪为什么有时候为空
 //        if (list != null) {
-            val frontNode = AccessibilityUtil.findFrontNode(list, 2)
-            val textViewList = AccessibilityUtil.findAllOnceByClazz(frontNode, Views.TextView)
-            if (textViewList.size >= 2) {
-                val searchButton: AccessibilityNodeInfo = textViewList[textViewList.size - 2]
-                val multiButton: AccessibilityNodeInfo = textViewList[textViewList.size - 1]
-                AccessibilityUtil.performClick(multiButton)
-                AccessibilityUtil.performClick(searchButton)
-                var isSelect = false
-                for (select in LinkedHashSet(selectList)) {
-                    val needTrim = select.contains(Constant.regTrimTitle)
-                    val trimTitle = select.replace(Constant.regTrimTitle, "")
-                    AccessibilityUtil.findTextInput(getRoot(), trimTitle)
-                    sleep(Constant.CHANGE_PAGE_INTERVAL)
-                    val selectListView = AccessibilityUtil.findOneByClazz(
-                        getRoot(),
-                        Views.ListView,
-                        Views.RecyclerView,
-                        Views.ViewGroup,
-                        minChildCount = 2
-                    )
-                    val reverseRegexTitle = RegexHelper.reverseRegexTitle(trimTitle)
-                    val regex1 =
-                        (if (Constant.friendRemarkStrict) "^$reverseRegexTitle" else "^(微信昵称:)|((企业)?邮箱:)?$reverseRegexTitle") +
-                                (if (needTrim) ".*?" else Constant.suffixString)
-                    val regex2 = ".*?\\($reverseRegexTitle\\)$"
-                    val regex = "($regex1)|($regex2)"
-                    val matchSelect = AccessibilityUtil.findOneByTextRegex(
-                        selectListView,
-                        regex,
-                        timeout = Constant.CHANGE_PAGE_INTERVAL * 3,
-                        root = false
-                    )
-                    if (selectListView != null && matchSelect != null) {
-                        for (i in 0 until selectListView.childCount) {
-                            val item = selectListView.getChild(i)
-                            val searchResult = AccessibilityUtil.findOnceByTextRegex(item, regex)
-                            //过滤已退出的群聊
-                            if (searchResult?.parent != null && searchResult.parent.childCount < 3) {
-                                item.refresh()
-                                val imageView = AccessibilityUtil.findOneByClazz(
-                                    item,
-                                    Views.ImageView,
-                                    root = false
-                                )
-                                AccessibilityUtil.performClick(imageView)
-                                isSelect = true
-                                break
-                            }
+        val frontNode = AccessibilityUtil.findFrontNode(list, 2)
+        val textViewList = AccessibilityUtil.findAllOnceByClazz(frontNode, Views.TextView)
+        if (textViewList.size >= 2) {
+            val searchButton: AccessibilityNodeInfo = textViewList[textViewList.size - 2]
+            val multiButton: AccessibilityNodeInfo = textViewList[textViewList.size - 1]
+            AccessibilityUtil.performClick(multiButton)
+            AccessibilityUtil.performClick(searchButton)
+            var isSelect = false
+            for (select in LinkedHashSet(selectList)) {
+                val needTrim = select.contains(Constant.regTrimTitle)
+                val trimTitle = select.replace(Constant.regTrimTitle, "")
+                AccessibilityUtil.findTextInput(getRoot(), trimTitle)
+                sleep(Constant.CHANGE_PAGE_INTERVAL)
+                val selectListView = AccessibilityUtil.findOneByClazz(
+                    getRoot(),
+                    Views.ListView,
+                    Views.RecyclerView,
+                    Views.ViewGroup,
+                    minChildCount = 2
+                )
+                val reverseRegexTitle = RegexHelper.reverseRegexTitle(trimTitle)
+                val regex1 =
+                    (if (Constant.friendRemarkStrict) "^$reverseRegexTitle" else "^(微信昵称:)|((企业)?邮箱:)?$reverseRegexTitle") +
+                            (if (needTrim) ".*?" else Constant.suffixString)
+                val regex2 = ".*?\\($reverseRegexTitle\\)$"
+                val regex = "($regex1)|($regex2)"
+                val matchSelect = AccessibilityUtil.findOneByTextRegex(
+                    selectListView,
+                    regex,
+                    timeout = Constant.CHANGE_PAGE_INTERVAL * 3,
+                    root = false
+                )
+                if (selectListView != null && matchSelect != null) {
+                    for (i in 0 until selectListView.childCount) {
+                        val item = selectListView.getChild(i)
+                        val searchResult = AccessibilityUtil.findOnceByTextRegex(item, regex)
+                        //过滤已退出的群聊
+                        if (searchResult?.parent != null && searchResult.parent.childCount < 3) {
+                            item.refresh()
+                            val imageView = AccessibilityUtil.findOneByClazz(
+                                item,
+                                Views.ImageView,
+                                root = false
+                            )
+                            AccessibilityUtil.performClick(imageView)
+                            isSelect = true
+                            break
                         }
                     }
-                    if (matchSelect != null) {
-                        selectResult.successList.add(select)
-                        LogUtils.d("找到搜索结果: $select")
-                    } else {
-                        selectResult.failList.add(select)
-                        LogUtils.e("未搜索到结果: $select")
-                        error("未搜索到结果: $select")
-                        val noResult = AccessibilityUtil.findOnceByText(
-                            getRoot(),
-                            "无搜索结果",
-                            "暂无搜索结果",
-                            exact = true
-                        ) != null
-                        LogUtils.e("企微: 无搜索结果: $noResult")
-                    }
-                    sleep(Constant.POP_WINDOW_INTERVAL)
                 }
-                if (!isSelect) {
-                    LogUtils.e("未选择接收者")
-                    error("未选择接收者")
-                    return selectResult
+                if (matchSelect != null) {
+                    selectResult.successList.add(select)
+                    LogUtils.d("找到搜索结果: $select")
+                } else {
+                    selectResult.failList.add(select)
+                    LogUtils.e("未搜索到结果: $select")
+                    error("未搜索到结果: $select")
+                    val noResult = AccessibilityUtil.findOnceByText(
+                        getRoot(),
+                        "无搜索结果",
+                        "暂无搜索结果",
+                        exact = true
+                    ) != null
+                    LogUtils.e("企微: 无搜索结果: $noResult")
                 }
-                val confirmButton =
-                    AccessibilityUtil.findOneByTextRegex(getRoot(), "^确定(\\(\\d+\\))?\$")
-                if (confirmButton != null) {
-                    AccessibilityUtil.performClick(confirmButton)
-                    sleep(Constant.POP_WINDOW_INTERVAL)
-                    if (!needSend) {
-                        selectResult.result = true
-                        return selectResult
-                    }
-                    if (!extraText.isNullOrBlank()) {
-                        LogUtils.d("extraText: $extraText")
-                        AccessibilityUtil.findTextInput(getRoot(), extraText)
-                    }
-                    val sendButton =
-                        AccessibilityUtil.findOneByTextRegex(getRoot(), "^发送(\\(\\d+\\))?\$")
-                    if (sendButton != null) {
-                        AccessibilityUtil.performClick(sendButton)
-                        selectResult.result = true
-                        return selectResult
-                    }
-                    LogUtils.e("未发现发送按钮")
-                    error("未发现发送按钮")
+                sleep(Constant.POP_WINDOW_INTERVAL)
+            }
+            if (!isSelect) {
+                LogUtils.e("未选择接收者")
+                error("未选择接收者")
+                return selectResult
+            }
+            val confirmButton =
+                AccessibilityUtil.findOneByTextRegex(getRoot(), "^确定(\\(\\d+\\))?\$")
+            if (confirmButton != null) {
+                AccessibilityUtil.performClick(confirmButton)
+                sleep(Constant.POP_WINDOW_INTERVAL)
+                if (!needSend) {
+                    selectResult.result = true
                     return selectResult
-                } else {
-                    LogUtils.e("未发现确认按钮")
-                    error("未发现确认按钮")
+                }
+                if (!extraText.isNullOrBlank()) {
+                    LogUtils.d("extraText: $extraText")
+                    AccessibilityUtil.findTextInput(getRoot(), extraText)
+                }
+                val sendButton =
+                    AccessibilityUtil.findOneByTextRegex(getRoot(), "^发送(\\(\\d+\\))?\$")
+                if (sendButton != null) {
+                    AccessibilityUtil.performClick(sendButton)
+                    selectResult.result = true
                     return selectResult
                 }
+                LogUtils.e("未发现发送按钮")
+                error("未发现发送按钮")
+                return selectResult
             } else {
-                LogUtils.e("未发现搜索和多选按钮")
-                error("未发现搜索和多选按钮")
+                LogUtils.e("未发现确认按钮")
+                error("未发现确认按钮")
                 return selectResult
             }
+        } else {
+            LogUtils.e("未发现搜索和多选按钮")
+            error("未发现搜索和多选按钮")
+            return selectResult
+        }
 //        }
 //        LogUtils.e("未知错误")
 //        error("未知错误")
@@ -6254,22 +6270,24 @@ object WeworkOperationImpl {
     }
 
     fun settingAlarm(message: WeworkMessageBean): Boolean {
-        if ("1" == message.msgCheckFlag && message.msgKeywordList != null) {
-            val msgCheckFlag =
-                AccessibilityUtil.findOneByText(
-                    getRoot(),
-                    "消息包含关键词踢出群聊",
-                    timeout = 2000
-                )
-            val tvMsgCheck =
-                AccessibilityUtil.findBackNode(msgCheckFlag, minChildCount = 1)
-            val msgCheckDesc =
-                AccessibilityUtil.findOnceByDesc(
-                    tvMsgCheck,
-                    "false",
-                    "true",
-                    exact = true
-                )
+        val workVersionName = AppUtils.getAppInfo(Constant.PACKAGE_NAMES)?.versionName
+        val msgCheckFlag =
+            AccessibilityUtil.findOneByText(
+                getRoot(),
+                "消息包含关键词踢出群聊",
+                "踢消息内容包含关键词",
+                timeout = 2000
+            )
+        val tvMsgCheck =
+            AccessibilityUtil.findBackNode(msgCheckFlag, minChildCount = 1)
+        val msgCheckDesc =
+            AccessibilityUtil.findOnceByDesc(
+                tvMsgCheck,
+                "false",
+                "true",
+                exact = true
+            )
+        if ("1" == message.msgCheckFlag && message.msgKeywordList != null && workVersionName != "4.1.36") {
             AccessibilityUtil.performClick(msgCheckDesc)
             sleep(Constant.POP_WINDOW_INTERVAL)
             val msgKeywordSize = message.msgKeywordList.size
@@ -6295,6 +6313,47 @@ object WeworkOperationImpl {
                     sleep(Constant.POP_WINDOW_INTERVAL)
                 }
             }
+        } else if (workVersionName == "4.1.36" && "1" == message.msgCheckFlag && message.msgKeywordList != null) {
+            val msgKeywordSize = message.msgKeywordList.size
+            for (i in 0..msgKeywordSize - 1) {
+                val etList =
+                    AccessibilityUtil.findAllByClazz(
+                        getRoot(),
+                        Views.EditText,
+                        minSize = 2
+                    )
+                AccessibilityUtil.editTextInput(
+                    etList[i],
+                    message.msgKeywordList.get(i)
+                )
+                if (msgKeywordSize == 1) {
+//                    val msgDeleteDesc =
+//                        AccessibilityUtil.findOnceByDesc(
+//                            etList[i],
+//                            "删除",
+//                            exact = true
+//                        )
+                    var msgDeleteDesc = AccessibilityUtil.findBackNode(etList[i + 1])
+//                    var msgDeleteDesc = AccessibilityUtil.findAllByClazz(
+//                        getRoot(ignoreCheck = true, share = true),
+//                        Views.ImageView
+//                    )
+                    AccessibilityUtil.performClick(msgDeleteDesc)
+                }
+                if (i < msgKeywordSize - 1) {
+                    val addMsgTv = AccessibilityUtil.scrollAndFindByText(
+                        WeworkController.weworkService,
+                        getRoot(),
+                        "添加关键词",
+                        exact = true
+                    )
+                    AccessibilityUtil.performClick(addMsgTv)
+                    sleep(Constant.POP_WINDOW_INTERVAL)
+                }
+            }
+        } else if (workVersionName == "4.1.36") {
+            AccessibilityUtil.performClick(msgCheckDesc)
+            sleep(Constant.POP_WINDOW_INTERVAL)
         }
         if ("1" == message.miniSendFlag && message.miniNameList != null) {
             val miniCheckFlag =
@@ -6327,7 +6386,7 @@ object WeworkOperationImpl {
                 val mini = AccessibilityUtil.scrollAndFindByText(
                     WeworkController.weworkService,
                     getRoot(),
-                    message.miniNameList.get(i),
+                    message.miniNameList[i],
                     exact = true
                 )
                 sleep(Constant.POP_WINDOW_INTERVAL)
@@ -6393,6 +6452,7 @@ object WeworkOperationImpl {
                 WeworkController.weworkService,
                 getRoot(),
                 "更多设置",
+                "更多",
                 exact = true
             )
             sleep(Constant.POP_WINDOW_INTERVAL)
@@ -6511,6 +6571,7 @@ object WeworkOperationImpl {
                     WeworkController.weworkService,
                     getRoot(),
                     "客户昵称包含以下关键词踢出群聊",
+                    "踢客户昵称包含关键词",
                     exact = true
                 )
                 val tvNicknameSendCheck =
@@ -6683,6 +6744,7 @@ object WeworkOperationImpl {
             WeworkController.weworkService,
             getRoot(),
             "仅发警告",
+            "踢出群聊",
             exact = true
         )
         AccessibilityUtil.performClick(settingKickTv)
@@ -6825,12 +6887,16 @@ object WeworkOperationImpl {
             val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView)
             if (list != null) {
                 var findDayFlag = false
+                var num = 0
                 while (!findDayFlag) {
                     val childCount = list.childCount
                     for (i in 0 until list.childCount) {
                         if (findDayFlag) {
                             break
                         }
+                        if (num > 20) {
+                            break
+                        }
                         val item = list.getChild(childCount - 1 - i)
                         if (AccessibilityUtil.findOnceByText(item, "午") != null) {
                             findDayFlag = true
@@ -6884,6 +6950,10 @@ object WeworkOperationImpl {
                     if (findDayFlag) {
                         break
                     }
+                    if (num > 20) {
+                        break
+                    }
+                    num++
                     AccessibilityUtil.performScrollUp(list)
                     sleep(Constant.CHANGE_PAGE_INTERVAL)
                     list.refresh()

+ 1 - 1
app/src/main/java/org/yameida/worktool/service/WeworkService.kt

@@ -157,7 +157,7 @@ class WeworkService : AccessibilityService() {
                     ) + "...") else text
                 }"
             )
-            if ("{\"type\":11}" == text) {
+            if ("{\"type\":11}" == text || "连接成功" == text) {
                 return
             }
             try {

+ 1 - 0
app/src/main/java/org/yameida/worktool/utils/WebSocketManager.java

@@ -137,6 +137,7 @@ public class WebSocketManager {
         Log.e(url, "重连");
         boolean isConnect = false;
         int interval = reconnectInt;
+//        close(1000,"closeAll");
         while (true) {
             try {
                 isConnect = connect();

+ 4 - 4
app/src/main/java/org/yameida/worktool/utils/WeworkTextUtil.kt

@@ -395,10 +395,10 @@ object WeworkTextUtil {
                     getMessageListNode(item, WeworkMessageBean.ROOM_TYPE_INTERNAL_CONTACT)
                 if (backNode != null) {
                     val textTypeFromItem = getTextTypeFromItem(item)
-                    val sender = getSender(item)
-                    if ((replyNick != null && sender == 1) || (replyNick == null && sender == 0)) {
-                        continue
-                    }
+//                    val sender = getSender(item)
+//                    if ((replyNick != null && sender == 1) || (replyNick == null && sender == 0)) {
+//                        continue
+//                    }
                     if ((replyTextType == WeworkMessageBean.TEXT_TYPE_IMAGE)
                         && (replyTextType == textTypeFromItem)
                     ) {