Skip to content

Commit ebf14eb

Browse files
committed
Add APP_WEBHOOK_FILES_BASE64 configuration option and convert media files to base64 before sending to webhook
1 parent 06da4be commit ebf14eb

File tree

2 files changed

+56
-9
lines changed

2 files changed

+56
-9
lines changed

.env.example

+1
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ AUTHENTICATION_GLOBAL_AUTH_TOKEN=A4gx18YGxKAvR01ClcHpcR7TjZUNtwvE
1414
# WEBHOOK CONFIGURATION
1515
APP_WEBHOOK_URL="https://webhook.site/dbf387ed-a861-4ae9-9b30-9344c972cb74"
1616
APP_WEBHOOK_ALLOWED_EVENTS=MESSAGES_UPSERT,MESSAGES_DELETE,MESSAGES_UPDATE
17+
APP_WEBHOOK_FILE_IN_BASE64=false

whatsapp.js

+55-9
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ const shouldReconnect = (sessionId) => {
5858
return false
5959
}
6060

61-
const callWebhook = (instance, eventType, eventData) => {
61+
const callWebhook = async (instance, eventType, eventData) => {
6262
if (APP_WEBHOOK_ALLOWED_EVENTS.includes('ALL') || APP_WEBHOOK_ALLOWED_EVENTS.includes(eventType)) {
63-
webhook(instance, eventType, eventData)
63+
await webhook(instance, eventType, eventData)
6464
}
6565
}
6666

@@ -170,14 +170,55 @@ const createSession = async (sessionId, res = null, options = { usePairingCode:
170170
return m.key.fromMe === false
171171
})
172172
if (messages.length > 0) {
173-
// Change status
174-
for (const message of messages) {
175-
if (message?.status) {
176-
m.status = WAMessageStatus[m?.status] ?? 'UNKNOWN'
177-
}
173+
const messageTmp = await Promise.all(
174+
messages.map(async (msg) => {
175+
try {
176+
const typeMessage = Object.keys(msg.message)[0]
177+
if (msg?.status) {
178+
msg.status = WAMessageStatus[msg?.status] ?? 'UNKNOWN'
179+
}
180+
181+
if (
182+
['documentMessage', 'imageMessage', 'videoMessage', 'audioMessage'].includes(typeMessage) &&
183+
process.env.APP_WEBHOOK_FILE_IN_BASE64 === 'true'
184+
) {
185+
const mediaMessage = await getMessageMedia(wa, msg)
186+
187+
const fieldsToConvert = [
188+
'fileEncSha256',
189+
'mediaKey',
190+
'fileSha256',
191+
'jpegThumbnail',
192+
'thumbnailSha256',
193+
'thumbnailEncSha256',
194+
'streamingSidecar',
195+
]
196+
197+
fieldsToConvert.forEach((field) => {
198+
if (msg.message[typeMessage]?.[field] !== undefined) {
199+
msg.message[typeMessage][field] = convertToBase64(msg.message[typeMessage][field])
200+
}
201+
})
202+
203+
return {
204+
...msg,
205+
message: {
206+
[typeMessage]: {
207+
...msg.message[typeMessage],
208+
fileBase64: mediaMessage.base64,
209+
},
210+
},
211+
}
212+
}
213+
214+
return msg
215+
} catch {
216+
return {}
217+
}
218+
}),
219+
)
178220

179-
callWebhook(sessionId, 'MESSAGES_UPSERT', message)
180-
}
221+
callWebhook(sessionId, 'MESSAGES_UPSERT', messageTmp)
181222
}
182223
})
183224

@@ -550,6 +591,11 @@ const getMessageMedia = async (session, message) => {
550591
}
551592
}
552593

594+
const convertToBase64 = (arrayBytes) => {
595+
const byteArray = new Uint8Array(arrayBytes)
596+
return Buffer.from(byteArray).toString('base64')
597+
}
598+
553599
const init = () => {
554600
readdir(sessionsDir(), (err, files) => {
555601
if (err) {

0 commit comments

Comments
 (0)