def fromFilePath(fpath, url, mediaType, ip, to, mimeType = None, preview = None, filehash = None, filesize = None): mimeType = mimeType or MimeTools.getMIME(fpath) filehash = filehash or WATools.getFileHashForUpload(fpath) size = filesize or os.path.getsize(fpath) fileName = os.path.basename(fpath) return DownloadableMediaMessageProtocolEntity(mediaType, mimeType, filehash, url, ip, size, fileName, to = to, preview = preview)
def fromFilePath(fpath, url, mediaType, ip, to, mimeType = None, preview = None, filehash = None, filesize = None): mediaType = mediaType or MimeTools.getMIME(fpath) filehash = filehash or WATools.getFileHashForUpload2(fpath) size = filesize or os.path.getsize(fpath) fileName = os.path.basename(fpath) return DownloadableMediaMessageProtocolEntity(mediaType, mimeType, filehash, url, ip, size, fileName, to=to, preview= preview)
def fromBuilder(builder): url = builder.get("url") ip = builder.get("ip") assert url, "Url is required" mimeType = builder.get("mimetype", MimeTools.getMIME(builder.getOriginalFilepath())) filehash = WATools.getFileHashForUpload(builder.getFilepath()) size = os.path.getsize(builder.getFilepath()) fileName = os.path.basename(builder.getFilepath()) return DownloadableMediaMessageProtocolEntity(builder.mediaType, mimeType, filehash, url, ip, size, fileName, to = builder.jid, preview = builder.get("preview"))
def fromBuilder(builder): url = builder.get("url") ip = builder.get("ip") assert url, "Url is required" mimeType = builder.get("mimetype", MimeTools.getMIME(builder.getOriginalFilepath())) filehash = WATools.getFileHashForUpload2(builder.getFilepath()) size = os.path.getsize(builder.getFilepath()) fileName = os.path.basename(builder.getFilepath()) return DownloadableMediaMessageProtocolEntity(builder.mediaType, mimeType, filehash, url, ip, size, fileName, to = builder.jid, preview = builder.get("preview"))
def from_file( filepath, mimetype=None, file_length=None, file_sha256=None, url=None, media_key=None, context_info=None ): mimetype = MimeTools.getMIME(filepath) if mimetype is None else mimetype file_length = os.path.getsize(filepath) if file_length is None else file_length if file_sha256 is None: with open(filepath, 'rb') as f: file_sha256 = hashlib.sha256(f.read()).digest() return DownloadableMediaMessageAttributes( mimetype, file_length, file_sha256, url, media_key, context_info )
def run(self): sourcePath = self.sourcePath uploadUrl = self.uploadUrl _host = uploadUrl.replace("https://", "") self.url = _host[:_host.index('/')] try: filename = os.path.basename(sourcePath) filetype = MimeTools.getMIME(filename) filesize = os.path.getsize(sourcePath) self.sock.connect((self.url, self.port)) ssl_sock = ssl.wrap_socket(self.sock) m = hashlib.md5() m.update(filename.encode()) crypto = m.hexdigest() + os.path.splitext(filename)[1] boundary = "zzXXzzYYzzXXzzQQ" # "-------" + m.hexdigest() #"zzXXzzYYzzXXzzQQ" contentLength = 0 hBAOS = "--" + boundary + "\r\n" hBAOS += "Content-Disposition: form-data; name=\"to\"\r\n\r\n" hBAOS += self.jid + "\r\n" hBAOS += "--" + boundary + "\r\n" hBAOS += "Content-Disposition: form-data; name=\"from\"\r\n\r\n" hBAOS += self.accountJid.replace("@whatsapp.net", "") + "\r\n" hBAOS += "--" + boundary + "\r\n" hBAOS += "Content-Disposition: form-data; name=\"file\"; filename=\"" + crypto + "\"\r\n" hBAOS += "Content-Type: " + filetype + "\r\n\r\n" fBAOS = "\r\n--" + boundary + "--\r\n" contentLength += len(hBAOS) contentLength += len(fBAOS) contentLength += filesize POST = "POST %s\r\n" % uploadUrl POST += "Content-Type: multipart/form-data; boundary=" + boundary + "\r\n" POST += "Host: %s\r\n" % self.url POST += "User-Agent: %s\r\n" % self.getUserAgent() POST += "Content-Length: " + str(contentLength) + "\r\n\r\n" ssl_sock.write(bytearray(POST.encode())) ssl_sock.write(bytearray(hBAOS.encode())) totalsent = 0 buf = 1024 f = open(sourcePath, 'rb') stream = f.read() f.close() status = 0 lastEmit = 0 while totalsent < int(filesize): ssl_sock.write(stream[:buf]) status = totalsent * 100 / filesize if lastEmit != status and status != 100 and filesize > 12288: if self.progressCallback: self.progressCallback(self.sourcePath, self.jid, uploadUrl, int(status)) lastEmit = status stream = stream[buf:] totalsent = totalsent + buf ssl_sock.write(bytearray(fBAOS.encode())) sleep(1) data = ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) if self.progressCallback: self.progressCallback(self.sourcePath, self.jid, uploadUrl, 100) lines = data.decode().splitlines() result = None for l in lines: if l.startswith("{"): result = self.parser.parse(l, self.pvars) break if not result: raise Exception("json data not found") if result["url"] is not None: if self.successCallback: self.successCallback(sourcePath, self.jid, result["url"]) else: logger.exception( "uploadUrl: %s, result of uploading media has no url" % uploadUrl) if self.errorCallback: self.errorCallback(sourcePath, self.jid, uploadUrl) except: logger.exception("Error occured at transfer %s" % sys.exc_info()[1]) if self.errorCallback: self.errorCallback(sourcePath, self.jid, uploadUrl)
def run(self): sourcePath = self.sourcePath uploadUrl = self.uploadUrl try: filename = os.path.basename(sourcePath) filetype = MimeTools.getMIME(filename) f = open(sourcePath, 'rb') stream = f.read() f.close() refkey = binascii.hexlify(os.urandom(32)) stream = self.encryptMedia(stream, refkey, filetype) fenc = open(sourcePath + ".enc", 'wb') fenc.write(stream) fenc.seek(0, 2) filesize = fenc.tell() fenc.close() os.remove(sourcePath + ".enc") filesize2 = len(stream) sha1 = hashlib.sha256() sha1.update(stream) b64Hash = base64.b64encode(sha1.digest()) file_enc_sha256 = hashlib.sha256(stream).hexdigest() #self.sock.connect((self.url, self.port)) #ssl_sock = ssl.wrap_socket(self.sock) m = hashlib.md5() m.update(filename.encode()) crypto = m.hexdigest() + os.path.splitext(filename)[1] digTo = hmac.new( "".encode("utf-8"), self.jid.replace("@s.whatsapp.net", "@c.us").encode("utf-8"), hashlib.sha256).digest()[:20] refTo = base64.b64encode(digTo).decode() digFrom = hmac.new( "".encode("utf-8"), self.accountJid.replace("@s.whatsapp.net", "@c.us").encode("utf-8"), hashlib.sha256).digest()[:20] refFrom = base64.b64encode(digFrom).decode() hBAOS = "------zzXXzzYYzzXXzzQQ\r\n" hBAOS += "Content-Disposition: form-data; name=\"hash\"\r\n\r\n" hBAOS += b64Hash.decode() + "\r\n" hBAOS += "------zzXXzzYYzzXXzzQQ\r\n" hBAOS += "Content-Disposition: form-data; name=\"refs\"\r\n\r\n" hBAOS += refTo + "\r\n" hBAOS += refFrom + "\r\n" hBAOS += "------zzXXzzYYzzXXzzQQ\r\n" hBAOS += "Content-Disposition: form-data; name=\"file\"; filename=\"" + "blob" + "\"\r\n" hBAOS += "Content-Type: " + "application/octet-stream" + "\r\n\r\n" fBAOS = "\r\n------zzXXzzYYzzXXzzQQ--" contentLength = len(hBAOS) + len(fBAOS) + len(stream) headers = { "content-length": str(contentLength), "user-agent": self.getUserAgent(), "content-type": "multipart/form-data; boundary=----zzXXzzYYzzXXzzQQ" } data = bytearray(hBAOS, 'utf-8') + stream + bytearray( fBAOS, 'utf-8') response = requests.post(uploadUrl, data=data, headers=headers) #lines = data.decode().splitlines() result = None if response.text.startswith("{"): result = self.parser.parse(response.text, self.pvars) if not result: raise Exception("json data not found") if result["url"] is not None: if self.successCallback: # self.successCallback(sourcePath, self.jid, result["url"]) result["mediaKey"] = refkey result["file_enc_sha256"] = file_enc_sha256 self.successCallback(sourcePath, self.jid, result) else: logger.exception( "uploadUrl: %s, result of uploading media has no url" % uploadUrl) if self.errorCallback: self.errorCallback(sourcePath, self.jid, uploadUrl) except: logger.exception("Error occured at transfer %s" % sys.exc_info()[1]) if self.errorCallback: self.errorCallback(sourcePath, self.jid, uploadUrl)
def run(self): sourcePath = self.sourcePath uploadUrl = self.uploadUrl _host = uploadUrl.replace("https://", "") self.url = _host[:_host.index('/')] try: filename = os.path.basename(sourcePath) filetype = MimeTools.getMIME(filename) f = open(sourcePath, 'rb') stream = f.read() f.close() refkey = binascii.hexlify(os.urandom(32)) stream = self.encryptMedia(stream, refkey, filetype) fenc = open(sourcePath + ".enc", 'wb') # bahtiar fenc.write(stream) fenc.seek(0, 2) filesize = fenc.tell() fenc.close() os.remove(sourcePath + ".enc") filesize2 = len(stream) sha1 = hashlib.sha256() sha1.update(stream) b64Hash = base64.b64encode(sha1.digest()) file_enc_sha256 = hashlib.sha256(stream).hexdigest() self.sock.connect((self.url, self.port)) ssl_sock = ssl.wrap_socket(self.sock) m = hashlib.md5() m.update(filename.encode()) crypto = m.hexdigest() + os.path.splitext(filename)[1] boundary = "zzXXzzYYzzXXzzQQ" #"-------" + m.hexdigest() #"zzXXzzYYzzXXzzQQ" contentLength = 0 digTo = hmac.new( "".encode("utf-8"), self.jid.replace("@s.whatsapp.net", "@c.us").encode("utf-8"), hashlib.sha256).digest()[:20] refTo = base64.b64encode(digTo).decode() digFrom = hmac.new( "".encode("utf-8"), self.accountJid.replace("@s.whatsapp.net", "@c.us").encode("utf-8"), hashlib.sha256).digest()[:20] refFrom = base64.b64encode(digFrom).decode() hBAOS = "--" + boundary + "\r\n" hBAOS += "Content-Disposition: form-data; name=\"hash\"\r\n\r\n" hBAOS += b64Hash.decode() + "\r\n" hBAOS += "--" + boundary + "\r\n" hBAOS += "Content-Disposition: form-data; name=\"refs\"\r\n\r\n" hBAOS += refFrom + "\r\n" hBAOS += refTo + "\r\n" hBAOS += "--" + boundary + "\r\n" hBAOS += "Content-Disposition: form-data; name=\"file\"; filename=\"" + "blob" + "\"\r\n" hBAOS += "Content-Type: " + "application/octet-stream" + "\r\n\r\n" fBAOS = "\r\n--" + boundary + "--\r\n" contentLength += len(hBAOS) contentLength += len(fBAOS) contentLength += filesize POST = "POST %s\r\n" % uploadUrl POST += "Content-Type: multipart/form-data; boundary=" + boundary + "\r\n" POST += "Host: %s\r\n" % self.url POST += "User-Agent: %s\r\n" % self.getUserAgent() POST += "Content-Length: " + str(contentLength) + "\r\n\r\n" ssl_sock.write(bytearray(POST.encode())) ssl_sock.write(bytearray(hBAOS.encode())) totalsent = 0 buf = 1024 status = 0 lastEmit = 0 while totalsent < int(filesize): ssl_sock.write(stream[:buf]) status = totalsent * 100 / filesize if lastEmit != status and status != 100 and filesize > 12288: if self.progressCallback: self.progressCallback(self.sourcePath, self.jid, uploadUrl, int(status)) lastEmit = status stream = stream[buf:] totalsent = totalsent + buf ssl_sock.write(bytearray(fBAOS.encode())) sleep(1) data = ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) if self.progressCallback: self.progressCallback(self.sourcePath, self.jid, uploadUrl, 100) lines = data.decode().splitlines() result = None for l in lines: if l.startswith("{"): result = self.parser.parse(l, self.pvars) break if not result: raise Exception("json data not found") if result["url"] is not None: if self.successCallback: # self.successCallback(sourcePath, self.jid, result["url"]) result["mediaKey"] = refkey result["file_enc_sha256"] = file_enc_sha256 self.successCallback(sourcePath, self.jid, result) else: logger.exception( "uploadUrl: %s, result of uploading media has no url" % uploadUrl) if self.errorCallback: self.errorCallback(sourcePath, self.jid, uploadUrl) except: logger.exception("Error occured at transfer %s" % sys.exc_info()[1]) if self.errorCallback: self.errorCallback(sourcePath, self.jid, uploadUrl)
def run(self): sourcePath = self.sourcePath uploadUrl = self.uploadUrl _host = uploadUrl.replace("https://","") self.url = _host[:_host.index('/')] try: filename = os.path.basename(sourcePath) filetype = MimeTools.getMIME(filename) filesize = os.path.getsize(sourcePath) self.sock.connect((self.url, self.port)) ssl_sock = ssl.wrap_socket(self.sock) m = hashlib.md5() m.update(filename.encode()) crypto = m.hexdigest() + os.path.splitext(filename)[1] boundary = "zzXXzzYYzzXXzzQQ"#"-------" + m.hexdigest() #"zzXXzzYYzzXXzzQQ" contentLength = 0 hBAOS = "--" + boundary + "\r\n" hBAOS += "Content-Disposition: form-data; name=\"to\"\r\n\r\n" hBAOS += self.jid + "\r\n" hBAOS += "--" + boundary + "\r\n" hBAOS += "Content-Disposition: form-data; name=\"from\"\r\n\r\n" hBAOS += self.accountJid.replace("@whatsapp.net","") + "\r\n" hBAOS += "--" + boundary + "\r\n" hBAOS += "Content-Disposition: form-data; name=\"file\"; filename=\"" + crypto + "\"\r\n" hBAOS += "Content-Type: " + filetype + "\r\n\r\n" fBAOS = "\r\n--" + boundary + "--\r\n" contentLength += len(hBAOS) contentLength += len(fBAOS) contentLength += filesize POST = "POST %s\r\n" % uploadUrl POST += "Content-Type: multipart/form-data; boundary=" + boundary + "\r\n" POST += "Host: %s\r\n" % self.url POST += "User-Agent: %s\r\n" % self.getUserAgent() POST += "Content-Length: " + str(contentLength) + "\r\n\r\n" ssl_sock.write(bytearray(POST.encode())) ssl_sock.write(bytearray(hBAOS.encode())) totalsent = 0 buf = 1024 f = open(sourcePath, 'rb') stream = f.read() f.close() status = 0 lastEmit = 0 while totalsent < int(filesize): ssl_sock.write(stream[:buf]) status = totalsent * 100 / filesize if lastEmit!=status and status!=100 and filesize>12288: if self.progressCallback: self.progressCallback(self.sourcePath, self.jids, uploadUrl, int(status)) lastEmit = status stream = stream[buf:] totalsent = totalsent + buf ssl_sock.write(bytearray(fBAOS.encode())) sleep(1) data = ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) data += ssl_sock.recv(8192) if self.progressCallback: self.progressCallback(self.sourcePath, self.jids, uploadUrl, 100) lines = data.decode().splitlines() result = None for l in lines: if l.startswith("{"): result = self.parser.parse(l, self.pvars) break if not result: raise Exception("json data not found") if result["url"] is not None: if self.successCallback: self.successCallback(sourcePath, self.jids, result["url"]) else: logger.exception("uploadUrl: %s, result of uploading media has no url" % uploadUrl) if self.errorCallback: self.errorCallback(sourcePath, self.jids, uploadUrl) except: logger.exception("Error occured at transfer %s"%sys.exc_info()[1]) if self.errorCallback: self.errorCallback(sourcePath, self.jids, uploadUrl)