From bab58054f7428867bf420454c9b9b8a8b98fc98d Mon Sep 17 00:00:00 2001 From: Judson Cairo Date: Thu, 7 Mar 2024 19:18:32 -0300 Subject: [PATCH] Change the way numbers are validated on whatsapp --- package.json | 2 - .../services/whatsapp.baileys.service.ts | 61 ++++++++++++++----- 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index ef023149..e78805cb 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,6 @@ "exiftool-vendored": "^22.0.0", "express": "^4.18.2", "express-async-errors": "^3.1.1", - "fast-levenshtein": "^3.0.0", "form-data": "^4.0.0", "hbs": "^4.2.0", "https-proxy-agent": "^7.0.2", @@ -94,7 +93,6 @@ "@types/compression": "^1.7.2", "@types/cors": "^2.8.13", "@types/express": "^4.17.17", - "@types/fast-levenshtein": "^0.0.4", "@types/js-yaml": "^4.0.5", "@types/jsonwebtoken": "^8.5.9", "@types/mime-types": "^2.1.1", diff --git a/src/whatsapp/services/whatsapp.baileys.service.ts b/src/whatsapp/services/whatsapp.baileys.service.ts index 1ed58471..77c2399a 100644 --- a/src/whatsapp/services/whatsapp.baileys.service.ts +++ b/src/whatsapp/services/whatsapp.baileys.service.ts @@ -41,7 +41,6 @@ import axios from 'axios'; import { exec } from 'child_process'; import { arrayUnique, isBase64, isURL } from 'class-validator'; import EventEmitter2 from 'eventemitter2'; -import levenshtein from 'fast-levenshtein'; import fs, { existsSync, readFileSync } from 'fs'; import Long from 'long'; import NodeCache from 'node-cache'; @@ -2455,24 +2454,58 @@ export class BaileysStartupService extends WAStartupService { owner: this.instance.name, ids: jids.users.map(({ jid }) => (jid.startsWith('+') ? jid.substring(1) : jid)), }); - const verify = await this.client.onWhatsApp( - ...jids.users.map(({ jid }) => (!jid.startsWith('+') ? `+${jid}` : jid)), - ); + const numbersToVerify = jids.users.map(({ jid }) => jid.replace('+', '')); + const verify = await this.client.onWhatsApp(...numbersToVerify); const users: OnWhatsAppDto[] = await Promise.all( jids.users.map(async (user) => { - const MAX_SIMILARITY_THRESHOLD = 0.01; - const isBrWithDigit = user.jid.startsWith('55') && user.jid.slice(4, 5) === '9' && user.jid.length === 28; - const jid = isBrWithDigit ? user.jid.slice(0, 4) + user.jid.slice(5) : user.jid; + let numberVerified: (typeof verify)[0] | null = null; - const numberVerified = verify.find((v) => { - const mainJidSimilarity = levenshtein.get(user.jid, v.jid) / Math.max(user.jid.length, v.jid.length); - const jidSimilarity = levenshtein.get(jid, v.jid) / Math.max(jid.length, v.jid.length); - return mainJidSimilarity <= MAX_SIMILARITY_THRESHOLD || jidSimilarity <= MAX_SIMILARITY_THRESHOLD; - }); + // Brazilian numbers + if (user.number.startsWith('55')) { + const numberWithDigit = + user.number.slice(4, 5) === '9' && user.number.length === 13 + ? user.number + : `${user.number.slice(0, 4)}9${user.number.slice(4)}`; + const numberWithoutDigit = + user.number.length === 12 ? user.number : user.number.slice(0, 4) + user.number.slice(5); + + numberVerified = verify.find( + (v) => v.jid === `${numberWithDigit}@s.whatsapp.net` || v.jid === `${numberWithoutDigit}@s.whatsapp.net`, + ); + } + + // Mexican/Argentina numbers + // Ref: https://faq.whatsapp.com/1294841057948784 + if (!numberVerified && (user.number.startsWith('52') || user.number.startsWith('54'))) { + let prefix = ''; + if (user.number.startsWith('52')) { + prefix = '1'; + } + if (user.number.startsWith('54')) { + prefix = '9'; + } + + const numberWithDigit = + user.number.slice(2, 3) === prefix && user.number.length === 13 + ? user.number + : `${user.number.slice(0, 2)}${prefix}${user.number.slice(2)}`; + const numberWithoutDigit = + user.number.length === 12 ? user.number : user.number.slice(0, 2) + user.number.slice(3); + + numberVerified = verify.find( + (v) => v.jid === `${numberWithDigit}@s.whatsapp.net` || v.jid === `${numberWithoutDigit}@s.whatsapp.net`, + ); + } + + if (!numberVerified) { + numberVerified = verify.find((v) => v.jid === user.jid); + } + + const numberJid = numberVerified?.jid || user.jid; return { exists: !!numberVerified?.exists, - jid: numberVerified?.jid || user.jid, - name: contacts.find((c) => c.id === jid)?.pushName, + jid: numberJid, + name: contacts.find((c) => c.id === numberJid)?.pushName, number: user.number, }; }),