mirror of
https://github.com/yincongcyincong/wechat_chatter.git
synced 2026-07-15 10:26:52 +08:00
继续修复 OneBot 静默漏捕获消息的问题
- 放宽 JS 层 protobuf 消息过滤,避免误判有效消息 - 处理发送 ACK 后继续尝试解析接收消息
This commit is contained in:
@@ -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)
|
||||
|
||||
+3
-45
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user