INDEX / modules /HFCorrections.js
akra35567's picture
Update modules/HFCorrections.js
c335d2f verified
/**
* ═══════════════════════════════════════════════════════════════════════
* CORREÇÕES HF SPACES - DNS E CONEXΓƒO WHATSAPP (HARD PATCH)
* ═══════════════════════════════════════════════════════════════════════
* Corrige erro: queryA ENODATA / ENOTFOUND web.whatsapp.com
* SoluΓ§Γ£o: Override direto do dns.lookup para ignorar resolvedor do sistema
* ═══════════════════════════════════════════════════════════════════════
*/
const dns = require('dns');
const https = require('https');
// ═══════════════════════════════════════════════════════════════════════
// 1. LISTA COMPLETA DE IPs WHATSAPP/GOOGLE EDGE (FALLBACK)
// ═══════════════════════════════════════════════════════════════════════
const WHATSAPP_IPS = [
'142.250.180.14', // Google/WA Edge
'142.250.187.238',
'142.250.79.0',
'172.217.173.238',
'172.217.28.0',
'108.177.14.0',
'142.250.64.110',
'142.250.191.110',
'142.250.190.14',
'142.250.187.206',
'172.217.169.78',
'31.13.92.52', // Meta Edge
'157.240.226.60' // Meta Edge
];
/**
* Retorna um IP aleatΓ³rio da lista para balanceamento
*/
function getWhatsAppIP() {
const index = Math.floor(Math.random() * WHATSAPP_IPS.length);
return WHATSAPP_IPS[index];
}
// ═══════════════════════════════════════════════════════════════════════
// 2. PATCH CRÍTICO DE DNS (HARD OVERRIDE)
// ═══════════════════════════════════════════════════════════════════════
/**
* Sobrescreve a funΓ§Γ£o dns.lookup nativa do Node.js.
* Isso intercepta as chamadas do Baileys antes que elas toquem na rede.
*/
function patchGlobalDNS() {
const originalLookup = dns.lookup;
dns.lookup = (hostname, options, callback) => {
// Normaliza argumentos (options Γ© opcional no Node.js)
if (typeof options === 'function') {
callback = options;
options = {};
}
// Intercepta domΓ­nios do WhatsApp
if (hostname === 'web.whatsapp.com' || hostname === 'whatsapp.com' || hostname === 'wss.whatsapp.net') {
const directIP = getWhatsAppIP();
// Retorna sucesso imediatamente com o IP fixo (Family 4 = IPv4)
// console.log(`πŸ›‘οΈ [DNS-PATCH] Redirecionando ${hostname} -> ${directIP}`);
return callback(null, directIP, 4);
}
// Para qualquer outro domΓ­nio (deepgram, google, etc), usa o DNS normal
return originalLookup(hostname, options, callback);
};
console.log('βœ… DNS Hard-Patch aplicado: web.whatsapp.com forΓ§ado para IPs diretos');
}
// ═══════════════════════════════════════════════════════════════════════
// 3. AGENTE HTTP OTIMIZADO PARA HF SPACES
// ═══════════════════════════════════════════════════════════════════════
function createHFAgent() {
try {
// Verifica proxy
const proxy = process.env.HTTPS_PROXY || process.env.HTTP_PROXY || process.env.https_proxy;
if (proxy) {
const { HttpsProxyAgent } = require('https-proxy-agent');
console.log('πŸ”Œ Usando proxy detectado:', proxy.substring(0, 20) + '...');
return new HttpsProxyAgent(proxy);
}
// Sem proxy: Agente otimizado
return new https.Agent({
keepAlive: true,
keepAliveMsecs: 30000,
timeout: 60000,
maxSockets: 100,
maxFreeSockets: 20,
// CRÍTICO: rejectUnauthorized: false permite conexão SSL direta no IP
// sem validar se o certificado bate com o "IP" (jΓ‘ que o cert Γ© para o domΓ­nio)
rejectUnauthorized: false
});
} catch (error) {
console.warn('⚠️ Erro ao criar agente HTTP:', error.message);
return undefined;
}
}
// ═══════════════════════════════════════════════════════════════════════
// 4. OPÇÕES DE WEBSOCKET (HEADERS ESSENCIAIS)
// ═══════════════════════════════════════════════════════════════════════
function createWebSocketOptions() {
return {
// Headers necessΓ‘rios para enganar o servidor jΓ‘ que estamos conectando via IP
headers: {
'Origin': 'https://web.whatsapp.com',
'Host': 'web.whatsapp.com', // O servidor precisa disso para rotear corretamente (SNI)
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
'Accept': '*/*',
'Accept-Language': 'pt-BR,pt;q=0.9,en;q=0.8',
'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',
'Sec-WebSocket-Version': '13',
},
handshakeTimeout: 60000, // Timeout aumentado
timeout: 60000,
};
}
// ═══════════════════════════════════════════════════════════════════════
// 5. VERIFICAÇÃO DE REDE (DUMMY/PASS-THROUGH)
// ═══════════════════════════════════════════════════════════════════════
async function verifyHFNetwork() {
// Com o patch de DNS aplicado, a verificaΓ§Γ£o de rede tradicional Γ© irrelevante
// e pode falhar falsamente. Retornamos true para nΓ£o bloquear o boot.
console.log('🌐 Patch de rede ativo. Ignorando teste de DNS convencional.');
return true;
}
// ═══════════════════════════════════════════════════════════════════════
// EXPORTAÇÕES
// ═══════════════════════════════════════════════════════════════════════
module.exports = {
configureDNS: () => {
// Configura o patch imediatamente ao ser chamado
const dns = require('dns');
// ForΓ§a ordem IPv4
if (dns.setDefaultResultOrder) {
dns.setDefaultResultOrder('ipv4first');
}
// Aplica o override
patchGlobalDNS();
},
getWhatsAppIP,
createHFAgent,
createWebSocketOptions,
verifyHFNetwork
};