修复群昵称读取错误的问题

This commit is contained in:
xuncha
2026-02-01 00:07:38 +08:00
parent cffeeb26ec
commit 65365107f5
7 changed files with 62 additions and 13 deletions

View File

@@ -67,6 +67,38 @@ class AnalyticsService {
return new Set(this.getExcludedUsernamesList())
}
private escapeSqlValue(value: string): string {
return value.replace(/'/g, "''")
}
private async getAliasMap(usernames: string[]): Promise<Record<string, string>> {
const map: Record<string, string> = {}
if (usernames.length === 0) return map
const chunkSize = 200
for (let i = 0; i < usernames.length; i += chunkSize) {
const chunk = usernames.slice(i, i + chunkSize)
const inList = chunk.map((u) => `'${this.escapeSqlValue(u)}'`).join(',')
if (!inList) continue
const sql = `
SELECT username, alias
FROM contact
WHERE username IN (${inList})
`
const result = await wcdbService.execQuery('contact', null, sql)
if (!result.success || !result.rows) continue
for (const row of result.rows as Record<string, any>[]) {
const username = row.username || ''
const alias = row.alias || ''
if (username && alias) {
map[username] = alias
}
}
}
return map
}
private cleanAccountDirName(name: string): string {
const trimmed = name.trim()
if (!trimmed) return trimmed
@@ -419,7 +451,7 @@ class AnalyticsService {
}
}
async getExcludeCandidates(): Promise<{ success: boolean; data?: Array<{ username: string; displayName: string; avatarUrl?: string }>; error?: string }> {
async getExcludeCandidates(): Promise<{ success: boolean; data?: Array<{ username: string; displayName: string; avatarUrl?: string; wechatId?: string }>; error?: string }> {
try {
const conn = await this.ensureConnected()
if (!conn.success || !conn.cleanedWxid) return { success: false, error: conn.error }
@@ -435,9 +467,10 @@ class AnalyticsService {
}
const usernameList = Array.from(usernames)
const [displayNames, avatarUrls] = await Promise.all([
const [displayNames, avatarUrls, aliasMap] = await Promise.all([
wcdbService.getDisplayNames(usernameList),
wcdbService.getAvatarUrls(usernameList)
wcdbService.getAvatarUrls(usernameList),
this.getAliasMap(usernameList)
])
const entries = usernameList.map((username) => {
@@ -447,7 +480,9 @@ class AnalyticsService {
const avatarUrl = avatarUrls.success && avatarUrls.map
? avatarUrls.map[username]
: undefined
return { username, displayName, avatarUrl }
const alias = aliasMap[username]
const wechatId = alias || (!username.startsWith('wxid_') ? username : '')
return { username, displayName, avatarUrl, wechatId }
})
return { success: true, data: entries }

View File

@@ -260,7 +260,7 @@ class ExportService {
}
// 清理昵称:去除前后空白和特殊字符
nickname = nickname.trim().replace(/[\x00-\x1F\x7F]/g, '')
nickname = this.normalizeGroupNickname(nickname)
// 只保存有效的群昵称(长度 > 0 且 < 50
if (nickname && nickname.length > 0 && nickname.length < 50) {
@@ -432,6 +432,15 @@ class ExportService {
return /^[0-9a-fA-F]+$/.test(s)
}
private normalizeGroupNickname(value: string): string {
const trimmed = (value || '').trim()
if (!trimmed) return ''
const cleaned = trimmed.replace(/[\x00-\x1F\x7F]/g, '')
if (!cleaned) return ''
if (/^[,"'“”‘’,、]+$/.test(cleaned)) return ''
return cleaned
}
/**
* 根据用户偏好获取显示名称
*/
@@ -2034,7 +2043,7 @@ class ExportService {
? contact.contact.nickName
: (senderInfo.displayName || senderWxid)
const senderRemark = contact.success && contact.contact?.remark ? contact.contact.remark : ''
const senderGroupNickname = groupNicknamesMap.get(senderWxid?.toLowerCase() || '') || ''
const senderGroupNickname = this.normalizeGroupNickname(groupNicknamesMap.get(senderWxid?.toLowerCase() || '') || '')
// 使用用户偏好的显示名称
const senderDisplayName = this.getPreferredDisplayName(
@@ -2080,7 +2089,7 @@ class ExportService {
? sessionContact.contact.remark
: ''
const sessionGroupNickname = isGroup
? (groupNicknamesMap.get(sessionId.toLowerCase()) || '')
? this.normalizeGroupNickname(groupNicknamesMap.get(sessionId.toLowerCase()) || '')
: ''
// 使用用户偏好的显示名称
@@ -2447,7 +2456,7 @@ class ExportService {
// 获取群昵称 (仅群聊且完整列模式)
if (isGroup && !useCompactColumns && senderWxid) {
senderGroupNickname = groupNicknamesMap.get(senderWxid.toLowerCase()) || ''
senderGroupNickname = this.normalizeGroupNickname(groupNicknamesMap.get(senderWxid.toLowerCase()) || '')
}