55 lines
1.5 KiB
Go
55 lines
1.5 KiB
Go
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/wechat-client/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
|
||
}
|
||
}
|