From a772d9f9786aa2930ca87d440bd0d3e1c2291885 Mon Sep 17 00:00:00 2001 From: LiaoYijun Date: Tue, 24 Dec 2024 16:30:27 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=A2=9E=E5=8A=A0=20direction=EF=BC=9B?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20Baileys=20Utils=EF=BC=9B=E6=8D=95=E8=8E=B7?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=E9=94=99=E8=AF=AF=EF=BC=8C?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=20WA=20=E5=AE=9E=E4=BE=8B=E9=80=80=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- baileys-server/index.js | 8 ++- wai-server/core/baileys/common.js | 49 +++++++++++++ wai-server/core/baileys/index.js | 110 ++++++++++-------------------- 3 files changed, 92 insertions(+), 75 deletions(-) create mode 100644 wai-server/core/baileys/common.js diff --git a/baileys-server/index.js b/baileys-server/index.js index a774e43..abb73f4 100644 --- a/baileys-server/index.js +++ b/baileys-server/index.js @@ -8,6 +8,7 @@ const { makeInMemoryStore, useMultiFileAuthState, downloadMediaMessage, + isJidGroup,jidNormalizedUser, } = require('@whiskeysockets/baileys'); const { writeFile } = require('fs/promises'); @@ -42,7 +43,7 @@ const createWhatsApp = async phone => { const formatPhoneNumber = number => { if (number === null || number === undefined) return ''; - if (number.indexOf('@g.us') > -1) { + if (isJidGroup(number)) { return number; } else if (number.indexOf('@broadcast') > -1) { return number; @@ -162,8 +163,11 @@ const createWhatsApp = async phone => { } const fromWhatsAppNo = parsePhoneNumber(msg.key.remoteJid); + console.log('fromWhatsAppNo: ', fromWhatsAppNo) - if (msg.key.remoteJid.indexOf('@g.us') > -1) { + console.log('jidNormalizedUser: ', jidNormalizedUser(msg.key.remoteJid)) + + if (isJidGroup(msg.key.remoteJid)) { const metadata = await waSocket.groupMetadata(msg.key.remoteJid); console.log('群: ' + metadata.subject + ', description: ' + metadata.desc); diff --git a/wai-server/core/baileys/common.js b/wai-server/core/baileys/common.js new file mode 100644 index 0000000..764b157 --- /dev/null +++ b/wai-server/core/baileys/common.js @@ -0,0 +1,49 @@ +const { isJidUser, isJidGroup, isJidBroadcast, jidEncode, jidDecode, S_WHATSAPP_NET } = require('@whiskeysockets/baileys'); + +const formatPhoneNumber = number => { + if (number === null || number === undefined) return ''; + + if (isJidGroup(number)) { + return number; + } else if (isJidBroadcast(number)) { + return number; + } else { + jidEncode(number, S_WHATSAPP_NET); + } +}; + +const parsePhoneNumber = number => { + if (number === null || number === undefined) return ''; + + if (isJidUser(number)) { + return jidDecode(number).user; + } else { + return number; + } +}; + +// status: sent read delivered failed +// 2 sent, 3 delivered, 4 read, 0 error +const formatStatus = number => { + if (number === 2) return 'sent'; + else if (number === 3) return 'delivered'; + else if (number === 4) return 'read'; + else if (number === 0) return 'error'; + else return 'played'; +}; + +// Time: 2008-07-07 15:37:07 +const formatTimestamp = timestamp => { + if (timestamp === null) return ''; + + const datetime = new Date(timestamp * 1000); + + return datetime.getFullYear() + '-' + (datetime.getMonth() + 1) + '-' + datetime.getDay() + ' ' + datetime.getHours() + ':' + datetime.getMinutes() + ':' + datetime.getSeconds(); +}; + +module.exports = { + formatTimestamp, + formatStatus, + parsePhoneNumber, + formatPhoneNumber, +}; diff --git a/wai-server/core/baileys/index.js b/wai-server/core/baileys/index.js index cb97523..0b64d90 100644 --- a/wai-server/core/baileys/index.js +++ b/wai-server/core/baileys/index.js @@ -11,6 +11,7 @@ const { const { writeFile } = require('fs/promises'); const waEmitter = require('../emitter'); +const { formatPhoneNumber, parsePhoneNumber, formatStatus, formatTimestamp } = require('./common'); const generateId = require('../../utils/generateId.util'); const NodeCache = require('node-cache'); const P = require('pino'); @@ -18,12 +19,8 @@ const P = require('pino'); const logger = P({ timestamp: () => `,"time":"${new Date().toJSON()}"` }, P.destination('./wa-logs.txt')); logger.level = 'trace'; -// external map to store retry counts of messages when decryption/encryption fails -// keep this out of the socket itself, so as to prevent a message decryption/encryption loop across socket restarts const msgRetryCounterCache = new NodeCache(); -// the store maintains the data of the WA connection in memory -// can be written out to a file & read from it const store = makeInMemoryStore({ logger }); store?.readFromFile('./baileys_store_multi.json'); // save every 10s @@ -37,8 +34,10 @@ waEmitter.on('message:updated', event => { waEmitter.on('message:received', event => { console.info('msg:event', event); }); +waEmitter.on('connection.open', event => { + console.info('msg:event', event); +}); -// start a connection const createWhatsApp = async phone => { const channelId = generateId(); const whatsAppNo = phone; @@ -47,64 +46,38 @@ const createWhatsApp = async phone => { const { version, isLatest } = await fetchLatestBaileysVersion(); const waVersion = version.join('.') + ', ' + (isLatest ? 'latest' : 'out'); - const formatPhoneNumber = number => { - if (number === null || number === undefined) return ''; - - if (number.indexOf('@g.us') > -1) { - return number; - } else if (number.indexOf('@broadcast') > -1) { - return number; - } else { - return number + '@s.whatsapp.net'; - } - }; - - const parsePhoneNumber = number => { - if (number === null || number === undefined) return ''; - - if (number.indexOf('@s.whatsapp.net') > -1) { - return number.split('@')[0]; - } else { - return number; - } - }; - - // status: sent read delivered failed - // 2 sent, 3 delivered, 4 read, 0 error - // Time: 2008-07-07 15:37:07 - - const formatStatus = number => { - if (number === 2) return 'sent'; - else if (number === 3) return 'delivered'; - else if (number === 4) return 'read'; - else if (number === 0) return 'error'; - else return 'played'; - }; - const formatTimestamp = timestamp => { - if (timestamp === null) return ''; - - const datetime = new Date(timestamp * 1000); - - return datetime.getFullYear() + '-' + (datetime.getMonth() + 1) + '-' + datetime.getDay() + ' ' + datetime.getHours() + ':' + datetime.getMinutes() + ':' + datetime.getSeconds(); - }; - const sendTextMessage = (whatsAppNo, content) => { const number = formatPhoneNumber(whatsAppNo); - console.info('formatPhoneNumber: ', number); - waSocket.sendMessage(number, { text: content }); + try { + waSocket.sendMessage(number, { text: content }); + } catch (ex) { + waEmitter.emit('message.error', { + messge: '发送文本消息出错', + error: ex + }) + console.error('发送文本消息出错: ', ex); + } }; const sendImageMessage = (whatsAppNo, imageUrl) => { const number = formatPhoneNumber(whatsAppNo); - waSocket.sendMessage(number, { - image: { url: imageUrl }, - }); + try { + waSocket.sendMessage(number, { + image: { url: imageUrl }, + }); + } catch (ex) { + waEmitter.emit('message.error', { + messge: '发送图片消息出错', + error: ex + }) + console.error('发送图片消息出错: ', ex); + } }; let waSocket = null; const start = () => { - return new Promise((resolve, reject) => { + return new Promise(resolve => { waSocket = makeWASocket({ version, logger, @@ -128,6 +101,8 @@ const createWhatsApp = async phone => { if (connection === 'close') { console.log('链接断开:', lastDisconnect); if (lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut) { + + console.log('正在重连:'); start(); } else { waSocket.end(error => console.error('end.error: ', error)); @@ -135,8 +110,9 @@ const createWhatsApp = async phone => { console.log('Connection closed. You are logged out.'); } } else if (connection === 'open') { - console.info('链接成功'); - waEmitter.emit('connection.open', waSocket); + waEmitter.emit('connection.open', { + status: 'online', + }); } else if (qr !== undefined) { // WebSocket 创建成功等待扫码,如果没有扫码会更新 qr resolve(qr); @@ -172,24 +148,11 @@ const createWhatsApp = async phone => { const fromWhatsAppNo = parsePhoneNumber(msg.key.remoteJid); - if (msg.key.remoteJid.indexOf('@g.us') > -1) { - const metadata = await waSocket.groupMetadata(msg.key.remoteJid); - console.log('群: ' + metadata.subject + ', description: ' + metadata.desc); - - try { - const ppUrl = await waSocket.profilePictureUrl(msg.key.remoteJid); - console.log('群头像: ' + ppUrl); - } catch (ex) { - console.error('群头像出错了: ', ex); - } - } else { - console.log('remoteJid: ', msg.key.remoteJid); - try { - const ppUrl = await waSocket.profilePictureUrl(msg.key.remoteJid); - console.log('个人头像: ' + ppUrl); - } catch (ex) { - console.error('个人头像出错了: ', ex); - } + try { + const ppUrl = await waSocket.profilePictureUrl(msg.key.remoteJid); + console.log('头像: ' + ppUrl); + } catch (ex) { + console.error('头像出错: ', ex); } if (msg.message?.conversation || msg.message?.extendedTextMessage?.text) { @@ -200,7 +163,7 @@ const createWhatsApp = async phone => { } else if (text.indexOf('文本') > -1) { sendTextMessage(fromWhatsAppNo, '这是文本消息:' + new Date().toString()); } else if (text.indexOf('发群') > -1) { - sendTextMessage('120363335516526642@g.us', '这是群消息:' + new Date().toString()); + sendTextMessage('120363363417115199@g.us', '这是群消息:' + new Date().toString()); } if (msg.key.fromMe) { @@ -223,6 +186,7 @@ const createWhatsApp = async phone => { waEmitter.emit('message:received', { id: msg.key.id, status: '', + direction: 'inbound', from: fromWhatsAppNo, to: whatsAppNo, type: 'text',