From de3c7bcd2c31eba0ef7ffe4e9351f633c28fcc8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=BB=E6=AC=A2?= Date: Thu, 24 Apr 2025 16:07:34 +0800 Subject: [PATCH] =?UTF-8?q?:refactor:=20=E9=87=8D=E6=9E=84=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=AA=92=E4=BD=93=E6=B6=88=E6=81=AF=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98=E5=8C=96=E8=81=94=E7=B3=BB?= =?UTF-8?q?=E4=BA=BA=E8=AF=A6=E6=83=85=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 +- go.sum | 2 ++ internal/tasks/contract.go | 23 ++++++++++---- internal/tasks/message.go | 57 ++++++--------------------------- pkg/message/handler.go | 19 +++++++++++ pkg/message/media.go | 64 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 112 insertions(+), 55 deletions(-) create mode 100644 pkg/message/handler.go create mode 100644 pkg/message/media.go diff --git a/go.mod b/go.mod index ef3617c..ed601ec 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module gitee.ltd/lxh/wechat-robot go 1.24.0 require ( - gitee.ltd/lxh/xybot v0.0.4 + gitee.ltd/lxh/xybot v0.0.5 github.com/docker/docker v28.1.1+incompatible github.com/docker/go-connections v0.5.0 github.com/go-co-op/gocron/v2 v2.16.1 diff --git a/go.sum b/go.sum index eb93c2b..156c604 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ gitee.ltd/lxh/xybot v0.0.3 h1:/xRCnW2nMtx/hdV7TdpEcL3Sh8f9oBGHToONk0yGstA= gitee.ltd/lxh/xybot v0.0.3/go.mod h1:jYfEAQ3WPsST/PY4fEEVFjU6KtMocxn3sQi78I+vdxc= gitee.ltd/lxh/xybot v0.0.4 h1:sEs6ZOZud2oDWvW1MVpwHWJUq3AyxYA1G/SGP4En+/0= gitee.ltd/lxh/xybot v0.0.4/go.mod h1:jYfEAQ3WPsST/PY4fEEVFjU6KtMocxn3sQi78I+vdxc= +gitee.ltd/lxh/xybot v0.0.5 h1:kgwJktO/p7WbywUuAGTPH2V4VOta6dnYs1CXz6qVvZU= +gitee.ltd/lxh/xybot v0.0.5/go.mod h1:jYfEAQ3WPsST/PY4fEEVFjU6KtMocxn3sQi78I+vdxc= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= diff --git a/internal/tasks/contract.go b/internal/tasks/contract.go index 3eb2337..4bd5054 100644 --- a/internal/tasks/contract.go +++ b/internal/tasks/contract.go @@ -3,7 +3,9 @@ package tasks import ( "gitee.ltd/lxh/wechat-robot/internal/model" "gitee.ltd/lxh/xybot" + "gitee.ltd/lxh/xybot/friend" "github.com/gofiber/fiber/v2/log" + "slices" "strings" ) @@ -26,13 +28,22 @@ func syncContact(containerHost, robotWxId string, robotId uint) { return } - // 获取昵称等详细信息 - contacts, err := robotCli.Friend.GetContractDetail(ids) - if err != nil { - // 处理错误 - log.Errorf("[%s]获取联系人详情失败: %v", robotWxId, err) - return + // 将ids拆分成二十个一个的数组之后再获取详情 + var contacts = make([]friend.ContactListItem, 0) + chunker := slices.Chunk(ids, 20) + processChunk := func(chunk []string) bool { + // 获取昵称等详细信息 + var c = make([]friend.ContactListItem, 0) + c, err = robotCli.Friend.GetContractDetail(chunk) + if err != nil { + // 处理错误 + log.Errorf("[%s]获取联系人详情失败: %v", robotWxId, err) + return false + } + contacts = append(contacts, c...) + return true } + chunker(processChunk) // 循环联系人信息,打印一下 db := model.GetDB() diff --git a/internal/tasks/message.go b/internal/tasks/message.go index 98c4ab2..7e943e2 100644 --- a/internal/tasks/message.go +++ b/internal/tasks/message.go @@ -1,13 +1,10 @@ package tasks import ( - "encoding/xml" - "gitee.ltd/lxh/wechat-robot/internal/minio" "gitee.ltd/lxh/wechat-robot/internal/model" "gitee.ltd/lxh/wechat-robot/internal/types" - "gitee.ltd/lxh/wechat-robot/internal/wechat" + messageHandler "gitee.ltd/lxh/wechat-robot/pkg/message" "gitee.ltd/lxh/xybot" - "github.com/gofiber/fiber/v2/log" "strings" "time" ) @@ -43,7 +40,7 @@ func syncMessage(client *xybot.Client, robotId uint) { //log.Debugf("当前同步机器人Id: %d,消息数量: %d,客户端信息: %+v", robotId, len(messages), client) // 处理消息 - var msg []model.Message + //var msg []model.Message for _, message := range messages { //log.Debugf("当前同步机器人Id: %d,消息内容: %s", robotId, message.Content.String) var m model.Message @@ -72,50 +69,14 @@ func syncMessage(client *xybot.Client, robotId uint) { m.Content = strings.Join(strings.Split(m.Content, "\n")[1:], "\n") } - // 处理一下,如果是图片、文件、表情包等信息,直接下载下来存到OSS - if m.Type == types.MsgTypeImage || m.Type == types.MsgTypeVideo { - // 解析消息xml文件 - // 解析为结构体 - var media wechat.MediaMessage - if err = xml.Unmarshal([]byte(m.Content), &media); err != nil { - log.Errorf("%v解析消息失败: %v", m.Type, err.Error()) - continue - } + //msg = append(msg, m) + // 保存入库 + db.Save(&m) - var md5Str, bs64Str string - switch m.Type { - case types.MsgTypeImage: - fileUrl := "" - md5Str = media.Img.Md5 - if media.Img.CdnBigImgUrl != "" { - fileUrl = media.Img.CdnBigImgUrl - } else if media.Img.CdnMidImgUrl != "" { - fileUrl = media.Img.CdnMidImgUrl - } else if media.Img.CdnThumbUrl != "" { - fileUrl = media.Img.CdnThumbUrl - } else { - continue - } - if bs64Str, err = client.Tool.CdnDownloadImg(media.Img.AesKey, fileUrl); err != nil { - log.Errorf("图片文件下载失败: %s", err.Error()) - continue - } - case types.MsgTypeVideo: - if bs64Str, err = client.Tool.DownloadVideo(m.ClientMsgId); err != nil { - log.Errorf("视频文件下载失败: %s", err.Error()) - continue - } - } - - // 下载完成,保存到OSS - if m.FileUrl, err = minio.SaveBase64(bs64Str, md5Str); err != nil { - log.Errorf("文件保存到Minio失败: %s", err.Error()) - continue - } - } - - msg = append(msg, m) + // 异步处理消息 + go messageHandler.Handler(&m, client) } + // 保存入库 - db.Save(&msg) + //db.Save(&msg) } diff --git a/pkg/message/handler.go b/pkg/message/handler.go new file mode 100644 index 0000000..1612118 --- /dev/null +++ b/pkg/message/handler.go @@ -0,0 +1,19 @@ +package message + +import ( + "gitee.ltd/lxh/wechat-robot/internal/model" + "gitee.ltd/lxh/wechat-robot/internal/types" + "gitee.ltd/lxh/xybot" +) + +// Handler +// @description: 处理微信消息 +// @param msg *model.Message 数据库保存的消息记录 +// @param client *xybot.Client 机器人客户端 +func Handler(msg *model.Message, client *xybot.Client) { + // 处理一下,如果是图片、文件、表情包等信息,直接下载下来存到OSS + if msg.Type == types.MsgTypeImage || msg.Type == types.MsgTypeVideo { + handlerMedia(msg, client) + } + +} diff --git a/pkg/message/media.go b/pkg/message/media.go new file mode 100644 index 0000000..3a480d3 --- /dev/null +++ b/pkg/message/media.go @@ -0,0 +1,64 @@ +package message + +import ( + "encoding/xml" + "gitee.ltd/lxh/wechat-robot/internal/minio" + "gitee.ltd/lxh/wechat-robot/internal/model" + "gitee.ltd/lxh/wechat-robot/internal/types" + "gitee.ltd/lxh/wechat-robot/internal/wechat" + "gitee.ltd/lxh/xybot" + "github.com/gofiber/fiber/v2/log" +) + +// handlerMedia +// @description: 处理媒体消息 +// @param msg *model.Message 消息记录 +// @param client *xybot.Client 机器人客户端 +func handlerMedia(msg *model.Message, client *xybot.Client) { + var err error + + // 解析消息xml文件 + // 解析为结构体 + var media wechat.MediaMessage + if err = xml.Unmarshal([]byte(msg.Content), &media); err != nil { + log.Errorf("%v解析消息失败: %v", msg.Type, err.Error()) + return + } + + var md5Str, bs64Str string + switch msg.Type { + case types.MsgTypeImage: + fileUrl := "" + md5Str = media.Img.Md5 + if media.Img.CdnBigImgUrl != "" { + fileUrl = media.Img.CdnBigImgUrl + } else if media.Img.CdnMidImgUrl != "" { + fileUrl = media.Img.CdnMidImgUrl + } else if media.Img.CdnThumbUrl != "" { + fileUrl = media.Img.CdnThumbUrl + } else { + return + } + if bs64Str, err = client.Tool.CdnDownloadImg(media.Img.AesKey, fileUrl); err != nil { + log.Errorf("图片文件下载失败: %s", err.Error()) + return + } + case types.MsgTypeVideo: + if bs64Str, err = client.Tool.DownloadVideo(msg.ClientMsgId); err != nil { + log.Errorf("视频文件下载失败: %s", err.Error()) + return + } + } + + // 下载完成,保存到OSS + msg.FileUrl, err = minio.SaveBase64(bs64Str, md5Str) + if err != nil { + log.Errorf("文件保存到Minio失败: %s", err.Error()) + return + } + // 更新数据库 + if err = model.GetDB().Model(&msg).Where("id = ?", msg.ID).Update("file_url", msg.FileUrl).Error; err != nil { + log.Errorf("更新数据库失败: %s", err.Error()) + return + } +}