package wxrouter
import (
"bytes"
"encoding/json"
"encoding/xml"
"fmt"
"regexp"
"strconv"
"strings"
"time"
"xiawan/wx/api/req"
"xiawan/wx/clientsdk"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/clientsdk/baseutils"
"xiawan/wx/db"
"xiawan/wx/db/table"
"xiawan/wx/protobuf/wechat"
"xiawan/wx/srv/srvconfig"
"xiawan/wx/srv/wxcore"
"xiawan/wx/srv/wxface"
"github.com/gogo/protobuf/proto"
)
// WXNewSyncRouter 获取二维码响应路由
type WXNewSyncRouter struct {
wxcore.WXBaseRouter
}
// Handle 处理conn业务的方法
func (hbr *WXNewSyncRouter) Handle(wxResp wxface.IWXResponse) error {
defer wxcore.TryE("WXNewSyncRouter Handle")
currentWXConn := wxResp.GetWXConncet()
currentWXAccount := currentWXConn.GetWXAccount()
currentUserInfo := currentWXAccount.GetUserInfo()
currentWXCache := currentWXConn.GetWXCache()
currentSyncMgr := currentWXConn.GetWXSyncMgr()
isServerRestart := currentWXAccount.GetUserInfo().GetIsServerRestart()
currentTaskMgr := currentWXConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
if !taskMgr.GetTaskStatus() {
taskMgr.Start()
}
// 同步响应
var syncResp wechat.NewSyncResponse
err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &syncResp)
if err != nil {
// 请求出问题了,判断是否掉线,并重连
time.Sleep(1 * time.Second)
go currentWXConn.CheckOnLineStatusLogin()
return err
}
// 异步执行,不影响消息同步
// 跟新同步 Key
syncKey := syncResp.GetKeyBuf().GetBuffer()
//保存SyncKey
if len(currentUserInfo.SyncKey) <= 0 || !bytes.Equal(currentUserInfo.SyncKey, syncResp.GetKeyBuf().GetBuffer()) {
currentUserInfo.SyncKey = syncKey
db.UpdateUserInfo(currentUserInfo)
}
// 如果没有同步到数据则返回bInitNewSyncFinished
cmdList := syncResp.GetCmdList()
syncCount := cmdList.GetCount()
continueFlag := syncResp.GetContinueFlag()
//log.Info(syncResp.GetContinueFlag(), syncCount)
//redis 发布结构体
messageResp := new(table.SyncMessageResponse)
// 遍历同步的信息和群
itemList := cmdList.GetItemList()
for index := uint32(0); index < syncCount; index++ {
item := itemList[index]
itemID := item.GetCmdId()
// 同步到消息
if itemID == baseinfo.CmdIDAddMsg {
// 初始化阶段跳过处理历史消息
if !currentWXCache.IsInitNewSyncFinished() {
// fmt.Println("跳过历史消息推送 - IsInitNewSyncFinished=false")
continue
}
// fmt.Println("处理消息 - IsInitNewSyncFinished=true")
addMsg := &wechat.AddMsg{}
err := proto.Unmarshal(item.CmdBuf.Data, addMsg)
if err != nil {
baseutils.PrintLog(err.Error())
continue
}
// 消息同步xiaoyue命令
// fmt.Println("xiaoyue命令-------new")
go dealAddMsgRun(currentWXConn, addMsg, "new")
// ws 同步消息 - 使用任务的WebSocket状态
socketMsgTask := taskMgr.SocketMsgTask
if socketMsgTask.IsWebSocketEnabled() {
go socketMsgTask.AddMsgItem(addMsg)
}
// 重启服务 不判断过期时间和禁用
if !isServerRestart {
go dealAuth(currentWXConn)
}
}
// 同步到联系人
if itemID == baseinfo.CmdIDModContact {
// 完全禁用联系人的 WebSocket 推送(等待有缘的老板来做定制)
fmt.Println("跳过所有联系人同步推送(包括历史和实时)")
continue
// 如果将来需要启用实时联系人推送,使用下面的逻辑:
// if !currentWXCache.IsInitNewSyncFinished() {
// fmt.Println("跳过历史联系人同步 - IsInitNewSyncFinished=false")
// continue
// }
// contact := new(wechat.ModContact)
// err := proto.Unmarshal(item.GetCmdBuf().GetData(), contact)
// if err != nil {
// continue
// }
// fmt.Println("ModContact", contact)
// dealModContact(currentWXConn, contact)
}
// 如果开启了http消息同步就推送到redis
// fmt.Println("httpSyncMsg", srvconfig.GlobalSetting.HttpSyncMsg)
if srvconfig.GlobalSetting.HttpSyncMsg {
messageResp.SetMessage(item.GetCmdBuf().GetData(), int32(itemID))
}
}
// 判断消息初始化完成
if continueFlag <= 0 || syncCount <= 0 {
if !currentWXCache.IsInitNewSyncFinished() {
currentWXCache.SetInitNewSyncFinished(true)
fmt.Println("[回调修复] 历史消息同步完成,自动激活回调功能")
}
}
// 发布同步信息消息
// 每次服务重启, 已登录的微信号 都会执行到这一步来同步消息;
// 未登录的微信在登录后, 也会在 wxnewinit.go 文件内进行【发布同步信息消息】操作
//log.Info("发布同步信息消息", currentUserInfo.NickName+"-->发布同步信息消息{}-"+currentUserInfo.GetUserName())
if srvconfig.GlobalSetting.HttpSyncMsg {
go db.PublishSyncMsgWxMessage(currentWXAccount, *messageResp)
}
// 如果数量超过10条则继续同步
if !currentWXCache.IsInitNewSyncFinished() {
currentSyncMgr.SendNewSyncRequest()
}
return nil
}
// dealModContact 处理同步到的联系人信息
func dealModContact(wxConn wxface.IWXConnect, modContact *wechat.ModContact) {
currentWXAccount := wxConn.GetWXAccount()
userName := modContact.GetUserName().GetStr()
uuid := currentWXAccount.GetUserInfo().UUID
// 发送联系人回调
go sendContactCallback(wxConn, modContact, uuid)
// 处理群
if strings.HasSuffix(userName, "@chatroom") {
memberCount := modContact.GetNewChatroomData().GetMemberCount()
if memberCount <= 0 {
// 被移除群聊
// currentWXAccount.RemoveWXGroup(userName)
db.DeleteContact(userName, uuid)
} else {
// 新增群聊
// currentWXAccount.AddWXGroup(modContact)
db.SaveOrUpdateContact(modContact, uuid)
}
return
}
// 公众号
hasExternalInfo := false
if len(modContact.GetCustomizedInfo().GetExternalInfo()) > 0 {
hasExternalInfo = true
}
if strings.HasPrefix(userName, "gh_") || hasExternalInfo {
return
}
// 好友
// currentWXAccount.AddWXFriendContact(modContact)
db.SaveOrUpdateContact(modContact, uuid)
}
// sendContactCallback 发送联系人回调
// decodeUnicodeEscapes 解码Unicode转义字符
func decodeUnicodeEscapes(s string) string {
// 处理JSON中的Unicode转义字符,如\u003c
re := regexp.MustCompile(`\\u([0-9a-fA-F]{4})`)
result := re.ReplaceAllStringFunc(s, func(match string) string {
// 提取十六进制数字部分
hexStr := match[2:] // 去掉\u前缀
// 将十六进制转换为整数
if codePoint, err := strconv.ParseInt(hexStr, 16, 32); err == nil {
// 转换为Unicode字符
return string(rune(codePoint))
}
return match // 如果转换失败,返回原字符串
})
return result
}
func sendContactCallback(wxConn wxface.IWXConnect, modContact *wechat.ModContact, uuid string) {
// 将contact转换为JSON格式
contactJSON, err := json.Marshal(modContact)
fmt.Println("contactJSON", string(contactJSON))
if err != nil {
fmt.Printf("联系人数据序列化失败: %v\n", err)
return
}
// 构建回调数据
callbackData := map[string]interface{}{
"type": "contact_sync",
"uuid": uuid,
"timestamp": time.Now().Unix(),
"contact_data": string(contactJSON),
}
// 转换为JSON
// callbackJSON, err := json.Marshal(callbackData)
if err != nil {
fmt.Printf("回调数据序列化失败: %v\n", err)
return
}
// 解码Unicode转义字符并打印联系人回调数据
// decodedJSON := decodeUnicodeEscapes(string(callbackJSON))
// fmt.Printf("联系人回调数据: %s\n", decodedJSON)
// 发送HTTP回调 - 创建临时AddMsg来复用现有回调机制
contactDataStr := callbackData["contact_data"].(string)
// 对content内容进行Unicode解码
decodedContactData := decodeUnicodeEscapes(contactDataStr)
tempAddMsg := &wechat.AddMsg{
Content: &wechat.SKBuiltinString{Str: proto.String(decodedContactData)},
MsgType: proto.Uint32(10000), // 自定义消息类型表示联系人同步
FromUserName: &wechat.SKBuiltinString{Str: proto.String(uuid)},
ToUserName: &wechat.SKBuiltinString{Str: proto.String(uuid)},
CreateTime: proto.Uint32(uint32(time.Now().Unix())),
NewMsgId: proto.Int64(time.Now().UnixNano()),
}
go db.SendMessageCallback(tempAddMsg, uuid)
// 发送到WebSocket
currentTaskMgr := wxConn.GetWXTaskMgr()
taskMgr, ok := currentTaskMgr.(*wxcore.WXTaskMgr)
if ok {
socketMsgTask := taskMgr.SocketMsgTask
if socketMsgTask.IsWebSocketEnabled() {
go socketMsgTask.AddMsgItem(tempAddMsg)
}
}
}
// 并发处理
func dealAddMsgRun(wxConn wxface.IWXConnect, addMsg *wechat.AddMsg, syncType string) {
// fmt.Println("xiaoyue命令-------dealAddMsgRun并发处理")
msgType := addMsg.GetMsgType()
msgContent := addMsg.GetContent().GetStr()
fromUserName := addMsg.GetFromUserName().GetStr()
toUserName := addMsg.GetToUserName().GetStr()
// beAtUser := addMsg.GetBeAtUser()
// 获取UUID用于消息回调
uuid := wxConn.GetWXAccount().GetUserInfo().UUID
// 添加消息回调处理
go db.SendMessageCallback(addMsg, uuid)
// wxAccount := wxConn.GetWXAccount()
// beAtUser := addMsg.GetBeAtUser()
groupWXID := ""
toGroupWXID := ""
if strings.HasSuffix(toUserName, "@chatroom") {
groupWXID = toUserName
toGroupWXID = toUserName
}
if strings.HasSuffix(fromUserName, "@chatroom") {
groupWXID = fromUserName
}
// 判断 是否是群红包 @chatroom - @chatroom
// fmt.Print("\n" + strconv.FormatUint(uint64(msgType), 10) + "\n")
// if msgType == baseinfo.MMAddMsgTypeRefer {
// // if msgType == baseinfo.MMAddMsgTypeRefer || msgType == baseinfo.MMPayInfoSceneIDHongBao2 {
// if msgType == baseinfo.MMPayInfoSceneIDHongBao2 {
// // 处理红包
// tmpMsg := new(baseinfo.RedSysMsg)
// err := xml.Unmarshal([]byte(msgContent), tmpMsg)
// if err != nil {
// return
// }
// // url 解码
// // msgContent, _ = url.QueryUnescape(tmpMsg.Paymsg.AppMsgContent)
// // msgContent = tmpMsg.Paymsg.AppMsgContent
// // fmt.Print(msgContent)
// }
// // fmt.Print(msgContent)
// if strings.HasSuffix(toUserName, "@chatroom") {
// // 红包处理
// dealGroupHB(wxConn, msgContent, toUserName)
// } else if strings.HasSuffix(fromUserName, "@chatroom") {
// // 红包处理
// dealGroupHB(wxConn, msgContent, fromUserName)
// // // 群转账给我处理
// // if toUserName == wxAccount.GetUserInfo().GetUserName() {
// // dealAutoTransfer(wxConn, msgContent, fromUserName)
// // }
// } else {
// // 判断是个人红包
// dealPersonHB(wxConn, msgContent, fromUserName)
// // // 个人转账处理
// // if toUserName == wxAccount.GetUserInfo().GetUserName() {
// // dealAutoTransfer(wxConn, msgContent, fromUserName)
// // }
// // 邀请入群处理
// // 创建一个数组,用于存储命令
// // newMsgId := strconv.FormatUint(uint64(addMsg.GetNewMsgId()), 10)
// // dealAutoJoinGroup(wxConn, msgContent, newMsgId)
// }
// }
// 判断是否是命令
// if toUserName == baseinfo.FileHelperWXID {
// // 处理命令
// // if msgType == baseinfo.MMAddMsgTypeText {
// // dealCommand(wxConn, msgContent)
// // }
// // 名片类型
// if msgType == baseinfo.MMAddMsgTypeCard {
// dealPersionalCard(wxConn, addMsg)
// }
// return
// }
// 处理自动同意好友
// if msgType == baseinfo.MMAddMsgTypeFriendAdd {
// dealAutoAddFriend(wxConn, msgContent)
// }
// 处理关键词自动回复
// if msgType == baseinfo.MMAddMsgTypeText {
// dealKeywordAutoReply(wxConn, msgContent, fromUserName)
// // 处理关键词设置管理员
// dealAdminKeyword(wxConn, msgContent, fromUserName, beAtUser)
// // 处理关键词踢人
// dealKickKeyword(wxConn, msgContent, fromUserName, beAtUser)
// // 处理设置欢迎群关键词
// dealWelcomeGroupKeyword(wxConn, msgContent, fromUserName)
// // 处理关键词邀请入群
// dealInviteKeyword(wxConn, msgContent, fromUserName)
// }
// if msgType == 10002 && strings.HasSuffix(fromUserName, "@chatroom") {
// // 检查消息内容是否包含 "加入群聊" 字样
// if !strings.Contains(msgContent, "加入了群聊") {
// return
// }
// go db.SendMessageCallback(addMsg, uuid)
// // dealWelcomeMessage(wxConn, msgContent, fromUserName)
// }
// 防消息撤回管理器
currentTaskMgr := wxConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentSnsTransTask := taskMgr.GetSnsTransTask()
currentRevokeTask := taskMgr.GetRevokeTask()
//加好友自动回复
if msgType == baseinfo.MMAddMsgTypeSystemMsg {
if (currentSnsTransTask.IsAddFriendAutoReply() && msgContent == "以上是打招呼的内容" || strings.Contains(msgContent, "现在可以开始聊天了")) && currentSnsTransTask.AddFriendAutoReplyMsg != "" {
currentUserMsgMgr := wxConn.GetWXFriendMsgMgr()
addFriendAutoMsg := currentSnsTransTask.GetAddFriendAutoMsg()
// 清理首尾空格
addFriendAutoMsg = strings.TrimSpace(addFriendAutoMsg)
// 添加好友自动回复
if addFriendAutoMsg != "" {
currentUserMsgMgr.AddNewTextMsg(currentSnsTransTask.GetAddFriendAutoMsg(), fromUserName)
}
}
return
}
if msgType == baseinfo.MMAddMsgTypeText || msgType == baseinfo.MMAddMsgTypeImage {
// 如果开启了消息防撤回
if currentRevokeTask.IsAvoidRevoke() {
// fmt.Printf("增加消息:groupWXID %s\n", groupWXID)
uuid := wxConn.GetWXAccount().GetUserInfo().UUID
currentRevokeTask.AddNewMsg(addMsg, uuid)
}
return
}
// 49 同时包括 57(引用消息,只可能是文本)
if msgType == baseinfo.MMAddMsgTypeRefer && strings.Contains(msgContent, "57") {
// 如果开启了消息防撤回
if currentRevokeTask.IsAvoidRevoke() {
// fmt.Printf("增加消息:groupWXID %s\n", groupWXID)
uuid := wxConn.GetWXAccount().GetUserInfo().UUID
currentRevokeTask.AddNewMsg(addMsg, uuid)
}
return
}
// 47 表情包 包含 msg>lastMessage
if groupWXID != "" && msgType == baseinfo.MMAddMsgTypeStatusNotify && strings.Contains(msgContent, "lastMessage") {
dealTopGroup(wxConn, groupWXID)
}
}
// 判断是否过期
// 判断禁用
func dealAuth(wxConn wxface.IWXConnect) {
wxAccount := wxConn.GetWXAccount()
// 防消息撤回管理器
currentTaskMgr := wxConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentSnsTransTask := taskMgr.GetSnsTransTask()
uuid := wxAccount.GetUserInfo().UUID
// 判断是否过期
// 判断过期
if !currentSnsTransTask.IsValidKey(uuid) {
currentReqInvoker := wxConn.GetWXReqInvoker()
currentWXFileHelperMgr := wxConn.GetWXFileHelperMgr()
currentWXFileHelperMgr.AddNewTipMsg("该key已过期,请重新申请")
// 3 秒后退出
time.Sleep(time.Second * 3)
currentReqInvoker.SendLogoutRequest()
}
// 判断禁用
if currentSnsTransTask.IsDisable(uuid) {
currentReqInvoker := wxConn.GetWXReqInvoker()
currentWXFileHelperMgr := wxConn.GetWXFileHelperMgr()
currentWXFileHelperMgr.AddNewTipMsg("该key已被禁用,请联系管理员")
// 3 秒后退出
time.Sleep(time.Second * 3)
currentReqInvoker.SendLogoutRequest()
}
}
// 处理置顶群
func dealTopGroup(wxConn wxface.IWXConnect, groupWXID string) {
if groupWXID == "" {
return
}
currentTaskMgr := wxConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
// 这里要判断 该群是否有消息置顶
if groupWXID != "" {
currentGrapHBMgr := taskMgr.GetGrabHBTask()
currentReqInvoker := wxConn.GetWXReqInvoker()
resp, err := currentReqInvoker.SendGetContactRequestForHB(groupWXID)
if err != nil || resp.GetBaseResponse().GetRet() != 0 {
return
}
// 判断不等于 null
if resp.GetContactList() != nil && len(resp.GetContactList()) > 0 {
contactInfo := resp.GetContactList()[0]
tmpBitVal := contactInfo.GetBitVal()
nickName := contactInfo.GetNickName()
if tmpBitVal&baseinfo.MMBitValChatOnTop != 0 {
currentGrapHBMgr.RecordTopGroup(groupWXID, nickName.GetStr())
} else {
currentGrapHBMgr.DelTopGroup(groupWXID)
}
}
}
}
// dealCommand 处理收到的命令
func dealCommand(wxConn wxface.IWXConnect, cmdText string) {
currentReqInvoker := wxConn.GetWXReqInvoker()
currentWXCache := wxConn.GetWXCache()
currentTaskMgr := wxConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentGrapHBTask := taskMgr.GetGrabHBTask()
currentFriendTask := taskMgr.GetFriendTask()
currentRevokeTask := taskMgr.GetRevokeTask()
currentSnsTask := taskMgr.GetSnsTask()
currentVerifyTask := taskMgr.GetVerifyTask()
currentWXFileHelperMgr := wxConn.GetWXFileHelperMgr()
currentSnsTransTask := taskMgr.GetSnsTransTask()
currentGrapHBMgr := taskMgr.GetGrabHBTask()
wxAccount := wxConn.GetWXAccount()
uuid := wxAccount.GetUserInfo().UUID
// 新的命令映射
switch cmdText {
case "101": // 原A401 朋友圈自动点赞
isAutoThumbUP := currentSnsTask.IsAutoThumbUP()
if isAutoThumbUP {
currentSnsTask.SetAutoThumbUP(false)
currentWXFileHelperMgr.AddNewTipMsg("朋友圈自动点赞【关闭】")
db.UpdateCommand(uuid, "A401", 0, "")
} else {
currentSnsTask.SetAutoThumbUP(true)
currentWXFileHelperMgr.AddNewTipMsg("朋友圈自动点赞【开启】")
currentReqInvoker.SendSnsTimeLineRequest("", 0)
db.UpdateCommand(uuid, "A401", 1, "")
}
return
case "102": // 原B001 朋友圈自动评论
isAutoComment := currentSnsTask.IsAutoComment()
if isAutoComment {
currentSnsTask.SetAutoComment(false)
currentWXFileHelperMgr.AddNewTipMsg("朋友圈自动评论【关闭】")
db.UpdateCommand(uuid, "B001", 0, "")
} else {
currentSnsTask.SetAutoComment(true)
currentWXFileHelperMgr.AddNewTipMsg("朋友圈自动评论【开启】")
currentReqInvoker.SendSnsTimeLineRequest("", 0)
db.UpdateCommand(uuid, "B001", 1, "")
}
return
case "103": // 原A811 自动入群邀请
needVerify := currentVerifyTask.IsAutoJoinGroup()
if needVerify {
currentVerifyTask.SetAutoJoinGroup(false)
currentWXFileHelperMgr.AddNewTipMsg("自动入群邀请【关闭】")
db.UpdateCommand(uuid, "A811", 0, "")
} else {
currentVerifyTask.SetAutoJoinGroup(true)
currentWXFileHelperMgr.AddNewTipMsg("自动入群邀请【开启】")
db.UpdateCommand(uuid, "A811", 1, "")
}
return
case "104": // 原A801 通过好友验证
needVerify := currentVerifyTask.IsNeedVerify()
if needVerify {
currentVerifyTask.SetNeedVerify(false)
currentWXFileHelperMgr.AddNewTipMsg("通过好友验证【关闭】")
db.UpdateCommand(uuid, "A801", 0, "")
} else {
currentVerifyTask.SetNeedVerify(true)
currentWXFileHelperMgr.AddNewTipMsg("通过好友验证【开启】")
db.UpdateCommand(uuid, "A801", 1, "")
}
return
case "105": // 原A601 消息防止撤回
isAvoidRevoke := currentRevokeTask.IsAvoidRevoke()
if isAvoidRevoke {
currentRevokeTask.SetAvoidRevoke(false)
currentWXFileHelperMgr.AddNewTipMsg("消息防止撤回【关闭】")
db.UpdateCommand(uuid, "A601", 0, "")
} else {
currentRevokeTask.SetAvoidRevoke(true)
currentWXFileHelperMgr.AddNewTipMsg("消息防止撤回【开启】")
db.UpdateCommand(uuid, "A601", 1, "")
}
return
case "106": // 原A101 自动领取红包
bAutoGrap := currentGrapHBTask.IsAutoGrap()
if bAutoGrap {
currentGrapHBTask.SetAutoGrap(false)
currentWXFileHelperMgr.AddNewTipMsg("自动领取红包【关闭】")
db.UpdateCommand(uuid, "A101", 0, "")
} else {
currentGrapHBTask.SetAutoGrap(true)
currentWXFileHelperMgr.AddNewTipMsg("自动领取红包【开启】")
db.UpdateCommand(uuid, "A101", 1, "")
}
return
case "107": // 原A103 延迟领取红包
bGetDelayOpen := currentGrapHBTask.GetDelayOpen()
currentWXFileHelperMgr.AddNewTipMsg(fmt.Sprintf("延迟抢红包时间为:%d 秒", bGetDelayOpen))
return
case "108": // 原A104 领取红包后感谢
bAutoGrap := currentGrapHBTask.IsAutoReply()
if bAutoGrap {
currentGrapHBTask.SetAutoReply(false)
currentWXFileHelperMgr.AddNewTipMsg("领取红包后感谢【关闭】")
db.UpdateCommand(uuid, "A104", 0, "")
} else {
currentGrapHBTask.SetAutoReply(true)
currentWXFileHelperMgr.AddNewTipMsg("领取红包后感谢【开启】")
db.UpdateCommand(uuid, "A104", 1, "")
}
return
case "109": // 原A105 领取个人红包
bAutoGrap := currentGrapHBTask.IsAutoPerson()
if bAutoGrap {
currentGrapHBTask.SetAutoPerson(false)
currentWXFileHelperMgr.AddNewTipMsg("领取个人红包【关闭】")
db.UpdateCommand(uuid, "A105", 0, "")
} else {
currentGrapHBTask.SetAutoPerson(true)
currentWXFileHelperMgr.AddNewTipMsg("领取个人红包【开启】")
db.UpdateCommand(uuid, "A105", 1, "")
}
return
case "110": // 原A111 置顶群组红包
bAutoGrap := currentGrapHBTask.IsNotTopGroup()
if bAutoGrap {
currentGrapHBTask.SetNotTopGroup(false)
currentWXFileHelperMgr.AddNewTipMsg("置顶群组红包【不抢】")
db.UpdateCommand(uuid, "A111", 0, "")
} else {
currentGrapHBTask.SetNotTopGroup(true)
currentWXFileHelperMgr.AddNewTipMsg("置顶群组红包【仅抢】")
db.UpdateCommand(uuid, "A111", 1, "")
}
return
case "111": // 原A106 自动接收转账
bAutoGrap := currentGrapHBTask.IsAutoTransfer()
if bAutoGrap {
currentGrapHBTask.SetAutoTransfer(false)
currentWXFileHelperMgr.AddNewTipMsg("自动接收转账【关闭】")
db.UpdateCommand(uuid, "A106", 0, "")
} else {
currentGrapHBTask.SetAutoTransfer(true)
currentWXFileHelperMgr.AddNewTipMsg("自动接收转账【开启】")
db.UpdateCommand(uuid, "A106", 1, "")
}
return
case "112": // 原A107 红包统计功能
bAutoGrap := currentGrapHBTask.IsHBStat()
if bAutoGrap {
currentGrapHBTask.SetHBStat(false)
currentWXFileHelperMgr.AddNewTipMsg("红包统计功能【关闭】")
db.UpdateCommand(uuid, "A107", 0, "")
} else {
currentGrapHBTask.SetHBStat(true)
currentWXFileHelperMgr.AddNewTipMsg("红包统计功能【开启】")
db.UpdateCommand(uuid, "A107", 1, "")
}
return
case "113": // 原A108 红包统计清零
financialStats := &wxcore.FinancialStats{}
db.SETExpirationObj(wxConn.GetWXAccount().GetUserInfo().WxId+"_Amount_0", financialStats, -1)
db.SETExpirationObj(wxConn.GetWXAccount().GetUserInfo().WxId+"_Amount_1", financialStats, -1)
currentWXFileHelperMgr.AddNewTipMsg("操作成功,红包统计已重置")
return
case "114": // 原A109 收款统计功能
bAutoGrap := currentGrapHBTask.IsTransStat()
if bAutoGrap {
currentGrapHBTask.SetTransStat(false)
currentWXFileHelperMgr.AddNewTipMsg("收款统计功能【关闭】")
db.UpdateCommand(uuid, "A109", 0, "")
} else {
currentGrapHBTask.SetTransStat(true)
currentWXFileHelperMgr.AddNewTipMsg("收款统计功能【开启】")
db.UpdateCommand(uuid, "A109", 1, "")
}
return
case "115": // 原A110 收款统计清零
financialStats := &wxcore.FinancialStats{}
db.SETExpirationObj(wxConn.GetWXAccount().GetUserInfo().WxId+"_ZZ_Amount_0", financialStats, -1)
db.SETExpirationObj(wxConn.GetWXAccount().GetUserInfo().WxId+"_ZZ_Amount_1", financialStats, -1)
currentWXFileHelperMgr.AddNewTipMsg("操作成功,转账统计已重置")
return
case "116": // 原200 查询置顶的群聊
groupList := currentGrapHBMgr.GetTopGroup()
if len(groupList) > 0 {
currentWXFileHelperMgr.AddNewTipMsg("置顶的群聊:\n" + groupList)
} else {
currentWXFileHelperMgr.AddNewTipMsg("没有置顶的群聊")
}
return
case "117": // 原A403 朋友圈收藏转发
isSyncTrans := currentSnsTransTask.IsAutoRelay()
if isSyncTrans {
currentSnsTransTask.SetAutoRelay(false)
currentWXFileHelperMgr.AddNewTipMsg("朋友圈收藏转发【关闭】")
db.UpdateCommand(uuid, "A403", 0, "")
} else {
currentSnsTransTask.SetAutoRelay(true)
currentWXFileHelperMgr.AddNewTipMsg("朋友圈收藏转发【开启】")
db.UpdateCommand(uuid, "A403", 1, "")
}
return
case "118": // 原A402 朋友圈跟随转发
isSyncTrans := currentSnsTransTask.IsSyncTrans()
if isSyncTrans {
currentSnsTransTask.SetSyncTrans(false)
currentWXFileHelperMgr.AddNewTipMsg("朋友圈跟随转发【关闭】,并清空了同步转发好友列表")
db.UpdateCommand(uuid, "A402", 0, "")
} else {
currentSnsTransTask.SetSyncTrans(true)
currentWXFileHelperMgr.AddNewTipMsg("朋友圈跟随转发【开启】,把名片分享到「文件传输助手」绑定/解绑用户")
db.UpdateCommand(uuid, "A402", 1, "")
}
return
case "119": // 原901 检测僵死粉
currentFriendTask.StartFriendTask(1)
return
case "120": // 原902 清理僵死粉
currentFriendTask.StartFriendTask(2)
return
case "000": // 原000 帮助和功能状态
currentWXCache.SendUsageByText()
return
case "666": // 原100 查询卡密有效期
tipText := "欢迎使用金云豹"
// 获取卡密过期时间
expiryTime := currentSnsTransTask.GetExpiryDate()
// 本次登录时间
loginTime := wxAccount.GetUserInfo().LastLoginTime.Format("2006-01-02 15:04")
// 本次登录连续在线时间(距离上次手动登录)
onlineTime, _ := wxAccount.GetUserInfo().GetOnlineTime()
// 总计在线时间
totalOnline, _ := wxAccount.GetUserInfo().GetDeviceCreateTime()
tipText = tipText + "\n【您的卡密】:" + uuid
tipText = tipText + "\n【到期时间】:" + expiryTime
tipText = tipText + "\n【登录时间】:" + loginTime
tipText = tipText + "\n【本次在线】:" + onlineTime
tipText = tipText + "\n【总计在线】:" + totalOnline
currentWXFileHelperMgr.AddNewTipMsg(tipText)
return
}
// 处理带#号的命令
if strings.Contains(cmdText, "#") {
parts := strings.Split(cmdText, "#")
if len(parts) != 2 {
return
}
cmd := parts[0]
content := parts[1]
switch cmd {
case "102": // 原001# 朋友圈评论内容
if len(content) > 255 {
currentWXFileHelperMgr.AddNewTipMsg("评论长度不能超过255")
return
}
content = strings.Replace(content, ",", ",", -1)
currentSnsTask.SetCommentContent(content)
currentWXFileHelperMgr.AddNewTipMsg("朋友圈自动评论内容:" + content)
db.UpdateCommand(uuid, "B001Str", 0, content)
return
case "104": // 原301# 通过好友验证后回复内容
if len(content) > 255 {
currentWXFileHelperMgr.AddNewTipMsg("内容长度不能超过255")
return
}
currentSnsTransTask.SetAddFriendAutoMsg(content)
currentWXFileHelperMgr.AddNewTipMsg("通过好友后回复内容:" + content)
db.UpdateCommand(uuid, "A301Str", 0, content)
return
case "107": // 原103# 延迟领取红包时间
num, err := strconv.Atoi(content)
if err == nil {
currentGrapHBTask.SetDelayOpen(num)
currentWXFileHelperMgr.AddNewTipMsg("延迟抢红包时间为:" + strconv.Itoa(num) + " 秒")
db.UpdateCommand(uuid, "A103", num, "")
}
return
case "108": // 原104# 领取红包后感谢内容
if len(content) > 255 {
currentWXFileHelperMgr.AddNewTipMsg("内容长度不能超过255")
return
}
content = strings.Replace(content, ",", ",", -1)
currentGrapHBTask.SetAutoReplyContent(content)
currentWXFileHelperMgr.AddNewTipMsg("领取红包后回复内容:" + content)
db.UpdateCommand(uuid, "A104Str", 1, content)
return
case "111": // 原116# 接收转账后回复内容
if len(content) > 255 {
currentWXFileHelperMgr.AddNewTipMsg("内容长度不能超过255")
return
}
currentGrapHBTask.SetAutoTransferReplyContent(content)
currentWXFileHelperMgr.AddNewTipMsg("接收转账后回复内容:" + content)
db.UpdateCommand(uuid, "A116Str", 1, content)
return
}
}
}
// isTextContainsChineseOrLetter 检查字符串是否包含汉字或字母
func isTextContainsChineseOrLetter(text string) bool {
// 定义一个正则表达式, 寻找汉字或字母字符
// 汉字范围:\p{Han}
// 字母范围:A-Za-z
re := regexp.MustCompile(`[A-Za-z\p{Han}]`)
return re.MatchString(text)
}
// 处理自动入群邀请
func dealAutoJoinGroup(wxConn wxface.IWXConnect, content string, newMsgId string) {
currentTaskMgr := wxConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentVerifyTask := taskMgr.GetVerifyTask()
if !currentVerifyTask.IsAutoJoinGroup() {
return
}
// 解析引用的消息
tmpMsg := new(baseinfo.JoinGroupMsg)
err := xml.Unmarshal([]byte(content), tmpMsg)
if err != nil {
return
}
// 判断是否是入群邀请
if tmpMsg.JoinGroupInfo.Type != baseinfo.MMAppMsgTypeGroupInvite {
return
}
// 判断 url 是否包含 chatroombyinvite
if !strings.Contains(tmpMsg.JoinGroupInfo.Url, "chatroombyinvite") {
return
}
// 开始加入群聊
fmt.Println("开始加入群聊")
currentVerifyTask.AddJoinGroup(tmpMsg.JoinGroupInfo.Url)
}
// 处理名片信息
func dealPersionalCard(wxConn wxface.IWXConnect, addMsg *wechat.AddMsg) {
currentReqInvoker := wxConn.GetWXReqInvoker()
currentTaskMgr := wxConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentSnsTransTask := taskMgr.GetSnsTransTask()
currentWXFileHelperMgr := wxConn.GetWXFileHelperMgr()
// 先反序列化CardInfo
msgContent := addMsg.GetContent().GetStr()
cardInfo := &baseinfo.CardInfo{}
err := xml.Unmarshal([]byte(msgContent), cardInfo)
if err != nil {
baseutils.PrintLog(err.Error())
return
}
// 如果是公众号-不予理会
if strings.HasPrefix(cardInfo.UserName, "gh_") {
return
}
// 获取详情
userInfo, _, _ := currentReqInvoker.SendGetContactRequestForCache(cardInfo.UserName, true)
// 公众号
if len(userInfo.GetCustomizedInfo().GetExternalInfo()) > 0 {
// 公众号
return
}
if len(userInfo.GetNickName().GetStr()) <= 0 {
// 昵称不存在
return
}
// 如果开启了自动转发功能
if currentSnsTransTask.IsSyncTrans() {
// 如果不存在则增加,然后初始化
if currentSnsTransTask.AddSyncTransFriend(cardInfo.UserName) {
currentReqInvoker.SendSnsUserPageRequest(cardInfo.UserName, "", 0, false)
showText := "成功绑定名片【" + cardInfo.NickName + "】\n"
showText = showText + "当前绑定" + strconv.Itoa(currentSnsTransTask.GetTransFriendCount()) + "个"
currentWXFileHelperMgr.AddNewTipMsg(showText)
} else {
// 如果存在则移除
currentSnsTransTask.DelSyncTransFriend(cardInfo.UserName)
showText := "成功解绑名片【" + cardInfo.NickName + "】\n"
showText = showText + "当前绑定" + strconv.Itoa(currentSnsTransTask.GetTransFriendCount()) + "个"
currentWXFileHelperMgr.AddNewTipMsg(showText)
}
}
}
// 处理自动抢红包操作(群)
func dealGroupHB(wxConn wxface.IWXConnect, content string, groupWXID string) {
// 判断是否开启了自动抢红包功能
currentTaskMgr := wxConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentGrapHBMgr := taskMgr.GetGrabHBTask()
// if !currentGrapHBMgr.IsAutoGrap() {
// return
// }
// 解析引用的消息
tmpMsg := new(baseinfo.Msg)
err := xml.Unmarshal([]byte(content), tmpMsg)
if err != nil {
return
}
// 判断是否是红包
if tmpMsg.APPMsg.MsgType != baseinfo.MMAppMsgTypePayInfo {
return
}
// 判断是否红包类型 10002
// fmt.Println(tmpMsg.APPMsg.WCPayInfo.SceneID)
if tmpMsg.APPMsg.WCPayInfo.SceneID != baseinfo.MMPayInfoSceneIDHongBao {
if tmpMsg.APPMsg.WCPayInfo.SceneID != baseinfo.MMPayInfoSceneIDHongBao1 {
return
}
}
recvAtMs := time.Now().UnixMilli()
// //是否置顶的群
// isTopGroup := currentGrapHBMgr.IsTopGroup(groupWXID)
// //(false 不抢置顶群, true 只抢置顶群)判断没有置顶 return
// if currentGrapHBMgr.IsNotTopGroup() && !isTopGroup {
// return
// }
// //(false 不抢置顶群) 判断已置顶 return
// if !currentGrapHBMgr.IsNotTopGroup() && isTopGroup {
// return
// }
//延迟抢红包
// delaytime := currentGrapHBMgr.GetDelayOpen()
// if int(delaytime) >= 1 {
// time.Sleep(time.Duration(delaytime) * time.Second)
// }
// 过滤汉字/字母红包
// if currentGrapHBMgr.IsFilterText() {
// text := tmpMsg.APPMsg.WCPayInfo.ReceiverTitle
// // 判断是否包含汉字或字母
// if isTextContainsChineseOrLetter(text) {
// return
// }
// }
// 过滤测挂红包
// if currentGrapHBMgr.IsFilterCheats() {
// filterCheatsKey := currentGrapHBMgr.GetFilterCheatsKey()
// // fmt.Println(filterCheatsKey)
// // 字符串转 数组
// temKeywords := strings.Split(filterCheatsKey, ",")
// // 关键字
// keywords := make([]string, 0)
// // 去掉头尾空格
// for i := 0; i < len(temKeywords); i++ {
// keywordItem := strings.TrimSpace(temKeywords[i])
// if keywordItem != "" {
// keywords = append(keywords, keywordItem)
// }
// }
// // fmt.Println(keywords)
// // 判断关键字是否为空
// if len(keywords) > 0 {
// text := tmpMsg.APPMsg.WCPayInfo.ReceiverTitle
// for _, keyword := range keywords {
// if strings.Contains(text, keyword) {
// return
// }
// }
// }
// }
// 开始抢红包
hbItem := new(baseinfo.HongBaoItem)
hbItem.IsGroup = 1
hbItem.SceneID = tmpMsg.APPMsg.WCPayInfo.SceneID
hbItem.NativeURL = tmpMsg.APPMsg.WCPayInfo.NativeURL
hbItem.RecvAtMs = recvAtMs
hongBaoURLItem, err := clientsdk.ParseHongBaoURL(hbItem.NativeURL, groupWXID)
if err != nil {
return
}
fmt.Print("\n开始抢红包\n")
hbItem.URLItem = hongBaoURLItem
hbItem.FromUserName = tmpMsg.FromUserName
currentGrapHBMgr.AddHBItem(hbItem)
}
// 处理自动抢红包操作(私发)
func dealPersonHB(wxConn wxface.IWXConnect, content string, groupWXID string) {
// 判断是否开启了自动抢红包功能
currentTaskMgr := wxConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentGrapHBMgr := taskMgr.GetGrabHBTask()
// 判断是否开启接收个人红包
if !currentGrapHBMgr.IsAutoPerson() {
return
}
// 解析引用的消息
tmpMsg := new(baseinfo.Msg)
err := xml.Unmarshal([]byte(content), tmpMsg)
if err != nil {
return
}
// 判断是否是红包
if tmpMsg.APPMsg.MsgType != baseinfo.MMAppMsgTypePayInfo {
return
}
// 判断是否红包类型
if tmpMsg.APPMsg.WCPayInfo.SceneID != baseinfo.MMPayInfoSceneIDHongBao {
return
}
recvAtMs := time.Now().UnixMilli()
//延迟抢红包
delaytime := currentGrapHBMgr.GetDelayOpen()
if int(delaytime) >= 1 {
time.Sleep(time.Duration(delaytime) * time.Second)
}
// 开始抢红包
hbItem := new(baseinfo.HongBaoItem)
hbItem.IsGroup = 0
hbItem.NativeURL = tmpMsg.APPMsg.WCPayInfo.NativeURL
hbItem.RecvAtMs = recvAtMs
hongBaoURLItem, err := clientsdk.ParseHongBaoURL(hbItem.NativeURL, groupWXID)
if err != nil {
return
}
hbItem.URLItem = hongBaoURLItem
// fmt.Print("\n开始抢个人红包\n")
currentGrapHBMgr.AddHBItem(hbItem)
}
// 处理自动接收转账操作
func dealAutoTransfer(wxConn wxface.IWXConnect, content string, fromUserName string) {
// 判断是否开启了自动接收转账功能
currentTaskMgr := wxConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentGrapHBMgr := taskMgr.GetGrabHBTask()
if !currentGrapHBMgr.IsAutoTransfer() {
return
}
// 解析引用的消息
tmpMsg := new(baseinfo.Msg2)
err := xml.Unmarshal([]byte(content), tmpMsg)
if err != nil {
return
}
// 判断是否转账
if tmpMsg.APPMsg.MsgType != baseinfo.MMAppMsgTypeTransfer {
return
}
wcPayInfo := tmpMsg.APPMsg.WCPayInfo
tenpayUrl := "invalid_time=" + wcPayInfo.InvalidTime + "&op=confirm&total_fee=0&trans_id=" + wcPayInfo.TransFerId + "&transaction_id=" + wcPayInfo.TransactionId + "&username=" + wcPayInfo.ToUserName
wcPaySign, err := clientsdk.TenPaySignDes3(tenpayUrl, "%^&*Tenpay!@#$")
if err != nil {
return
}
// 判断群聊
if strings.HasSuffix(fromUserName, "@chatroom") {
wcPayInfo.FromGroupId = fromUserName
} else {
wcPayInfo.FromGroupId = ""
wcPayInfo.FromUserName = fromUserName
}
tenpayUrl += "&WCPaySign=" + wcPaySign
tmpReqItem := &baseinfo.TenPayReqItem{}
tmpReqItem.CgiCMD = 85
tmpReqItem.ReqText = tenpayUrl
currentGrapHBMgr.DirectTransfer(tmpReqItem, &wcPayInfo)
}
// 处理自动通过好友添加
func dealAutoAddFriend(wxConn wxface.IWXConnect, content string) {
// 判断是否开启了自动接收转账功能
currentTaskMgr := wxConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*wxcore.WXTaskMgr)
currentVerifyTask := taskMgr.GetVerifyTask()
notNeedVerify := currentVerifyTask.IsNeedVerify()
if !notNeedVerify {
return
}
// 解析引用的消息
tmpMsg := new(baseinfo.AddFriendMsg)
err := xml.Unmarshal([]byte(content), tmpMsg)
if err != nil {
return
}
if !strings.HasPrefix(tmpMsg.EncryptUsername, "v3_") || !strings.HasPrefix(tmpMsg.Ticket, "v4_") {
return
}
// bytes, _ := json.Marshal(tmpMsg)
// fmt.Println("FrindAddMsg:", string(bytes))
// 延时3秒
time.Sleep(3 * time.Second)
// 自动通过好友请求
_, _ = wxConn.GetWXReqInvoker().VerifyUserRequest(3, "", tmpMsg.Scene, tmpMsg.EncryptUsername, tmpMsg.Ticket, "")
}
// dealKeywordAutoReply 处理关键词自动回复
func dealKeywordAutoReply(wxConn wxface.IWXConnect, content string, fromUserName string) {
// 获取当前账号UUID
uuid := wxConn.GetWXAccount().GetUserInfo().UUID
// 查询关键词自动回复配置
command, err := db.QueryCommand(uuid)
if err != nil {
return
}
// 检查是否启用关键词自动回复
if command.B002 != 1 || command.B002Str == "" {
return
}
// 解析关键词回复配置
var pairs []req.KeywordReplyPair
err = json.Unmarshal([]byte(command.B002Str), &pairs)
if err != nil {
return
}
// 遍历关键词进行匹配
for _, pair := range pairs {
if strings.Contains(content, pair.Keyword) {
// 发送回复消息
currentUserMsgMgr := wxConn.GetWXFriendMsgMgr()
currentUserMsgMgr.AddNewTextMsg(pair.Reply, fromUserName)
break // 只回复第一个匹配的关键词
}
}
}
// dealAdminKeyword 处理关键词设置管理员
func dealAdminKeyword(wxConn wxface.IWXConnect, content string, fromUserName string, beAtUser string) {
// fmt.Println("dealAdminKeyword")
// 只处理群消息
if !strings.HasSuffix(fromUserName, "@chatroom") {
return
}
// 获取当前账号UUID
uuid := wxConn.GetWXAccount().GetUserInfo().UUID
// 查询管理员关键词配置
command, err := db.QueryCommand(uuid)
if err != nil {
return
}
// 检查是否启用管理员关键词功能
if command.B004 != 1 || command.B004Str == "" {
return
}
// 解析管理员关键词配置
var config req.AdminKeywordConfig
err = json.Unmarshal([]byte(command.B004Str), &config)
if err != nil {
return
}
// 检查消息是否包含关键词
contentParts := strings.SplitN(content, ":", 2)
if len(contentParts) != 2 {
fmt.Println("消息格式错误")
return
}
// 获取发送者wxid
senderUsername := strings.TrimSpace(contentParts[0])
messageContent := strings.TrimSpace(contentParts[1])
if !strings.Contains(messageContent, config.Keyword) {
return
}
// 获取群信息,检查发送者是否是群主或管理员
currentReqInvoker := wxConn.GetWXReqInvoker()
resp, err := currentReqInvoker.SendGetContactRequestForHB(fromUserName)
if err != nil || resp.GetBaseResponse().GetRet() != 0 {
fmt.Println("获取群信息失败")
return
}
// 检查权限
hasPermission := false
chatRoom := resp.GetContactList()[0]
chatroomData := chatRoom.GetNewChatroomData()
if chatroomData == nil {
fmt.Println("获取群信息失败")
return
}
// 检查是否是群主或管理员
memberList := chatroomData.GetChatroomMemberList()
for _, member := range memberList {
if member.GetUserName() == senderUsername {
fmt.Println(member.GetChatroomMemberFlag())
if member.GetChatroomMemberFlag() == 1 { // 普通成员
hasPermission = false
}
if member.GetChatroomMemberFlag() == 2 { // 群主
hasPermission = true
} else if member.GetChatroomMemberFlag() == 2049 { // 管理员
hasPermission = true
}
break
}
}
if !hasPermission {
fmt.Println("用户没有权限设置管理员")
return
}
fmt.Println("targetUsername", beAtUser, "fromUserName", fromUserName)
// 设置为管理员
currentReqInvoker.SendAddChatroomAdminRequest(fromUserName, []string{beAtUser})
}
// dealWelcomeMessage 处理新人进群欢迎词
func dealWelcomeMessage(wxConn wxface.IWXConnect, content string, fromUserName string) {
fmt.Println("dealWelcomeMessage")
// 获取当前账号UUID
uuid := wxConn.GetWXAccount().GetUserInfo().UUID
// 查询欢迎词配置
command, err := db.QueryCommand(uuid)
if err != nil {
return
}
// 检查是否启用欢迎词
if command.B003 != 1 || command.B003Str == "" {
return
}
// 解析欢迎词配置
var config req.WelcomeConfig
err = json.Unmarshal([]byte(command.B003Str), &config)
if err != nil {
return
}
// 检查当前群聊是否在配置的群聊列表中
found := false
fmt.Println(fromUserName)
for _, room := range config.ChatRooms {
if room == fromUserName {
found = true
break
}
}
if !found {
return
}
// 检查消息内容是否包含 "加入群聊" 字样
if !strings.Contains(content, "加入了群聊") {
return
}
// 发送欢迎词
wxConn.GetWXReqInvoker().SendTextMsgRequest(fromUserName, config.Content, nil, 1)
}
// dealKickKeyword 处理关键词踢人
func dealKickKeyword(wxConn wxface.IWXConnect, content string, fromUserName string, beAtUser string) {
// fmt.Println("dealKickKeyword")
// 只处理群消息
if !strings.HasSuffix(fromUserName, "@chatroom") {
return
}
// 获取当前账号UUID
uuid := wxConn.GetWXAccount().GetUserInfo().UUID
// 查询踢人关键词配置
command, err := db.QueryCommand(uuid)
if err != nil {
return
}
// 检查是否启用踢人关键词功能
if command.B006 != 1 || command.B006Str == "" {
return
}
// 解析踢人关键词配置
var config req.KickKeywordConfig
err = json.Unmarshal([]byte(command.B006Str), &config)
if err != nil {
return
}
// 提取发送者信息
contentParts := strings.SplitN(content, ":", 2)
if len(contentParts) != 2 {
fmt.Println("消息格式错误")
return
}
// 获取发送者wxid
senderUsername := strings.TrimSpace(contentParts[0])
messageContent := strings.TrimSpace(contentParts[1])
// 检查消息是否包含关键词
if !strings.Contains(messageContent, config.Keyword) {
return
}
// 检查被@用户是否存在
if beAtUser == "" {
fmt.Println("没有被@的用户")
return
}
// 获取群信息,检查发送者是否是群主或管理员
currentReqInvoker := wxConn.GetWXReqInvoker()
resp, err := currentReqInvoker.SendGetContactRequestForHB(fromUserName)
if err != nil || resp.GetBaseResponse().GetRet() != 0 {
fmt.Println("获取群信息失败")
return
}
// 检查权限
hasPermission := false
chatRoom := resp.GetContactList()[0]
chatroomData := chatRoom.GetNewChatroomData()
if chatroomData == nil {
fmt.Println("获取群信息失败")
return
}
// 检查是否是群主或管理员
memberList := chatroomData.GetChatroomMemberList()
for _, member := range memberList {
if member.GetUserName() == senderUsername {
fmt.Println(member.GetChatroomMemberFlag())
if member.GetChatroomMemberFlag() == 1 { // 普通成员
hasPermission = false
}
if member.GetChatroomMemberFlag() == 2 { // 群主
hasPermission = true
} else if member.GetChatroomMemberFlag() == 2049 { // 管理员
hasPermission = true
}
break
}
}
if !hasPermission {
fmt.Println("用户没有权限踢人")
return
}
fmt.Println("踢出用户", beAtUser, "从群", fromUserName)
// 执行踢人操作
currentReqInvoker.SendDelDelChatRoomMemberRequest(fromUserName, []string{beAtUser})
}
// 处理设置欢迎群关键词
func dealWelcomeGroupKeyword(wxConn wxface.IWXConnect, content string, fromUserName string) {
// 只处理群消息
if !strings.HasSuffix(fromUserName, "@chatroom") {
return
}
// 获取当前账号UUID
uuid := wxConn.GetWXAccount().GetUserInfo().UUID
// 查询欢迎词配置
command, err := db.QueryCommand(uuid)
if err != nil {
return
}
// 检查是否启用欢迎词功能
if command.B003 != 1 || command.B003Str == "" {
return
}
// 解析欢迎词配置
var config req.WelcomeConfig
err = json.Unmarshal([]byte(command.B003Str), &config)
if err != nil {
return
}
// 提取发送者信息
contentParts := strings.SplitN(content, ":", 2)
if len(contentParts) != 2 {
return
}
// 获取发送者wxid和消息内容
senderUsername := strings.TrimSpace(contentParts[0])
messageContent := strings.TrimSpace(contentParts[1])
// 检查是否包含设置欢迎群的关键词
if config.GroupKeyword == "" || !strings.Contains(messageContent, config.GroupKeyword) {
return
}
// 检查发送者是否有权限(群主或管理员)
currentReqInvoker := wxConn.GetWXReqInvoker()
resp, err := currentReqInvoker.SendGetContactRequestForHB(fromUserName)
if err != nil || resp.GetBaseResponse().GetRet() != 0 {
fmt.Println("获取群信息失败")
return
}
// 检查权限
hasPermission := false
chatRoom := resp.GetContactList()[0]
chatroomData := chatRoom.GetNewChatroomData()
if chatroomData == nil {
fmt.Println("获取群信息失败")
return
}
// 检查是否是群主或管理员
memberList := chatroomData.GetChatroomMemberList()
for _, member := range memberList {
if member.GetUserName() == senderUsername {
if member.GetChatroomMemberFlag() == 2 { // 群主
hasPermission = true
} else if member.GetChatroomMemberFlag() == 2049 { // 管理员
hasPermission = true
}
break
}
}
if !hasPermission {
fmt.Println("用户没有权限设置欢迎群")
return
}
// 检查当前群是否已在列表中
for _, room := range config.ChatRooms {
if room == fromUserName {
// 群已经在列表中,无需添加
currentReqInvoker.SendTextMsgRequest(fromUserName, "该群已设置为欢迎群", nil, 1)
return
}
}
// 将当前群添加到欢迎群列表
config.ChatRooms = append(config.ChatRooms, fromUserName)
// 将配置转换为JSON并更新
configJSON, err := json.Marshal(config)
if err != nil {
fmt.Println("序列化欢迎词配置失败")
return
}
_, err = db.UpdateCommand(uuid, "B003Str", 0, string(configJSON))
if err != nil {
fmt.Println("更新欢迎词配置失败")
return
}
// 发送设置成功消息
currentReqInvoker.SendTextMsgRequest(fromUserName, "已将该群设置为欢迎群", nil, 1)
}
// dealInviteKeyword 处理关键词邀请入群
func dealInviteKeyword(wxConn wxface.IWXConnect, content string, fromUserName string) {
// 获取当前账号UUID
uuid := wxConn.GetWXAccount().GetUserInfo().UUID
// 查询邀请入群关键词配置
command, err := db.QueryCommand(uuid)
if err != nil {
return
}
// 检查是否启用邀请入群关键词功能
if command.B005 != 1 || command.B005Str == "" {
return
}
// 解析邀请入群关键词配置
var config req.InviteKeywordConfig
err = json.Unmarshal([]byte(command.B005Str), &config)
if err != nil {
return
}
// 检查功能是否启用
if !config.Enable {
return
}
// 处理群聊消息 - 设置关键词
if strings.HasSuffix(fromUserName, "@chatroom") {
// 处理设置关键词的逻辑
// 提取发送者信息
contentParts := strings.SplitN(content, ":", 2)
if len(contentParts) != 2 {
return
}
// 获取发送者wxid和消息内容
senderUsername := strings.TrimSpace(contentParts[0])
messageContent := strings.TrimSpace(contentParts[1])
// 检查消息是否包含设置关键词的关键词
if config.SetupKeyword == "" || !strings.Contains(messageContent, config.SetupKeyword) {
return
}
// 尝试提取设置的关键词和群ID
parts := strings.Split(messageContent, "+")
if len(parts) != 2 {
return
}
inviteKeyword := strings.TrimSpace(parts[1])
// 检查关键词是否为空
if len(inviteKeyword) == 0 {
return
}
// 检查发送者是否有权限(群主或管理员)
currentReqInvoker := wxConn.GetWXReqInvoker()
resp, err := currentReqInvoker.SendGetContactRequestForHB(fromUserName)
if err != nil || resp.GetBaseResponse().GetRet() != 0 {
fmt.Println("获取群信息失败")
return
}
// 检查权限
hasPermission := false
chatRoom := resp.GetContactList()[0]
chatroomData := chatRoom.GetNewChatroomData()
if chatroomData == nil {
fmt.Println("获取群信息失败")
return
}
// 检查是否是群主或管理员
memberList := chatroomData.GetChatroomMemberList()
for _, member := range memberList {
if member.GetUserName() == senderUsername {
if member.GetChatroomMemberFlag() == 2 { // 群主
hasPermission = true
} else if member.GetChatroomMemberFlag() == 2049 { // 管理员
hasPermission = true
}
break
}
}
if !hasPermission {
fmt.Println("用户没有权限设置邀请关键词")
return
}
// 检查关键词是否已存在
for i, pair := range config.Pairs {
if pair.Keyword == inviteKeyword {
// 更新现有的关键词
config.Pairs[i].ChatRoom = fromUserName
fmt.Println("更新关键词:", inviteKeyword, "对应群:", fromUserName)
// 更新配置
configJSON, err := json.Marshal(config)
if err != nil {
fmt.Println("序列化邀请关键词配置失败")
return
}
_, err = db.UpdateCommand(uuid, "B005Str", 0, string(configJSON))
if err != nil {
fmt.Println("更新邀请关键词配置失败")
return
}
// 发送设置成功消息
currentReqInvoker.SendTextMsgRequest(fromUserName, "已设置关键词: "+inviteKeyword+" 对应本群", nil, 1)
return
}
}
// 添加新的关键词和群ID对应关系
newPair := req.InviteKeywordPair{
Keyword: inviteKeyword,
ChatRoom: fromUserName,
}
config.Pairs = append(config.Pairs, newPair)
fmt.Println("添加关键词:", inviteKeyword, "对应群:", fromUserName)
// 更新配置
configJSON, err := json.Marshal(config)
if err != nil {
fmt.Println("序列化邀请关键词配置失败")
return
}
_, err = db.UpdateCommand(uuid, "B005Str", 0, string(configJSON))
if err != nil {
fmt.Println("更新邀请关键词配置失败")
return
}
// 发送设置成功消息
currentReqInvoker.SendTextMsgRequest(fromUserName, "已设置关键词: "+inviteKeyword+" 对应本群", nil, 1)
return
} else if strings.HasPrefix(fromUserName, "wxid_") || strings.HasPrefix(fromUserName, "gh_") {
// 处理私聊消息 - 邀请入群
// 检查消息是否匹配某个关键词
for _, pair := range config.Pairs {
if pair.Keyword != "" && content == pair.Keyword {
// 判断是否有效的群ID
if strings.HasSuffix(pair.ChatRoom, "@chatroom") {
fmt.Println("邀请用户", fromUserName, "进入群聊", pair.ChatRoom)
// 使用邀请API将用户拉入群聊
currentReqInvoker := wxConn.GetWXReqInvoker()
currentReqInvoker.SendAddChatRoomMemberRequest(pair.ChatRoom, []string{fromUserName})
// 发送邀请成功消息
currentReqInvoker.SendTextMsgRequest(fromUserName, "已邀请您进入群聊", nil, 1)
break
}
}
}
}
}