|
|
|
|
@ -91,7 +91,7 @@ const createWhatsApp = async phone => {
|
|
|
|
|
store?.bind(waSocket.ev);
|
|
|
|
|
|
|
|
|
|
const parseTextMessage = original => {
|
|
|
|
|
const text = original.message?.conversation || original.message?.extendedTextMessage?.text;
|
|
|
|
|
const text = original.message?.conversation;
|
|
|
|
|
return {
|
|
|
|
|
type: 'text',
|
|
|
|
|
text: {
|
|
|
|
|
@ -100,6 +100,35 @@ const createWhatsApp = async phone => {
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const parseExtendedTextMessage = original => {
|
|
|
|
|
const text = original.message?.extendedTextMessage?.text;
|
|
|
|
|
return {
|
|
|
|
|
type: 'text',
|
|
|
|
|
text: {
|
|
|
|
|
body: text,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const parseReactionMessage = original => {
|
|
|
|
|
const text = original.message?.reactionMessage?.text;
|
|
|
|
|
return {
|
|
|
|
|
type: 'text',
|
|
|
|
|
text: {
|
|
|
|
|
body: text,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const parseEditedMessage = original => {
|
|
|
|
|
const text = original.message?.protocolMessage?.editedMessage?.conversation;
|
|
|
|
|
return {
|
|
|
|
|
type: 'text',
|
|
|
|
|
text: {
|
|
|
|
|
body: text,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const parseImageMessage = async original => {
|
|
|
|
|
const imageMessage = original.message.imageMessage;
|
|
|
|
|
@ -122,6 +151,26 @@ const createWhatsApp = async phone => {
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const parseDocumentMessage = async original => {
|
|
|
|
|
const documentMessage = original.message.documentMessage;
|
|
|
|
|
const imageBuffer = await downloadMediaMessage(
|
|
|
|
|
original, 'buffer', {}, { logger, reuploadRequest: waSocket.updateMediaMessage, },
|
|
|
|
|
);
|
|
|
|
|
const imageFilename = './temp/doc_' + whatsAppNo + '_' + original.key.id + '_' + documentMessage.fileName;
|
|
|
|
|
await writeFile(imageFilename, imageBuffer);
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
type: 'document',
|
|
|
|
|
document: {
|
|
|
|
|
mimetype: documentMessage.mimetype,
|
|
|
|
|
sha256: uint8ArrayToBase64(documentMessage.fileSha256),
|
|
|
|
|
caption: documentMessage.caption,
|
|
|
|
|
filePath: imageFilename,
|
|
|
|
|
link_original: documentMessage.url,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const parseTemplateMessage = original => {
|
|
|
|
|
if (original.message.templateMessage.hydratedTemplate) {
|
|
|
|
|
const text = original.message.templateMessage?.hydratedTemplate?.hydratedContentText;
|
|
|
|
|
@ -144,30 +193,32 @@ const createWhatsApp = async phone => {
|
|
|
|
|
|
|
|
|
|
const getMessageParser = (original) => {
|
|
|
|
|
|
|
|
|
|
const contentType = getContentType(original);
|
|
|
|
|
// ...
|
|
|
|
|
const messageType = getContentType(original.message)
|
|
|
|
|
console.info('messageType: ', messageType)
|
|
|
|
|
|
|
|
|
|
if (original.message?.conversation) return parseTextMessage;
|
|
|
|
|
|
|
|
|
|
if (original.message?.conversation || original.message?.extendedTextMessage?.text) return parseTextMessage;
|
|
|
|
|
if (original.message?.extendedTextMessage) return parseExtendedTextMessage;
|
|
|
|
|
|
|
|
|
|
if (original.message?.reactionMessage) return parseReactionMessage;
|
|
|
|
|
|
|
|
|
|
if (original.message?.protocolMessage?.editedMessage) return parseEditedMessage;
|
|
|
|
|
|
|
|
|
|
if (original.message?.imageMessage) return parseImageMessage;
|
|
|
|
|
|
|
|
|
|
// if (original.message?.documentMessage) return parseDocumentMessage;
|
|
|
|
|
|
|
|
|
|
if (original.message?.templateMessage) return parseTemplateMessage;
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const getEventSource = (upsert) => {
|
|
|
|
|
const getUpsertSource = (upsert) => {
|
|
|
|
|
// source = prefix + infix + suffix
|
|
|
|
|
// prefix: server.name
|
|
|
|
|
// infix: upsert/update
|
|
|
|
|
// suffix: notify/append...
|
|
|
|
|
if (upsert.type === 'notify') {
|
|
|
|
|
return serverConfig.name + '.messages.upsert.notify';
|
|
|
|
|
} else if (upsert.type === 'append') {
|
|
|
|
|
return serverConfig.name + '.messages.upsert.append';
|
|
|
|
|
} else {
|
|
|
|
|
return serverConfig.name + '.messages.upsert.unknown';
|
|
|
|
|
}
|
|
|
|
|
return serverConfig.name + '.messages.upsert.' + upsert.type;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleMessagesUpsert = async upsert => {
|
|
|
|
|
@ -204,7 +255,7 @@ const createWhatsApp = async phone => {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const emitEventName = msg.key.fromMe ? 'message:updated' : 'message:received';
|
|
|
|
|
const msgEventSource = getEventSource(upsert);
|
|
|
|
|
const msgEventSource = getUpsertSource(upsert);
|
|
|
|
|
const msgDirection = msg.key.fromMe ? 'outbound' : 'inbound';
|
|
|
|
|
const msgFrom = msg.key.fromMe ? whatsAppNo : remoteNo;
|
|
|
|
|
const msgTo = msg.key.fromMe ? remoteNo : whatsAppNo;
|
|
|
|
|
@ -236,6 +287,7 @@ const createWhatsApp = async phone => {
|
|
|
|
|
if (messageParser) {
|
|
|
|
|
const parsedMessage = await messageParser(msg);
|
|
|
|
|
const mergedMessage = Object.assign({}, standardMessage, parsedMessage);
|
|
|
|
|
console.info('mergedMessage: ', mergedMessage);
|
|
|
|
|
waEmitter.emit(emitEventName, mergedMessage);
|
|
|
|
|
} else {
|
|
|
|
|
console.info('不支持该消息类型:', msg);
|
|
|
|
|
@ -357,6 +409,7 @@ const createWhatsApp = async phone => {
|
|
|
|
|
// 第一次一分钟,后面是 20 秒更新一次
|
|
|
|
|
if (qrCode === null) {
|
|
|
|
|
qrCode = qr;
|
|
|
|
|
console.info('qrCode:', qrCode)
|
|
|
|
|
waEmitter.emit('creds:update', {
|
|
|
|
|
id: generateId(),
|
|
|
|
|
qr, whatsAppNo,
|
|
|
|
|
|