DownloadAndSaveMedia

This commit is contained in:
Adhiraj
2020-07-22 12:29:52 +05:30
parent 25c1c61883
commit d8d7e7dff8
4 changed files with 37 additions and 19 deletions

View File

@@ -242,17 +242,19 @@ export enum Presence {
} }
``` ```
## Decoding Media ## Downloading Media
If you want to save & process some images, videos, documents or stickers you received If you want to save the media you received
``` ts ``` ts
import { MessageType } from '@adiwajshing/baileys' import { MessageType, extensionForMediaMessage } from '@adiwajshing/baileys'
client.setOnUnreadMessage (false, async m => { client.setOnUnreadMessage (false, async m => {
if (!m.message) return // if there is no text or media message if (!m.message) return // if there is no text or media message
const messageType = Object.keys (m.message)[0]// get what type of message it is -- text, image, video const messageType = Object.keys (m.message)[0]// get what type of message it is -- text, image, video
// if the message is not a text message // if the message is not a text message
if (messageType !== MessageType.text && messageType !== MessageType.extendedText) { if (messageType !== MessageType.text && messageType !== MessageType.extendedText) {
const savedFilename = await client.decodeMediaMessage(m.message, "filename") // extension applied automatically const buffer = await client.downloadMediaMessage(m) // to decrypt & use as a buffer
const savedFilename = await client.downloadAndSaveMediaMessage (m) // to decrypt & save to file
console.log(m.key.remoteJid + " sent media, saved at: " + savedFilename) console.log(m.key.remoteJid + " sent media, saved at: " + savedFilename)
} }
} }

View File

@@ -1,5 +1,6 @@
import WhatsAppWebGroups from './Groups' import WhatsAppWebGroups from './Groups'
import fetch from 'node-fetch' import fetch from 'node-fetch'
import { promises as fs } from 'fs'
import { import {
MessageOptions, MessageOptions,
MessageType, MessageType,
@@ -17,7 +18,7 @@ import {
} from './Constants' } from './Constants'
import { generateMessageID, sha256, hmacSign, aesEncrypWithIV, randomBytes } from '../WAConnection/Utils' import { generateMessageID, sha256, hmacSign, aesEncrypWithIV, randomBytes } from '../WAConnection/Utils'
import { WAMessageContent, WAMetric, WAFlag, WANode, WAMessage, WAMessageProto } from '../WAConnection/Constants' import { WAMessageContent, WAMetric, WAFlag, WANode, WAMessage, WAMessageProto } from '../WAConnection/Constants'
import { validateJIDForSending, generateThumbnail, getMediaKeys, decodeMediaMessageBuffer } from './Utils' import { validateJIDForSending, generateThumbnail, getMediaKeys, decodeMediaMessageBuffer, extensionForMediaMessage } from './Utils'
import { proto } from '../../WAMessage/WAMessage' import { proto } from '../../WAMessage/WAMessage'
export default class WhatsAppWebMessages extends WhatsAppWebGroups { export default class WhatsAppWebMessages extends WhatsAppWebGroups {
@@ -350,4 +351,18 @@ export default class WhatsAppWebMessages extends WhatsAppWebGroups {
throw error throw error
} }
} }
/**
* Securely downloads the media from the message and saves to a file.
* Renews the download url automatically, if necessary.
* @param message the media message you want to decode
* @param filename the name of the file where the media will be saved
* @param attachExtension should the parsed extension be applied automatically to the file
*/
async downloadAndSaveMediaMessage (message: WAMessage, filename: string, attachExtension: boolean=true) {
const buffer = await this.downloadMediaMessage (message)
const extension = extensionForMediaMessage (message.message)
const trueFileName = attachExtension ? (filename + '.' + extension) : filename
await fs.writeFile (trueFileName, buffer)
return trueFileName
}
} }

View File

@@ -52,8 +52,8 @@ WAClientTest('Messages', (client) => {
it('should send a gif', async () => { it('should send a gif', async () => {
const content = fs.readFileSync('./Media/ma_gif.mp4') const content = fs.readFileSync('./Media/ma_gif.mp4')
const message = await sendAndRetreiveMessage(client, content, MessageType.video, { mimetype: Mimetype.gif }) const message = await sendAndRetreiveMessage(client, content, MessageType.video, { mimetype: Mimetype.gif })
const buffer = await client.downloadMediaMessage(message)
fs.writeFileSync ('./Media/received_vid.mp4', buffer) await client.downloadAndSaveMediaMessage(message,'./Media/received_vid')
}) })
it('should send an image', async () => { it('should send an image', async () => {
const content = fs.readFileSync('./Media/meme.jpeg') const content = fs.readFileSync('./Media/meme.jpeg')

View File

@@ -165,18 +165,10 @@ export async function decodeMediaMessageBuffer(message: WAMessageContent) {
} }
throw new Error('Decryption failed, HMAC sign does not match') throw new Error('Decryption failed, HMAC sign does not match')
} }
/** export function extensionForMediaMessage(message: WAMessageContent) {
* Decode a media message (video, image, document, audio) & save it to the given file const getExtension = (mimetype: string) => mimetype.split(';')[0].split('/')[1]
* @param message the media message you want to decode
* @param filename the name of the file where the media will be saved
* @param attachExtension should the correct extension be applied automatically to the file
*/
export async function decodeMediaMessage(message: WAMessageContent, filename: string, attachExtension: boolean=true) {
const getExtension = (mimetype) => mimetype.split(';')[0].split('/')[1]
const buffer = await decodeMediaMessageBuffer (message)
const type = Object.keys(message)[0] as MessageType const type = Object.keys(message)[0] as MessageType
let extension let extension: string
if (type === MessageType.location || type === MessageType.liveLocation) { if (type === MessageType.location || type === MessageType.liveLocation) {
extension = '.jpeg' extension = '.jpeg'
} else { } else {
@@ -187,7 +179,16 @@ export async function decodeMediaMessage(message: WAMessageContent, filename: st
| proto.DocumentMessage | proto.DocumentMessage
extension = getExtension (messageContent.mimetype) extension = getExtension (messageContent.mimetype)
} }
return extension
}
/**
* Decode a media message (video, image, document, audio) & save it to the given file
* @deprecated use `client.downloadAndSaveMediaMessage`
*/
export async function decodeMediaMessage(message: WAMessageContent, filename: string, attachExtension: boolean=true) {
const buffer = await decodeMediaMessageBuffer (message)
const extension = extensionForMediaMessage (message)
const trueFileName = attachExtension ? (filename + '.' + extension) : filename const trueFileName = attachExtension ? (filename + '.' + extension) : filename
fs.writeFileSync(trueFileName, buffer) fs.writeFileSync(trueFileName, buffer)
return trueFileName return trueFileName