Skip to content

Commit d8d9dce

Browse files
Added Generic Media Decoder
sigalor#133 self.decodeMedia(mediaMessage=processedData[2][0]['message']) media decoder can be called here if message is media
1 parent 12f23d1 commit d8d9dce

1 file changed

Lines changed: 33 additions & 2 deletions

File tree

backend/whatsapp.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
import hashlib;
2121
import hmac;
2222
import traceback;
23-
23+
import urllib2;
24+
import mimetypes;
2425
import websocket;
2526
import curve25519;
2627
import pyqrcode;
@@ -82,6 +83,7 @@ class WhatsAppWebClient:
8283
onMessageCallback = None;
8384
onCloseCallback = None;
8485
activeWs = None;
86+
location = r'''/usr/src/app/media/'''; ## Change Location of media as per requirement
8587
messageSentCount = 0;
8688
websocketThread = None;
8789
messageQueue = {}; # maps message tags (provided by WhatsApp) to more information (description and callback)
@@ -111,7 +113,35 @@ def __init__(self, onOpenCallback, onMessageCallback, onCloseCallback):
111113
websocket.enableTrace(True);
112114
self.connect();
113115

114-
116+
def decodeMedia(self, mediaMessage):
117+
info = media = ''
118+
if 'imageMessage' in mediaMessage:
119+
media = mediaMessage.get('imageMessage')
120+
info = 'Image'
121+
elif 'videoMessage' in mediaMessage:
122+
media = mediaMessage.get('videoMessage')
123+
info = 'Video'
124+
elif 'audioMessage' in mediaMessage:
125+
media = mediaMessage.get('audioMessage')
126+
info = 'Audio'
127+
elif 'documentMessage' in mediaMessage:
128+
media = mediaMessage.get('documentMessage')
129+
info = 'Document'
130+
extension = mimetypes.guess_extension(type=media.get('mimetype'))
131+
if extension is None or extension is '':
132+
extension = '.ogg'
133+
mediaData = urllib2.urlopen(media['url']).read()
134+
mediaKeyExpanded = HKDF(base64.b64decode(media['mediaKey']), 112, "WhatsApp " + info + " Keys")
135+
file = mediaData[:-10]
136+
iv = mediaKeyExpanded[:16]
137+
cipherKey = mediaKeyExpanded[16:48]
138+
decryptor = AES.new(cipherKey, AES.MODE_CBC, iv)
139+
data = AESUnpad(decryptor.decrypt(file))
140+
141+
location = self.location + str(getTimestampMs()) + extension
142+
with open(location, 'wb') as f:
143+
f.write(data)
144+
return location
115145

116146
def onOpen(self, ws):
117147
try:
@@ -170,6 +200,7 @@ def onMessage(self, ws, message):
170200
try:
171201
processedData = whatsappReadBinary(decryptedMessage, True);
172202
messageType = "binary";
203+
##self.decodeMedia(mediaMessage=processedData[2][0]['message']) media decoder can be called here if message is media
173204
except:
174205
processedData = { "traceback": traceback.format_exc().splitlines() };
175206
messageType = "error";

0 commit comments

Comments
 (0)