|
20 | 20 | import hashlib; |
21 | 21 | import hmac; |
22 | 22 | import traceback; |
23 | | - |
| 23 | +import urllib2; |
| 24 | +import mimetypes; |
24 | 25 | import websocket; |
25 | 26 | import curve25519; |
26 | 27 | import pyqrcode; |
@@ -82,6 +83,7 @@ class WhatsAppWebClient: |
82 | 83 | onMessageCallback = None; |
83 | 84 | onCloseCallback = None; |
84 | 85 | activeWs = None; |
| 86 | + location = r'''/usr/src/app/media/'''; ## Change Location of media as per requirement |
85 | 87 | messageSentCount = 0; |
86 | 88 | websocketThread = None; |
87 | 89 | messageQueue = {}; # maps message tags (provided by WhatsApp) to more information (description and callback) |
@@ -111,7 +113,35 @@ def __init__(self, onOpenCallback, onMessageCallback, onCloseCallback): |
111 | 113 | websocket.enableTrace(True); |
112 | 114 | self.connect(); |
113 | 115 |
|
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 |
115 | 145 |
|
116 | 146 | def onOpen(self, ws): |
117 | 147 | try: |
@@ -170,6 +200,7 @@ def onMessage(self, ws, message): |
170 | 200 | try: |
171 | 201 | processedData = whatsappReadBinary(decryptedMessage, True); |
172 | 202 | messageType = "binary"; |
| 203 | + ##self.decodeMedia(mediaMessage=processedData[2][0]['message']) media decoder can be called here if message is media |
173 | 204 | except: |
174 | 205 | processedData = { "traceback": traceback.format_exc().splitlines() }; |
175 | 206 | messageType = "error"; |
|
0 commit comments