-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Upload and send Media
You can send Image, Video, Audio to your WhatsApp contacts (at the moment yowsup supports image only, rest are WIP). Here is how to do so:
- Request upload URL from WhatsApp
- Use MediaUploaded to upload data to this URL
- Send media to contact
First step is request a URL to upload the media to. To do so you need to send an Iq message to WhatsApp via RequestUploadIqProtocolEntity.
You need pass at least for its constructor the mediaType (image in this case), and filePath, and the rest of data will be detected. The response will be a ResultRequestUploadIqProtocolEntity (see here how to listen for the response) and then you can get the url from it and upload the media to that url.
Note that if it's a duplicate upload (same media to same contact), WhatsApp recognized it and informs us about it. Use resultRequestUploadIqProtocolEntity.isDuplicate() to determine that. In that case, you can skip step 2 (upload step) and jump to Sending the media to contact.
Once you have the url, you can use MediaUploader for uploading it asynchronously. You can specify success, error, progress callbacks.
After uploading the media, send it to contact via the associate DownloadableMediaProtocolEntity. In case of an image, it's ImageDownloadableMediaProtocolEntity.
Quick example:
class MyYowsupApp(YowInterfaceLayer):
def requestImageUpload(self, imagePath):
self.demoContactJid = "abc@s.whatsapp.net" #only for the sake of simplicity of example, shoudn't do this
self.filePath = imagePath #only for the sake of simplicity of example, shoudn't do this
requestUploadEntity = RequestUploadIqProtocolEntity("image", filePath = imagePath)
self._sendIq(requestUploadEntity, self.onRequestUploadResult, self.onRequestUploadError)
def onRequestUploadResult(self, resultRequestUploadIqProtocolEntity, requestUploadIqProtocolEntity):
mediaUploader = MediaUploader(self.demoContactJid, self.getOwnJid(), self.filePath,
resultRequestUploadIqProtocolEntity.getUrl(),
resultRequestUploadIqProtocolEntity.getResumeOffset(),
self.onUploadSuccess, self.onUploadError, self.onUploadProgress)
mediaUploader.start()
def onRequestUploadError(self, errorRequestUploadIqProtocolEntity, requestUploadIqProtocolEntity):
print("Error requesting upload url")
def onUploadSuccess(self, filePath, jid, url):
#convenience method to detect file/image attributes for sending, requires existence of 'pillow' library
entity = ImageDownloadableMediaMessageProtocolEntity.fromFilePath(filePath, url, None, to)
self.toLower(entity)
def onUploadError(self, filePath, jid, url):
print("Upload file failed!")
A full working example can be found in cli demo (image_send method)