From c8f134e82bc2fa6e71d479642ea63f7eb4c24a91 Mon Sep 17 00:00:00 2001 From: f1ynng8 Date: Sun, 28 Jun 2026 14:10:53 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=BF=AE=E5=A4=8D=20OneBot?= =?UTF-8?q?=20=E9=9D=99=E9=BB=98=E6=BC=8F=E6=8D=95=E8=8E=B7=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=9A=84=E9=97=AE=E9=A2=98=20=20=20-=20=E6=94=BE?= =?UTF-8?q?=E5=AE=BD=20JS=20=E5=B1=82=20protobuf=20=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=EF=BC=8C=E9=81=BF=E5=85=8D=E8=AF=AF=E5=88=A4?= =?UTF-8?q?=E6=9C=89=E6=95=88=E6=B6=88=E6=81=AF=20=20=20-=20=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=8F=91=E9=80=81=20ACK=20=E5=90=8E=E7=BB=A7=E7=BB=AD?= =?UTF-8?q?=E5=B0=9D=E8=AF=95=E8=A7=A3=E6=9E=90=E6=8E=A5=E6=94=B6=E6=B6=88?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- onebot/protobuf_handler.go | 8 +++---- onebot/script.js | 48 +++----------------------------------- 2 files changed, 6 insertions(+), 50 deletions(-) diff --git a/onebot/protobuf_handler.go b/onebot/protobuf_handler.go index 054ff45..4d8d04d 100644 --- a/onebot/protobuf_handler.go +++ b/onebot/protobuf_handler.go @@ -39,7 +39,8 @@ func isUnsupportedProtobufMessage(err error) bool { } message := err.Error() - return strings.Contains(message, "cannot extract message data") || + return strings.Contains(message, "cannot parse invalid wire-format data") || + strings.Contains(message, "cannot extract message data") || strings.Contains(message, "missing required fields") || strings.Contains(message, "no messages found") } @@ -67,10 +68,7 @@ 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) + return nil, fmt.Errorf("protobuf unmarshal failed (data_len=%d): %w", len(rawBytes), err) } data := getWxMsgData(msg) diff --git a/onebot/script.js b/onebot/script.js index aef1fbd..51c1af0 100644 --- a/onebot/script.js +++ b/onebot/script.js @@ -185,49 +185,6 @@ function readByteArrayIfReadable(addr, len) { } } -function readProtobufVarint(bytes, offset) { - var value = 0; - var multiplier = 1; - - for (var i = 0; i < 10 && offset + i < bytes.length; i++) { - var current = bytes[offset + i]; - value += (current & 0x7f) * multiplier; - if (!Number.isSafeInteger(value)) { - return null; - } - if ((current & 0x80) === 0) { - return { value: value, nextOffset: offset + i + 1 }; - } - multiplier *= 128; - } - - return null; -} - -function hasRecvMessageHeader(bytes) { - var field1Tag = readProtobufVarint(bytes, 0); - if (!field1Tag || field1Tag.value !== 0x08) { - return false; - } - - var recvType = readProtobufVarint(bytes, field1Tag.nextOffset); - if (!recvType) { - return false; - } - - var field2Tag = readProtobufVarint(bytes, recvType.nextOffset); - if (!field2Tag || field2Tag.value !== 0x12) { - return false; - } - - var wrapperLength = readProtobufVarint(bytes, field2Tag.nextOffset); - if (!wrapperLength || wrapperLength.value <= 0) { - return false; - } - - return wrapperLength.value <= bytes.length - wrapperLength.nextOffset; -} - function sendDownloadChunks(dataPtr, dataLen, fileId, cdnUrl) { if (!cdnUrl || dataLen <= 0) { return; @@ -1090,7 +1047,6 @@ function setReceiver() { pendingBuf2RespTaskId = 0; pendingSendMsgType = ""; - return; } if (x2 < 4) { @@ -1107,7 +1063,9 @@ function setReceiver() { return; } const uint8Array = new Uint8Array(mem); - if (!hasRecvMessageHeader(uint8Array)) { + // 与已验证稳定的旧版本保持一致,只做最宽松的消息候选判断。 + // 具体结构交给 Go 解析,宁可产生误判日志,也不要在 JS 层漏掉消息。 + if (uint8Array[0] !== 0x08) { return; }