From 9a6533bab1480a97c968941a9dd7a58e33fd8a02 Mon Sep 17 00:00:00 2001 From: f1ynng8 Date: Sun, 21 Jun 2026 16:44:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8B=E8=BD=BD=E5=88=86?= =?UTF-8?q?=E7=89=87=E8=BF=98=E6=B2=A1=E5=85=A8=E9=83=A8=E5=88=B0=E9=BD=90?= =?UTF-8?q?=EF=BC=8CGetDownloadPath=20=E5=B0=B1=E5=88=A4=E6=96=AD=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E8=A7=A3=E5=AF=86=E5=AF=BC=E8=87=B4=E7=9A=84=E8=AF=AF?= =?UTF-8?q?=E6=8A=A5Error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- onebot/protobuf_handler.go | 3 +++ onebot/utils.go | 9 ++++++++- onebot/worker.go | 11 +++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/onebot/protobuf_handler.go b/onebot/protobuf_handler.go index c5c7459..ac9420b 100644 --- a/onebot/protobuf_handler.go +++ b/onebot/protobuf_handler.go @@ -52,6 +52,9 @@ func HandleProtobufMsg(payload map[string]interface{}) ([]byte, error) { msg := &wxproto.WxRecvMsg{} err := proto.Unmarshal(rawBytes, msg) if err != nil { + if strings.Contains(err.Error(), "cannot parse invalid wire-format data") { + return nil, nil + } return nil, fmt.Errorf("protobuf unmarshal failed: %w", err) } diff --git a/onebot/utils.go b/onebot/utils.go index 8c47af9..c30b129 100644 --- a/onebot/utils.go +++ b/onebot/utils.go @@ -162,7 +162,14 @@ func SilkToMp3(silkBytes []byte) ([]byte, error) { } func GetFilePath(data []byte, key []byte) (string, error) { - block, _ := aes.NewCipher(key) + block, err := aes.NewCipher(key) + if err != nil { + return "", err + } + if len(data) == 0 || len(data)%block.BlockSize() != 0 { + return "", fmt.Errorf("invalid encrypted data length: %d, block_size: %d", len(data), block.BlockSize()) + } + decrypted := make([]byte, len(data)) bs := block.BlockSize() for i := 0; i < len(data); i += bs { diff --git a/onebot/worker.go b/onebot/worker.go index 08b3cd8..65b6b95 100644 --- a/onebot/worker.go +++ b/onebot/worker.go @@ -2,6 +2,7 @@ package main import ( "context" + "crypto/aes" "encoding/hex" "encoding/json" "encoding/xml" @@ -334,6 +335,16 @@ func GetDownloadPath(cdnUrl, aesKeyStr string) (string, error) { // 数据接收完成,尝试解密 if len(downloadReq.Media) > 0 { + if len(downloadReq.Media)%aes.BlockSize != 0 { + Info("文件数据仍未对齐 AES 块,继续等待", "url", cdnUrl, "times", i, "media_len", len(downloadReq.Media), "block_size", aes.BlockSize) + if i < 9 { + time.Sleep(2 * time.Second) + continue + } + userID2FileMsgMap.Delete(cdnUrl) + return "", fmt.Errorf("文件数据长度不是 AES 块大小倍数: media_len=%d block_size=%d", len(downloadReq.Media), aes.BlockSize) + } + aesKey, err := hex.DecodeString(aesKeyStr) if err != nil { Error("AES key 解码失败", "err", err)