feat(message): enhance message normalization and asset handling in HTML content

This commit is contained in:
mlogclub
2026-04-17 12:50:06 +08:00
parent 9efec4d379
commit 2631689958
4 changed files with 231 additions and 41 deletions
+3 -2
View File
@@ -457,11 +457,12 @@ func (s *messageService) normalizeMessageContent(conversationID int64, messageTy
switch messageType {
case enums.IMMessageTypeHTML:
sanitized := utils.SanitizeMessageHTML(content)
summary := utils.BuildHTMLSummary(sanitized)
normalized := utils.NormalizeMessageHTMLAssets(sanitized)
summary := utils.BuildHTMLSummary(normalized)
if summary == "" {
return "", "", "", errorsx.InvalidParam("消息内容不能为空")
}
return sanitized, "", summary, nil
return normalized, "", summary, nil
case enums.IMMessageTypeImage, enums.IMMessageTypeAttachment:
assetPayload, err := parseIMMessageAssetPayload(payload)
if err != nil {
@@ -4,12 +4,10 @@ import (
"encoding/json"
"fmt"
"log/slog"
"net/url"
"strings"
"time"
"cs-agent/internal/models"
"cs-agent/internal/pkg/config"
"cs-agent/internal/pkg/enums"
"cs-agent/internal/pkg/utils"
"cs-agent/internal/repositories"
@@ -477,44 +475,9 @@ func (s *wxWorkKFOutboundService) buildHTMLChunks(content string) ([]wxWorkKFOut
}
func (s *wxWorkKFOutboundService) resolveAssetIDFromImageSrc(src string) (string, error) {
cfg := config.Current()
storageKey, err := resolveStorageKeyFromAssetURL(strings.TrimSpace(cfg.Storage.Local.BaseURL), src)
if err != nil {
return "", err
}
asset := AssetService.GetByStorageKey(storageKey)
asset := utils.FindAssetByMessageImageURL(src)
if asset == nil {
return "", fmt.Errorf("未找到图片资源")
}
return strings.TrimSpace(asset.AssetID), nil
}
func resolveStorageKeyFromAssetURL(baseURL, rawURL string) (string, error) {
baseURL = strings.TrimRight(strings.TrimSpace(baseURL), "/")
rawURL = strings.TrimSpace(rawURL)
if baseURL == "" || rawURL == "" {
return "", fmt.Errorf("图片URL不合法")
}
if strings.HasPrefix(rawURL, baseURL+"/") {
return strings.TrimLeft(strings.TrimPrefix(rawURL, baseURL), "/"), nil
}
baseParsed, baseErr := url.Parse(baseURL)
rawParsed, rawErr := url.Parse(rawURL)
if baseErr != nil || rawErr != nil {
return "", fmt.Errorf("图片URL不合法")
}
if !strings.EqualFold(baseParsed.Host, rawParsed.Host) {
return "", fmt.Errorf("图片URL不属于当前存储域名")
}
basePath := strings.TrimRight(baseParsed.Path, "/")
rawPath := strings.TrimLeft(rawParsed.Path, "/")
if basePath == "" {
return rawPath, nil
}
basePath = strings.TrimLeft(basePath, "/")
if !strings.HasPrefix(rawPath, basePath+"/") {
return "", fmt.Errorf("图片URL不属于当前存储目录")
}
return strings.TrimLeft(strings.TrimPrefix(rawPath, basePath), "/"), nil
}