Skip to content

Commit

Permalink
update 兼容主动添加好友;可变回复内容前缀;其他已知问题优化
Browse files Browse the repository at this point in the history
  • Loading branch information
尹甲仑 committed Aug 26, 2022
1 parent cab4289 commit 96f15bb
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,8 @@ public class WeworkMessageBean {
public String receivedName;
//内容移除了@me
public String receivedContent;
//回复内容前缀
public String prefix;
//想要at的昵称
public String at;
//原始内容text
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ object WeworkController {
* @param message#originalContent 原始消息的内容
* @param message#textType 原始消息的消息类型
* @param message#receivedContent 回复内容
* @param message#prefix 回复内容前缀
* @see WeworkMessageBean.TEXT_TYPE
*/
@RequestMapping
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ 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.Demo
import org.yameida.worktool.model.WeworkMessageBean
import org.yameida.worktool.service.WeworkController.mainLoopRunning
import org.yameida.worktool.utils.*
Expand Down Expand Up @@ -73,7 +72,8 @@ object WeworkLoopImpl {
val nameList = passFriendRequest()
if (nameList.isEmpty())
break
Demo.test2(nameList[0])
//todo 可自定义执行任务
// Demo.test2(nameList[0])
}
}
return true
Expand Down Expand Up @@ -105,6 +105,7 @@ object WeworkLoopImpl {
val title = titleList.joinToString()
LogUtils.v("聊天: $title")
log("聊天: $title")
//聊天消息列表 1ListView 0RecycleView xViewGroup
val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView)
if (list != null) {
LogUtils.v("消息条数: " + list.childCount)
Expand Down
162 changes: 95 additions & 67 deletions app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,21 @@ object WeworkOperationImpl {
* @param originalContent 原始消息的内容
* @param textType 原始消息的消息类型
* @param receivedContent 回复内容
* @param prefix 回复内容前缀
* @see WeworkMessageBean.TEXT_TYPE
*/
fun replyMessage(
titleList: List<String>,
receivedName: String?,
originalContent: String,
textType: Int,
receivedContent: String
receivedContent: String,
prefix: String = "[自动回复]"
): Boolean {
for (title in titleList) {
if (WeworkRoomUtil.intoRoom(title)) {
if (WeworkTextUtil.longClickMessageItem(
//聊天消息列表 1ListView 0RecycleView xViewGroup
AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView),
textType,
receivedName,
Expand All @@ -65,17 +68,17 @@ object WeworkOperationImpl {
)
) {
LogUtils.v("开始回复")
sendChatMessage(receivedContent, "[自动回复]")
sendChatMessage(receivedContent, prefix)
LogUtils.d("$title: 回复成功")
WeworkLoopImpl.getChatMessageList()
return true
} else {
LogUtils.d("$title: 回复失败 直接发送答案")
error("$title: 回复失败 直接发送答案 $receivedContent")
if (receivedName == null) {
sendChatMessage(receivedContent, "[自动回复]$originalContent\n")
sendChatMessage(receivedContent, "$prefix$originalContent\n")
} else {
sendChatMessage(receivedContent, "[自动回复]$originalContent】@$receivedName\n")
sendChatMessage(receivedContent, "$prefix$originalContent】@$receivedName\n")
}
WeworkLoopImpl.getChatMessageList()
}
Expand Down Expand Up @@ -108,6 +111,7 @@ object WeworkOperationImpl {
for (title in titleList) {
if (WeworkRoomUtil.intoRoom(title)) {
if (WeworkTextUtil.longClickMessageItem(
//聊天消息列表 1ListView 0RecycleView xViewGroup
AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView),
textType,
receivedName,
Expand Down Expand Up @@ -167,63 +171,6 @@ object WeworkOperationImpl {
return true
}

fun getGroupQrcode(groupName: String): Boolean {
if (WeworkRoomUtil.intoRoom(groupName) && WeworkRoomUtil.intoGroupManager()) {
val tvList = AccessibilityUtil.findAllOnceByClazz(getRoot(), Views.TextView)
tvList.forEachIndexed { index, tv ->
if (tv.text != null && tv.text.contains("微信用户创建")) {
if (index + 1 < tvList.size) {
val tvQr = tvList[index + 1]
AccessibilityUtil.performClick(tvQr)
}
}
}
AccessibilityUtil.findOneByText(getRoot(), "保存到相册")
val startTime = System.currentTimeMillis()
var currentTime = startTime
while (currentTime - startTime <= Constant.CHANGE_PAGE_INTERVAL * 5) {
AccessibilityUtil.findOnceByClazz(getRoot(), Views.ProgressBar) ?: break
sleep(Constant.POP_WINDOW_INTERVAL / 5)
currentTime = System.currentTimeMillis()
}
if (AccessibilityUtil.findTextAndClick(getRoot(), "保存到相册")) {
sleep(Constant.CHANGE_PAGE_INTERVAL)
val fileDirPath = "/storage/emulated/0/DCIM/WeixinWork"
val fileDir = FileUtils.getFileByPath(fileDirPath)
if (fileDir.isDirectory) {
for (file in fileDir.listFiles().filter { it.name.endsWith(".jpg") }) {
val fileTime = file.name.replace("mmexport", "")
.replace(".jpg", "")
LogUtils.v("fileTime: $fileTime")
if (fileTime.isNotBlank()) {
if (fileTime.toLong() > currentTime) {
LogUtils.d("找到最新保存二维码图片: $fileTime")
try {
val bitmap = ImageUtils.bytes2Bitmap(file.readBytes())
val mDecoder = QRCodeDecoder.Builder().build()
val qrcode = mDecoder.decode(bitmap)
LogUtils.e("group: $groupName qrcode: $qrcode")
val weworkMessageBean = WeworkMessageBean()
weworkMessageBean.type = WeworkMessageBean.GET_GROUP_QRCODE
weworkMessageBean.groupName = groupName
weworkMessageBean.qrcode = qrcode
WeworkController.weworkService.webSocketManager.send(
weworkMessageBean
)
return true
} catch (e: Exception) {
e.printStackTrace()
LogUtils.e(e)
}
}
}
}
}
}
}
return false
}

/**
* 进入群聊并修改群配置
* 群名称、群公告、拉人、踢人
Expand Down Expand Up @@ -443,7 +390,7 @@ object WeworkOperationImpl {
friend: WeworkMessageBean.Friend
): Boolean {
goHome()
val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView)
val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.RecyclerView, Views.ListView, Views.ViewGroup)
if (list != null) {
val frontNode = AccessibilityUtil.findFrontNode(list)
val textViewList = AccessibilityUtil.findAllOnceByClazz(frontNode, Views.TextView)
Expand All @@ -452,9 +399,19 @@ object WeworkOperationImpl {
val multiButton: AccessibilityNodeInfo = textViewList[textViewList.size - 1]
AccessibilityUtil.performClick(multiButton)
sleep(Constant.POP_WINDOW_INTERVAL)
val listViewList = AccessibilityUtil.findAllByClazz(getRoot(), Views.ListView)
if (!listViewList.isNullOrEmpty()) {
if (AccessibilityUtil.findTextAndClick(listViewList.last(), "添加客户", "添加居民", "加微信")) {
val list = AccessibilityUtil.findAllByClazz(getRoot(), Views.ListView).lastOrNull()
if (list != null) {
val button = AccessibilityUtil.findOneByText(list, "添加客户", "添加居民", "加微信")
if (button != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
AccessibilityUtil.performClick(button)
sleep(Constant.POP_WINDOW_INTERVAL)
if (AccessibilityUtil.findOnceByText(list, "添加客户", "添加居民", "加微信") != null) {
AccessibilityUtil.clickByNode(WeworkController.weworkService, button)
}
} else {
AccessibilityUtil.performClick(button)
}
AccessibilityUtil.findTextAndClick(getRoot(), "搜索手机号添加")
AccessibilityUtil.findTextInput(getRoot(), friend.phone.trim())
if (AccessibilityUtil.findTextAndClick(getRoot(), "网络查找手机")) {
Expand Down Expand Up @@ -585,6 +542,7 @@ object WeworkOperationImpl {
* extraText 转发是否附加一条文本
*/
private fun relaySelectTarget(selectList: List<String>, extraText: String? = null): Boolean {
//聊天消息列表 1ListView 0RecycleView xViewGroup
val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView)
if (list != null) {
val frontNode = AccessibilityUtil.findFrontNode(list, 2)
Expand Down Expand Up @@ -730,6 +688,7 @@ object WeworkOperationImpl {
LogUtils.e("未找到添加成员按钮")
return false
}
//群详情列表
val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView)
if (list != null) {
val frontNode = AccessibilityUtil.findFrontNode(list, 2)
Expand Down Expand Up @@ -797,6 +756,7 @@ object WeworkOperationImpl {
LogUtils.e("未找到删除成员按钮")
return false
}
//群详情列表
val list = AccessibilityUtil.findOneByClazz(getRoot(), Views.ListView)
if (list != null) {
val frontNode = AccessibilityUtil.findFrontNode(list, 2)
Expand Down Expand Up @@ -888,10 +848,14 @@ object WeworkOperationImpl {
* 发送消息+@at
*/
private fun sendChatMessage(text: String, prefix: String = "", at: String? = null) {
val voiceFlag = AccessibilityUtil.findOnceByText(getRoot(), "按住 说话", "按住说话", exact = true)
if (voiceFlag != null) {
AccessibilityUtil.performClickWithSon(AccessibilityUtil.findFrontNode(voiceFlag))
}
var atFailed = false
if (!at.isNullOrEmpty()) {
AccessibilityUtil.findTextInput(getRoot(), "@")
val atFlag = AccessibilityUtil.findOneByText(getRoot(), "选择提醒的人", timeout = 2000)
val atFlag = AccessibilityUtil.findOneByText(getRoot(), "选择提醒的人", timeout = 2000, exact = true)
if (atFlag != null) {
val rv = AccessibilityUtil.findOneByClazz(getRoot(), Views.RecyclerView)
if (rv != null) {
Expand Down Expand Up @@ -926,7 +890,8 @@ object WeworkOperationImpl {
}
}
val content = if (atFailed) "@$at $prefix$text" else "$prefix$text"
if (AccessibilityUtil.findTextInput(getRoot(), content, append = !atFailed)) {
val append = !at.isNullOrEmpty() && !atFailed
if (AccessibilityUtil.findTextInput(getRoot(), content, append = append)) {
val sendButton = AccessibilityUtil.findAllByClazz(getRoot(), Views.Button)
.firstOrNull { it.text == "发送" }
if (sendButton != null) {
Expand Down Expand Up @@ -993,11 +958,74 @@ object WeworkOperationImpl {
list.refresh()
}
if (AccessibilityUtil.findTextAndClick(getRoot(), "确定")) {
sleep(Constant.POP_WINDOW_INTERVAL)
//可能有两次确定 另一次为添加新tag
AccessibilityUtil.findTextAndClick(getRoot(), "确定")
return true
}
}
LogUtils.e("未找到个人标签")
return false
}

/**
* 获取群二维码并上传后台
*/
fun getGroupQrcode(groupName: String): Boolean {
if (WeworkRoomUtil.intoRoom(groupName) && WeworkRoomUtil.intoGroupManager()) {
val tvList = AccessibilityUtil.findAllOnceByClazz(getRoot(), Views.TextView)
tvList.forEachIndexed { index, tv ->
if (tv.text != null && tv.text.contains("微信用户创建")) {
if (index + 1 < tvList.size) {
val tvQr = tvList[index + 1]
AccessibilityUtil.performClick(tvQr)
}
}
}
AccessibilityUtil.findOneByText(getRoot(), "保存到相册")
val startTime = System.currentTimeMillis()
var currentTime = startTime
while (currentTime - startTime <= Constant.CHANGE_PAGE_INTERVAL * 5) {
AccessibilityUtil.findOnceByClazz(getRoot(), Views.ProgressBar) ?: break
sleep(Constant.POP_WINDOW_INTERVAL / 5)
currentTime = System.currentTimeMillis()
}
if (AccessibilityUtil.findTextAndClick(getRoot(), "保存到相册")) {
sleep(Constant.CHANGE_PAGE_INTERVAL)
val fileDirPath = "/storage/emulated/0/DCIM/WeixinWork"
val fileDir = FileUtils.getFileByPath(fileDirPath)
if (fileDir.isDirectory) {
for (file in fileDir.listFiles().filter { it.name.endsWith(".jpg") }) {
val fileTime = file.name.replace("mmexport", "")
.replace(".jpg", "")
LogUtils.v("fileTime: $fileTime")
if (fileTime.isNotBlank()) {
if (fileTime.toLong() > currentTime) {
LogUtils.d("找到最新保存二维码图片: $fileTime")
try {
val bitmap = ImageUtils.bytes2Bitmap(file.readBytes())
val mDecoder = QRCodeDecoder.Builder().build()
val qrcode = mDecoder.decode(bitmap)
LogUtils.e("group: $groupName qrcode: $qrcode")
val weworkMessageBean = WeworkMessageBean()
weworkMessageBean.type = WeworkMessageBean.GET_GROUP_QRCODE
weworkMessageBean.groupName = groupName
weworkMessageBean.qrcode = qrcode
WeworkController.weworkService.webSocketManager.send(
weworkMessageBean
)
return true
} catch (e: Exception) {
e.printStackTrace()
LogUtils.e(e)
}
}
}
}
}
}
}
return false
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ object AccessibilityUtil {
}
nodeInfo = nodeInfo.parent
}
LogUtils.e("performClick failed! ${nodeInfo?.className}")
return false
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ object WeworkRoomUtil {
*/
fun getRoomTitle(print: Boolean = true): ArrayList<String> {
val titleList = arrayListOf<String>()
//聊天消息列表 1ListView 0RecycleView xViewGroup
val list = AccessibilityUtil.findOnceByClazz(getRoot(), Views.ListView)
if (list != null) {
val frontNode = findFrontNode(list.parent.parent)
Expand Down Expand Up @@ -102,6 +103,7 @@ object WeworkRoomUtil {
AccessibilityUtil.performClick(searchButton)
AccessibilityUtil.findTextInput(getRoot(), title.replace("", "").replace("-.*$".toRegex(), ""))
sleep(Constant.CHANGE_PAGE_INTERVAL)
//消息页搜索结果列表
val selectListView = findOneByClazz(getRoot(), Views.ListView)
val imageView = AccessibilityUtil.findOnceByClazz(selectListView, Views.ImageView)
if (imageView != null) {
Expand Down Expand Up @@ -129,6 +131,7 @@ object WeworkRoomUtil {
if (AccessibilityUtil.findOnceByText(getRoot(), "全部群成员", "微信用户创建") != null) {
return true
}
//群详情列表
val list = findOneByClazz(getRoot(), Views.ListView)
if (list != null) {
val frontNode = AccessibilityUtil.findFrontNode(list.parent.parent)
Expand All @@ -153,6 +156,7 @@ object WeworkRoomUtil {
if (AccessibilityUtil.findOneByText(getRoot(), "设置聊天背景") != null) {
return true
}
//同群详情列表
val list = findOneByClazz(getRoot(), Views.ListView)
if (list != null) {
val frontNode = AccessibilityUtil.findFrontNode(list.parent.parent)
Expand Down Expand Up @@ -210,6 +214,7 @@ object WeworkRoomUtil {
* listview前兄弟控件 && text包含外部群
*/
private fun isExternalGroup(): Boolean {
//聊天消息列表 1ListView 0RecycleView xViewGroup
val listView = AccessibilityUtil.findOnceByClazz(getRoot(), Views.ListView, limitDepth = null, depth = 0)
if (listView != null) {
val frontNode = findFrontNode(listView)
Expand All @@ -226,8 +231,10 @@ object WeworkRoomUtil {
* 有列表和输入框
*/
private fun isSingleChat(): Boolean {
//聊天消息列表 1ListView 0RecycleView xViewGroup
val list = AccessibilityUtil.findOnceByClazz(getRoot(), Views.ListView)
val editText = AccessibilityUtil.findOnceByClazz(getRoot(), Views.EditText)
?: AccessibilityUtil.findOnceByText(getRoot(), "按住 说话", "按住说话", exact = true)
if (list != null && editText != null) {
return true
}
Expand Down

0 comments on commit 96f15bb

Please sign in to comment.