From a81b85977fe9d25b81b0ca767395ffccaa7b5ad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=BB=E6=AC=A2?= Date: Mon, 28 Apr 2025 17:13:36 +0800 Subject: [PATCH] =?UTF-8?q?:new:=20=E6=B7=BB=E5=8A=A0=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=8B=E8=BD=BD=E5=92=8C=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=AE=B0=E5=BD=95(WIP=EF=BC=8C=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E6=88=90wav=E4=B9=8B=E7=B1=BB=E7=9A=84?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E6=92=AD=E6=94=BE=E7=9A=84=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/wechat/voice.go | 26 +++++++++++++++++++ pkg/message/handler.go | 3 +++ pkg/message/vioce.go | 54 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 internal/wechat/voice.go create mode 100644 pkg/message/vioce.go diff --git a/internal/wechat/voice.go b/internal/wechat/voice.go new file mode 100644 index 0000000..d3f6563 --- /dev/null +++ b/internal/wechat/voice.go @@ -0,0 +1,26 @@ +package wechat + +import "encoding/xml" + +// VoiceMessage +// @description: 语音消息 +type VoiceMessage struct { + XMLName xml.Name `xml:"msg"` + Text string `xml:",chardata"` + VoiceMsg struct { + Text string `xml:",chardata"` + Endflag string `xml:"endflag,attr"` + Cancelflag string `xml:"cancelflag,attr"` + Forwardflag string `xml:"forwardflag,attr"` + Voiceformat string `xml:"voiceformat,attr"` + Voicelength string `xml:"voicelength,attr"` + Length string `xml:"length,attr"` + Bufid string `xml:"bufid,attr"` + Aeskey string `xml:"aeskey,attr"` + VoiceUrl string `xml:"voiceurl,attr"` + Voicemd5 string `xml:"voicemd5,attr"` + Clientmsgid string `xml:"clientmsgid,attr"` + Fromusername string `xml:"fromusername,attr"` + } `xml:"voicemsg"` + //Extcommoninfo string `xml:"extcommoninfo"` +} diff --git a/pkg/message/handler.go b/pkg/message/handler.go index 623fa69..2cf58c7 100644 --- a/pkg/message/handler.go +++ b/pkg/message/handler.go @@ -18,6 +18,9 @@ func Handler(msg *model.Message, client *xybot.Client) { case types.MsgTypeEmoticon: // 表情包消息 handlerEmoticon(msg, client) + case types.MsgTypeVoice: + // 语音消息 + handlerVoice(msg, client) } } diff --git a/pkg/message/vioce.go b/pkg/message/vioce.go new file mode 100644 index 0000000..a743dd5 --- /dev/null +++ b/pkg/message/vioce.go @@ -0,0 +1,54 @@ +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/wechat" + "gitee.ltd/lxh/xybot" + "github.com/gofiber/fiber/v2/log" + "strconv" +) + +// handlerVoice +// @description: 处理语音消息 +// @param msg +// @param client +func handlerVoice(msg *model.Message, client *xybot.Client) { + var err error + + // 解析消息xml + var voice wechat.VoiceMessage + if err = xml.Unmarshal([]byte(msg.Content), &voice); err != nil { + log.Errorf("%v解析消息失败: %v", msg.Type, err.Error()) + return + } + + // 将音频长度转换成数字类型 + length, _ := strconv.Atoi(voice.VoiceMsg.Length) + if length == 0 { + log.Debugf("音频长度为0,无法下载") + return + } + + // 取出关键数据,然后下载 + var voiceSilkStr string + if voiceSilkStr, err = client.Tool.DownloadVoice(msg.ClientMsgId, voice.VoiceMsg.VoiceUrl, length); err != nil { + log.Errorf("下载语音失败: %v", err.Error()) + return + } + + // TODO 将这个base64转换成wav + + // 保存文件到OSS,后缀为.aud,后续转换之后可以存wav之类的 + msg.FileUrl, err = minio.SaveBase64(voiceSilkStr, "", "aud") + 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 + } +}