From ba5d57c0fde5e0d5a23f36dffa756001d6bf21eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E7=92=90=E7=91=B6?= <1347888240@qq.com> Date: Wed, 11 Mar 2026 16:29:26 +0800 Subject: [PATCH] update wecom websocket --- pkg/channels/wecom/websocket.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pkg/channels/wecom/websocket.go b/pkg/channels/wecom/websocket.go index 8e90757f9..3d9115050 100644 --- a/pkg/channels/wecom/websocket.go +++ b/pkg/channels/wecom/websocket.go @@ -613,6 +613,28 @@ func (c *WeComWSChannel) connect() error { c.connected = true c.connMu.Unlock() + // 设置心跳超时和标准 ping/pong 处理器 (处理底层心跳) + deadline := time.Duration(c.config.HeartbeatInterval) * 3 * time.Second + conn.SetReadDeadline(time.Now().Add(deadline)) + + originalPingHandler := conn.PingHandler() + conn.SetPingHandler(func(appData string) error { + conn.SetReadDeadline(time.Now().Add(deadline)) + if originalPingHandler != nil { + return originalPingHandler(appData) + } + return nil + }) + + originalPongHandler := conn.PongHandler() + conn.SetPongHandler(func(appData string) error { + conn.SetReadDeadline(time.Now().Add(deadline)) + if originalPongHandler != nil { + return originalPongHandler(appData) + } + return nil + }) + logger.InfoC("wecom_ws", "WebSocket connected") // 触发连接成功事件 @@ -696,6 +718,9 @@ func (c *WeComWSChannel) readLoop() { return } + // 更新读超时,心跳间隔的 3 倍,如果没有收到任何消息则主动断开 + conn.SetReadDeadline(time.Now().Add(time.Duration(c.config.HeartbeatInterval) * 3 * time.Second)) + // 先读取原始消息 messageType, rawMessage, err := conn.ReadMessage() if err != nil { @@ -746,6 +771,8 @@ func (c *WeComWSChannel) writeLoop() { continue } + // 更新写超时 + conn.SetWriteDeadline(time.Now().Add(10 * time.Second)) if err := conn.WriteJSON(msg); err != nil { logger.ErrorCF("wecom_ws", "WebSocket write error", map[string]any{ "error": err.Error(),