diff --git a/app/src/main/java/org/yameida/worktool/Constant.kt b/app/src/main/java/org/yameida/worktool/Constant.kt index 09fcd24..d2ba109 100644 --- a/app/src/main/java/org/yameida/worktool/Constant.kt +++ b/app/src/main/java/org/yameida/worktool/Constant.kt @@ -8,6 +8,8 @@ object Constant { const val PACKAGE_NAMES = "com.tencent.wework" val BASE_URL = WebConfig.HOST.replace("wss", "https").replace("ws", "http") val URL_CHECK_UPDATE = "$BASE_URL/appUpdate/checkUpdate" + const val CHANGE_PAGE_INTERVAL = 1000L + const val POP_WINDOW_INTERVAL = 500L var key = "9876543210abcdef".toByteArray() var iv = "0123456789abcdef".toByteArray() diff --git a/app/src/main/java/org/yameida/worktool/service/WeworkGetImpl.kt b/app/src/main/java/org/yameida/worktool/service/WeworkGetImpl.kt index 818e98d..dfbdfdc 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkGetImpl.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkGetImpl.kt @@ -1,6 +1,7 @@ package org.yameida.worktool.service import com.blankj.utilcode.util.LogUtils +import org.yameida.worktool.Constant import org.yameida.worktool.model.WeworkMessageBean import org.yameida.worktool.utils.AccessibilityUtil import org.yameida.worktool.utils.Views @@ -47,10 +48,10 @@ object WeworkGetImpl { if (!goHomeTab("我")) { LogUtils.d("未找到我的信息") goHomeTab("消息") - val firstTv = AccessibilityUtil.findAllByClazz(getRoot(), Views.TextView, root = true) + val firstTv = AccessibilityUtil.findAllByClazz(getRoot(), Views.TextView) .firstOrNull { it.text == null } AccessibilityUtil.performClick(firstTv) - sleep(1000) + sleep(Constant.CHANGE_PAGE_INTERVAL) val newFirstTv = AccessibilityUtil.findOneByClazz(getRoot(), Views.TextView) val nickname = newFirstTv?.text?.toString() AccessibilityUtil.performClick(firstTv) @@ -67,7 +68,7 @@ object WeworkGetImpl { } } AccessibilityUtil.performClick(AccessibilityUtil.findOneByClazz(getRoot(), Views.ImageView)) - sleep(1000) + sleep(Constant.CHANGE_PAGE_INTERVAL) val relativeLayoutList = AccessibilityUtil.findAllByClazz(getRoot(), Views.RelativeLayout, minSize = 50) val myInfo = WeworkMessageBean.MyInfo() for (relativeLayout in relativeLayoutList.filter { it.childCount >= 2 }) { diff --git a/app/src/main/java/org/yameida/worktool/service/WeworkLoopImpl.kt b/app/src/main/java/org/yameida/worktool/service/WeworkLoopImpl.kt index acfad83..8a73138 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkLoopImpl.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkLoopImpl.kt @@ -4,6 +4,7 @@ import android.os.Message import android.view.accessibility.AccessibilityNodeInfo import androidx.core.text.isDigitsOnly import com.blankj.utilcode.util.LogUtils +import org.yameida.worktool.Constant import org.yameida.worktool.model.WeworkMessageBean import org.yameida.worktool.service.WeworkController.mainLoopRunning import org.yameida.worktool.utils.* @@ -40,7 +41,7 @@ object WeworkLoopImpl { mainLoopRunning = true try { while (mainLoopRunning) { - if (WeworkRoomUtil.getRoomType(getRoot()) != WeworkMessageBean.ROOM_TYPE_UNKNOWN + if (WeworkRoomUtil.getRoomType(getRoot(), false) != WeworkMessageBean.ROOM_TYPE_UNKNOWN && getChatMessageList()) { } goHomeTab("消息") @@ -72,22 +73,22 @@ object WeworkLoopImpl { AccessibilityUtil.performClick(item) val addButton = AccessibilityUtil.findOneByText(getRoot(), "添加客户") val backNode = AccessibilityUtil.findBackNode(addButton) - LogUtils.d(backNode?.className) if (backNode?.className == Views.TextView) { LogUtils.d("有待添加客户") AccessibilityUtil.performClick(backNode) - sleep(2000) AccessibilityUtil.findTextAndClick(getRoot(), "新的客户") - sleep(500) var retry = 5 while (retry-- > 0) { - if (!AccessibilityUtil.findTextAndClick(getRoot(), "查看")) + val checkButton = AccessibilityUtil.findOneByText(getRoot(), "查看", timeout = 2000) + if (checkButton == null) { break - sleep(2000) - val nameList = passFriendRequest() - if (nameList.isEmpty()) - break - //TODO nameList 通过的好友加入演示脚本 + } else { + sleep(Constant.CHANGE_PAGE_INTERVAL) + val nameList = passFriendRequest() + if (nameList.isEmpty()) + break + //TODO nameList 通过的好友加入演示脚本 + } } return true } else { @@ -115,11 +116,11 @@ object WeworkLoopImpl { } if (titleList.size > 0) { val title = titleList.joinToString() - LogUtils.i("聊天: $title") + LogUtils.v("聊天: $title") log("聊天: $title") val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView) if (list != null) { - LogUtils.d("消息条数: " + list.childCount) + LogUtils.v("消息条数: " + list.childCount) val messageList = arrayListOf() for (i in 0 until list.childCount) { val item = list.getChild(i) @@ -162,11 +163,8 @@ object WeworkLoopImpl { val tvNick = filter[0] LogUtils.d("好友请求: " + tvNick.text) AccessibilityUtil.findTextAndClick(getRoot(), "通过验证") - sleep(1000) AccessibilityUtil.findTextAndClick(getRoot(), "完成") - sleep(5000) if (AccessibilityUtil.findTextAndClick(getRoot(), "确定")) { - sleep(500) LogUtils.d("添加好友失败") } else { val weworkMessageBean = WeworkMessageBean() @@ -192,6 +190,7 @@ object WeworkLoopImpl { * 读取聊天列表 */ private fun getChatroomList(): Boolean { + if (!isAtHome()) return true if (logIndex % 3 == 0) { AccessibilityUtil.performScrollUp(getRoot(), 0) AccessibilityUtil.performScrollUp(getRoot(), 0) @@ -199,6 +198,7 @@ object WeworkLoopImpl { } else if (logIndex % 120 < 3) { AccessibilityUtil.performScrollDown(getRoot(), 0) } + if (!isAtHome()) return true if (logIndex++ % 15 == 0) { LogUtils.i("读取首页聊天列表") log("读取首页聊天列表") @@ -267,7 +267,7 @@ object WeworkLoopImpl { val message: WeworkMessageBean.SubMessageBean val nameList = arrayListOf() val itemMessageList = arrayListOf() - LogUtils.d("开始解析一条消息...") + LogUtils.v("开始解析一条消息...") //消息头(在消息主体上方 如时间信息) val linearLayoutItem = AccessibilityUtil.findOnceByClazz(node, Views.LinearLayout, 1) if (linearLayoutItem != null) { @@ -279,7 +279,7 @@ object WeworkLoopImpl { sb.append(text).append("\t") itemMessageList.add(itemMessage) } - LogUtils.d(sb.toString()) + LogUtils.v(sb.toString()) } //消息主体 val relativeLayoutItem = AccessibilityUtil.findOnceByClazz(node, Views.RelativeLayout, 1) @@ -297,7 +297,7 @@ object WeworkLoopImpl { AccessibilityUtil.findAllOnceByClazz(relativeLayoutContent, Views.TextView) for (item in tvList.filter { it.text != null && !it.text.isNullOrBlank() }) { val text = item.text.toString() - LogUtils.d(text) + LogUtils.v(text) if (text !in stopWords) { val itemMessage = WeworkMessageBean.ItemMessageBean(2, text) itemMessageList.add(itemMessage) @@ -307,13 +307,19 @@ object WeworkLoopImpl { message = WeworkMessageBean.SubMessageBean(0, textType, itemMessageList, nameList) } else if (Views.ImageView.equals(relativeLayoutItem.getChild(1).className)) { LogUtils.v("头像在右边 本条消息发送者为自己") - val tvList = AccessibilityUtil.findAllOnceByClazz(relativeLayoutItem, Views.TextView) - for (item in tvList.filter { it.text != null && !it.text.isNullOrBlank() }) { - val text = item.text.toString() - LogUtils.d(text) - if (text !in stopWords) { - val itemMessage = WeworkMessageBean.ItemMessageBean(2, text) - itemMessageList.add(itemMessage) + val subLayout = relativeLayoutItem.getChild(0) + if (subLayout.childCount > 0) { + val tvList = AccessibilityUtil.findAllOnceByClazz( + subLayout.getChild(subLayout.childCount - 1), + Views.TextView + ) + for (item in tvList.filter { it.text != null && !it.text.isNullOrBlank() }) { + val text = item.text.toString() + LogUtils.v(text) + if (text !in stopWords) { + val itemMessage = WeworkMessageBean.ItemMessageBean(2, text) + itemMessageList.add(itemMessage) + } } } message = WeworkMessageBean.SubMessageBean(1, 0, itemMessageList, nameList) @@ -322,7 +328,7 @@ object WeworkLoopImpl { val tvList = AccessibilityUtil.findAllOnceByClazz(node, Views.TextView) for (item in tvList.filter { it.text != null && !it.text.isNullOrBlank() }) { val text = item.text.toString() - LogUtils.d(text) + LogUtils.v(text) val itemMessage = WeworkMessageBean.ItemMessageBean(1, text) itemMessageList.add(itemMessage) } @@ -341,7 +347,7 @@ object WeworkLoopImpl { itemMessageList.add(itemMessage) } } - LogUtils.d(sb.toString()) + LogUtils.v(sb.toString()) message = WeworkMessageBean.SubMessageBean(2, 0, itemMessageList, nameList) } return message diff --git a/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt b/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt index 51323bb..51ab676 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt @@ -2,6 +2,7 @@ package org.yameida.worktool.service import android.view.accessibility.AccessibilityNodeInfo import com.blankj.utilcode.util.LogUtils +import org.yameida.worktool.Constant import org.yameida.worktool.model.WeworkMessageBean import org.yameida.worktool.utils.AccessibilityUtil import org.yameida.worktool.utils.Views @@ -58,7 +59,7 @@ object WeworkOperationImpl { "回复" ) ) { - LogUtils.d("开始回复") + LogUtils.v("开始回复") sendChatMessage(receivedContent, "[自动回复]") LogUtils.d("$title: 回复成功") WeworkLoopImpl.getChatMessageList() @@ -203,11 +204,11 @@ object WeworkOperationImpl { val node = AccessibilityUtil.scrollAndFindByText(getRoot(), "微盘") if (node != null) { AccessibilityUtil.performClick(node) - val buttonList = AccessibilityUtil.findAllByClazz(getRoot(), Views.Button, root = true) + val buttonList = AccessibilityUtil.findAllByClazz(getRoot(), Views.Button) if (buttonList.size >= 4) { AccessibilityUtil.performClick(buttonList[2]) AccessibilityUtil.findTextInput(getRoot(), objectName) - val imageViewList = AccessibilityUtil.findAllByClazz(getRoot(), Views.ImageView, root = true) + val imageViewList = AccessibilityUtil.findAllByClazz(getRoot(), Views.ImageView) if (imageViewList.size >= 2) { AccessibilityUtil.performClick(imageViewList[1]) val shareFileButton = AccessibilityUtil.findOneByDesc(getRoot(), "以原文件分享") @@ -245,11 +246,11 @@ object WeworkOperationImpl { val node = AccessibilityUtil.scrollAndFindByText(getRoot(), "微盘") if (node != null) { AccessibilityUtil.performClick(node) - val buttonList = AccessibilityUtil.findAllByClazz(getRoot(), Views.Button, root = true) + val buttonList = AccessibilityUtil.findAllByClazz(getRoot(), Views.Button) if (buttonList.size >= 4) { AccessibilityUtil.performClick(buttonList[2]) AccessibilityUtil.findTextInput(getRoot(), objectName) - val imageViewList = AccessibilityUtil.findAllByClazz(getRoot(), Views.ImageView, root = true) + val imageViewList = AccessibilityUtil.findAllByClazz(getRoot(), Views.ImageView) if (imageViewList.size >= 2) { AccessibilityUtil.performClick(imageViewList[1]) val shareFileButton = AccessibilityUtil.findOneByDesc(getRoot(), "转发") @@ -283,7 +284,7 @@ object WeworkOperationImpl { val node = AccessibilityUtil.scrollAndFindByText(getRoot(), "用过的小程序") if (node != null) { AccessibilityUtil.performClick(node) - val textViewList = AccessibilityUtil.findAllByClazz(getRoot(), Views.TextView, root = true) + val textViewList = AccessibilityUtil.findAllByClazz(getRoot(), Views.TextView) if (textViewList.size > 3) { AccessibilityUtil.performClick(textViewList[2]) AccessibilityUtil.findTextInput(getRoot(), objectName) @@ -325,11 +326,11 @@ object WeworkOperationImpl { return false } AccessibilityUtil.performClick(myFileButton) - val buttonList = AccessibilityUtil.findAllByClazz(getRoot(), Views.Button, root = true) + val buttonList = AccessibilityUtil.findAllByClazz(getRoot(), Views.Button) if (buttonList.size >= 4) { AccessibilityUtil.performClick(buttonList[3]) AccessibilityUtil.findTextInput(getRoot(), objectName) - val imageViewList = AccessibilityUtil.findAllByClazz(getRoot(), Views.ImageView, root = true) + val imageViewList = AccessibilityUtil.findAllByClazz(getRoot(), Views.ImageView) if (imageViewList.size >= 2) { AccessibilityUtil.performClick(imageViewList[1]) val shareFileButton = AccessibilityUtil.findOneByDesc(getRoot(), "转发") @@ -362,26 +363,21 @@ object WeworkOperationImpl { val searchButton: AccessibilityNodeInfo = textViewList[textViewList.size - 2] val multiButton: AccessibilityNodeInfo = textViewList[textViewList.size - 1] AccessibilityUtil.performClick(multiButton) - sleep(500) - val listViewList = AccessibilityUtil.findAllByClazz(getRoot(), Views.ListView, root = true) + sleep(Constant.POP_WINDOW_INTERVAL) + val listViewList = AccessibilityUtil.findAllByClazz(getRoot(), Views.ListView) if (!listViewList.isNullOrEmpty()) { if (AccessibilityUtil.findTextAndClick(listViewList.last(), "添加客户")) { AccessibilityUtil.findTextAndClick(getRoot(), "搜索手机号添加") AccessibilityUtil.findTextInput(getRoot(), friend.phone.trim()) if (AccessibilityUtil.findTextAndClick(getRoot(), "网络查找手机")) { - val bothUsedTv = AccessibilityUtil.findOneByText(getRoot(), "对方同时使用") + val bothUsedTv = AccessibilityUtil.findOneByText(getRoot(), "对方同时使用", timeout = 2000) if (bothUsedTv != null) { - if (AccessibilityUtil.performClick( - AccessibilityUtil.findOnceByClazz( - AccessibilityUtil.findBackNode(bothUsedTv), - Views.ImageView - ) + AccessibilityUtil.performClick( + AccessibilityUtil.findOnceByClazz( + AccessibilityUtil.findBackNode(bothUsedTv), + Views.ImageView ) - ) { - sleep(2000) - } else { - LogUtils.e("未找到可点击图标") - } + ) } } else { LogUtils.e("未找到查找手机选项") @@ -400,7 +396,7 @@ object WeworkOperationImpl { ) { AccessibilityUtil.performClick(markTv) val etList = - AccessibilityUtil.findAllByClazz(getRoot(), Views.EditText, root = true, minSize = 5) + AccessibilityUtil.findAllByClazz(getRoot(), Views.EditText, minSize = 5) if (etList.size >= 5) { if (friend.markName != null) { AccessibilityUtil.editTextInput(etList[0], friend.markName) @@ -413,14 +409,11 @@ object WeworkOperationImpl { } } AccessibilityUtil.findTextAndClick(getRoot(), "保存") - sleep(2000) } //设置标签 if (!friend.tagList.isNullOrEmpty()) { if (AccessibilityUtil.findTextAndClick(getRoot(), "标签")) { - sleep(1000) setFriendTags(friend.tagList) - sleep(1000) } } //添加联系人 @@ -440,7 +433,6 @@ object WeworkOperationImpl { } if (AccessibilityUtil.findTextAndClick(getRoot(), "添加为联系人")) { LogUtils.d("添加好友成功: " + friend.phone) - sleep(2000) if (AccessibilityUtil.findTextAndClick(getRoot(), "发送添加邀请")) { LogUtils.d("发送添加邀请成功: " + friend.phone) } @@ -787,51 +779,51 @@ object WeworkOperationImpl { private fun setFriendTags(tagList: List): Boolean { val tagList = if (tagList.size > 5) tagList.subList(0, 5) else tagList val tvTag = AccessibilityUtil.findAllByText(getRoot(), "个人标签").lastOrNull() - if (tvTag != null) { - val list = AccessibilityUtil.findBackNode(tvTag) - if (list != null && list.childCount > 0) { - LogUtils.v("list.childCount: " + list.childCount) - val tvAdd = list.getChild(0) - val oldTagList = arrayListOf() - for (i in 0 until list.childCount) { - val child = list.getChild(i) - if (child.className.equals(Views.TextView) && child.text != null) { - oldTagList.add(child.text.toString()) - } + val oldTagList = arrayListOf() + val list = AccessibilityUtil.findBackNode(tvTag) + if (list != null && list.childCount > 0) { + for (i in 0 until list.childCount) { + val child = list.getChild(i) + if (child.className.equals(Views.TextView) && child.text != null) { + oldTagList.add(child.text.toString()) } - //不存在的标签先添加 - for (tag in tagList) { - if (!oldTagList.contains(tag)) { - AccessibilityUtil.performClick(tvAdd) - sleep(500) + } + //不存在的标签先添加 + for (tag in tagList) { + if (!oldTagList.contains(tag)) { + AccessibilityUtil.findOneByText(getRoot(), "个人标签") + sleep(Constant.POP_WINDOW_INTERVAL) + val tempList = AccessibilityUtil.findBackNode( + AccessibilityUtil.findAllByText(getRoot(), "个人标签").lastOrNull()) + if (tempList != null && tempList.childCount > 0) { + AccessibilityUtil.performClick(tempList.getChild(0)) AccessibilityUtil.findTextInput(getRoot(), tag) AccessibilityUtil.findTextAndClick(getRoot(), "确定") - sleep(1000) } } - //确认只选择列表里的标签 - val count = list.childCount - for (i in 0 until count) { - val child = list.getChild(i) - if (child != null) { - val text = child.text - val selected = child.isSelected - LogUtils.v("text: $text selected: $selected") - if (tagList.count { it == text } > 0) { - if (!selected) { - AccessibilityUtil.performClick(child) - } - } else { - if (selected) { - AccessibilityUtil.performClick(child) - } + } + //确认只选择列表里的标签 + val count = list.childCount + for (i in 0 until count) { + val child = list.getChild(i) + if (child != null) { + val text = child.text + val selected = child.isSelected + LogUtils.v("text: $text selected: $selected") + if (tagList.count { it == text } > 0) { + if (!selected) { + AccessibilityUtil.performClick(child) + } + } else { + if (selected) { + AccessibilityUtil.performClick(child) } } - list.refresh() - } - if (AccessibilityUtil.findTextAndClick(getRoot(), "确定")) { - return true } + list.refresh() + } + if (AccessibilityUtil.findTextAndClick(getRoot(), "确定")) { + return true } } LogUtils.e("未找到个人标签") diff --git a/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt b/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt index 92f8aef..43e679e 100644 --- a/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt +++ b/app/src/main/java/org/yameida/worktool/utils/WeworkRoomUtil.kt @@ -5,6 +5,7 @@ import org.yameida.worktool.utils.AccessibilityUtil.findOneByClazz import org.yameida.worktool.utils.AccessibilityUtil.findFrontNode import org.yameida.worktool.model.WeworkMessageBean import com.blankj.utilcode.util.LogUtils +import org.yameida.worktool.Constant import org.yameida.worktool.service.backPress import org.yameida.worktool.service.getRoot import org.yameida.worktool.service.goHome @@ -20,7 +21,7 @@ object WeworkRoomUtil { * 房间类型 ROOM_TYPE * @see WeworkMessageBean.ROOM_TYPE */ - fun getRoomType(root: AccessibilityNodeInfo): Int { + fun getRoomType(root: AccessibilityNodeInfo, print: Boolean = true): Int { when { isExternalSingleChat(root) -> { LogUtils.d("ROOM_TYPE: ROOM_TYPE_EXTERNAL_CONTACT") @@ -40,7 +41,7 @@ object WeworkRoomUtil { return WeworkMessageBean.ROOM_TYPE_INTERNAL_CONTACT } else -> { - LogUtils.d("ROOM_TYPE: ROOM_TYPE_UNKNOWN") + if (print) LogUtils.d("ROOM_TYPE: ROOM_TYPE_UNKNOWN") return WeworkMessageBean.ROOM_TYPE_UNKNOWN } } @@ -66,7 +67,7 @@ object WeworkRoomUtil { } } } - LogUtils.d("getRoomTitle: ", titleList) + LogUtils.v("getRoomTitle: ", titleList) return titleList } @@ -96,11 +97,11 @@ object WeworkRoomUtil { val multiButton: AccessibilityNodeInfo = textViewList[textViewList.size - 1] AccessibilityUtil.performClick(searchButton) AccessibilityUtil.findTextInput(getRoot(), title.replace("…", "")) - sleep(1000) + sleep(Constant.CHANGE_PAGE_INTERVAL) val selectListView = findOneByClazz(getRoot(), Views.ListView) val imageView = AccessibilityUtil.findOnceByClazz(selectListView, Views.ImageView) AccessibilityUtil.performClick(imageView) - sleep(1000) + sleep(Constant.CHANGE_PAGE_INTERVAL) return true } else { LogUtils.e("未找到搜索按钮") @@ -192,7 +193,7 @@ object WeworkRoomUtil { val buttonList = findAllOnceByClazz(textViewList.last().parent.parent, Views.TextView) return buttonList.size == 2 } else { - LogUtils.d("未找到群管理按钮") + LogUtils.v("未找到群管理按钮") } } else { LogUtils.d("未找到消息列表") diff --git a/app/src/main/java/org/yameida/worktool/utils/WeworkTextUtil.kt b/app/src/main/java/org/yameida/worktool/utils/WeworkTextUtil.kt index 1771b66..6bc6374 100644 --- a/app/src/main/java/org/yameida/worktool/utils/WeworkTextUtil.kt +++ b/app/src/main/java/org/yameida/worktool/utils/WeworkTextUtil.kt @@ -309,7 +309,7 @@ object WeworkTextUtil { private fun longClickMessageItem(item: AccessibilityNodeInfo, key: String): Boolean { val backNode = getMessageListNode(item) AccessibilityUtil.performLongClickWithSon(backNode) - val optionRvList = findAllByClazz(getRoot(), Views.RecyclerView, root = true) + val optionRvList = findAllByClazz(getRoot(), Views.RecyclerView) for (optionRv in optionRvList) { val optionTvList = findAllOnceByClazz(optionRv, Views.TextView) for (optionTv in optionTvList) {