fix(whatsapp): normalize device-qualified contact ids

This commit is contained in:
wmq
2026-08-03 01:11:46 +08:00
parent 7e739ad7b8
commit bffd2f4fe6
3 changed files with 11 additions and 3 deletions
+7 -3
View File
@@ -1,11 +1,15 @@
import crypto from 'node:crypto' import crypto from 'node:crypto'
export function canonicalWhatsAppJid(jid, identity = {}) { export function canonicalWhatsAppJid(jid, identity = {}) {
const raw = String(jid || '').trim().toLowerCase() const normalizeDevice = (value) => String(value || '')
.trim()
.toLowerCase()
.replace(/:\d+(?=@s\.whatsapp\.net$)/, '')
const raw = normalizeDevice(jid)
if (!raw || raw.endsWith('@g.us') || raw.endsWith('@newsletter')) return raw if (!raw || raw.endsWith('@g.us') || raw.endsWith('@newsletter')) return raw
const canonical = String(identity?.canonicalJid || '').trim().toLowerCase() const canonical = normalizeDevice(identity?.canonicalJid)
if (canonical.endsWith('@s.whatsapp.net')) return canonical if (canonical.endsWith('@s.whatsapp.net')) return canonical
const phone = String(identity?.phone || '').replace(/\D/g, '') const phone = String(identity?.phone || '').split(':')[0].replace(/\D/g, '')
return phone ? `${phone}@s.whatsapp.net` : raw return phone ? `${phone}@s.whatsapp.net` : raw
} }
+2
View File
@@ -12,6 +12,8 @@ test('WhatsApp LID resolves to the same canonical phone identity', () => {
assert.equal(canonicalWhatsAppJid('987654321@lid', { phone: '+1 555 123 4567' }), phoneJid) assert.equal(canonicalWhatsAppJid('987654321@lid', { phone: '+1 555 123 4567' }), phoneJid)
assert.equal(canonicalWhatsAppJid('987654321@lid', { canonicalJid: phoneJid }), phoneJid) assert.equal(canonicalWhatsAppJid('987654321@lid', { canonicalJid: phoneJid }), phoneJid)
assert.equal(whatsappCustomerStableId(canonicalWhatsAppJid('987654321@lid', { phone: '+1 555 123 4567' })), whatsappCustomerStableId(phoneJid)) assert.equal(whatsappCustomerStableId(canonicalWhatsAppJid('987654321@lid', { phone: '+1 555 123 4567' })), whatsappCustomerStableId(phoneJid))
assert.equal(canonicalWhatsAppJid('15551234567:4@s.whatsapp.net'), phoneJid)
assert.equal(canonicalWhatsAppJid('987654321@lid', { canonicalJid: '15551234567:0@s.whatsapp.net' }), phoneJid)
}) })
test('WhatsApp customer id remains stable after gateway reauthorization', () => { test('WhatsApp customer id remains stable after gateway reauthorization', () => {
+2
View File
@@ -805,6 +805,7 @@ async function connectAccount(accountId) {
id: jidNormalizedUser(sock.user.id), id: jidNormalizedUser(sock.user.id),
name: sock.user.name || account.name || account.phoneNumber, name: sock.user.name || account.name || account.phoneNumber,
} : account.user } : account.user
delete account.lastError
delete account.qrDataUrl delete account.qrDataUrl
delete account.pairingCode delete account.pairingCode
const session = sessions.get(accountId) const session = sessions.get(accountId)
@@ -1595,6 +1596,7 @@ app.get('/accounts/:id/chats/:jid/identity', async (req, res) => {
phoneJid = jid phoneJid = jid
} }
} }
phoneJid = jidNormalizedUser(phoneJid)
const contact = store.contacts.get(jid) || store.contacts.get(phoneJid) || {} const contact = store.contacts.get(jid) || store.contacts.get(phoneJid) || {}
const group = jid.endsWith('@g.us') const group = jid.endsWith('@g.us')
? await sock.groupMetadata(jid).catch(() => store.groups.get(jid)) ? await sock.groupMetadata(jid).catch(() => store.groups.get(jid))