From ee81620c148bef26baf0ed821fbe4e06c30a5d70 Mon Sep 17 00:00:00 2001 From: Tang Date: Tue, 3 Oct 2017 00:50:27 +0800 Subject: [PATCH 1/3] Add send GIF images support When uploading and sending GIF images, the keys are explicitly changed to "gif_id" or "gif_ids" rather than "image_id" or "image_ids". --- fbchat/client.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/fbchat/client.py b/fbchat/client.py index 778849a..24b4941 100644 --- a/fbchat/client.py +++ b/fbchat/client.py @@ -938,7 +938,7 @@ class Client(object): return self._doSendRequest(data) - def _uploadImage(self, image_path, data, mimetype): + def _uploadImage(self, image_path, data, mimetype, is_gif=False): """Upload an image and get the image_id for sending in a message""" j = self._postFile(self.req_url.UPLOAD, { @@ -949,9 +949,12 @@ class Client(object): ) }, fix_request=True, as_json=True) # Return the image_id - return j['payload']['metadata'][0]['image_id'] + if not is_gif: + return j['payload']['metadata'][0]['image_id'] + else: + return j['payload']['metadata'][0]['gif_id'] - def sendImage(self, image_id, message=None, thread_id=None, thread_type=ThreadType.USER): + def sendImage(self, image_id, message=None, thread_id=None, thread_type=ThreadType.USER, is_gif=False): """ Sends an already uploaded image to a thread. (Used by :func:`Client.sendRemoteImage` and :func:`Client.sendLocalImage`) @@ -972,11 +975,14 @@ class Client(object): data['specific_to_list[0]'] = 'fbid:' + str(thread_id) data['specific_to_list[1]'] = 'fbid:' + str(self.uid) - data['image_ids[0]'] = image_id + if not is_gif: + data['image_ids[0]'] = image_id + else: + data['gif_ids[0]'] = image_id return self._doSendRequest(data) - def sendRemoteImage(self, image_url, message=None, thread_id=None, thread_type=ThreadType.USER): + def sendRemoteImage(self, image_url, message=None, thread_id=None, thread_type=ThreadType.USER, is_gif=False): """ Sends an image from a URL to a thread @@ -991,10 +997,10 @@ class Client(object): thread_id, thread_type = self._getThread(thread_id, thread_type) mimetype = guess_type(image_url)[0] remote_image = requests.get(image_url).content - image_id = self._uploadImage(image_url, remote_image, mimetype) - return self.sendImage(image_id=image_id, message=message, thread_id=thread_id, thread_type=thread_type) + image_id = self._uploadImage(image_url, remote_image, mimetype, is_gif) + return self.sendImage(image_id=image_id, message=message, thread_id=thread_id, thread_type=thread_type, is_gif=is_gif) - def sendLocalImage(self, image_path, message=None, thread_id=None, thread_type=ThreadType.USER): + def sendLocalImage(self, image_path, message=None, thread_id=None, thread_type=ThreadType.USER, is_gif=False): """ Sends a local image to a thread @@ -1008,8 +1014,8 @@ class Client(object): """ thread_id, thread_type = self._getThread(thread_id, thread_type) mimetype = guess_type(image_path)[0] - image_id = self._uploadImage(image_path, open(image_path, 'rb'), mimetype) - return self.sendImage(image_id=image_id, message=message, thread_id=thread_id, thread_type=thread_type) + image_id = self._uploadImage(image_path, open(image_path, 'rb'), mimetype, is_gif) + return self.sendImage(image_id=image_id, message=message, thread_id=thread_id, thread_type=thread_type, is_gif=is_gif) def addUsersToGroup(self, user_ids, thread_id=None): """ From e0aedd617b75512304d59a07b42a713e3f7b24b9 Mon Sep 17 00:00:00 2001 From: Tang Date: Tue, 3 Oct 2017 01:30:03 +0800 Subject: [PATCH 2/3] add param is_gif to doc of functions --- fbchat/client.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fbchat/client.py b/fbchat/client.py index 24b4941..6040244 100644 --- a/fbchat/client.py +++ b/fbchat/client.py @@ -962,6 +962,7 @@ class Client(object): :param message: Additional message :param thread_id: User/Group ID to send to. See :ref:`intro_threads` :param thread_type: See :ref:`intro_threads` + :param is_gif: if sending GIF, True, else False :type thread_type: models.ThreadType :return: :ref:`Message ID ` of the sent image :raises: FBchatException if request failed @@ -990,6 +991,7 @@ class Client(object): :param message: Additional message :param thread_id: User/Group ID to send to. See :ref:`intro_threads` :param thread_type: See :ref:`intro_threads` + :param is_gif: if sending GIF, True, else False :type thread_type: models.ThreadType :return: :ref:`Message ID ` of the sent image :raises: FBchatException if request failed @@ -1008,6 +1010,7 @@ class Client(object): :param message: Additional message :param thread_id: User/Group ID to send to. See :ref:`intro_threads` :param thread_type: See :ref:`intro_threads` + :param is_gif: if sending GIF, True, else False :type thread_type: models.ThreadType :return: :ref:`Message ID ` of the sent image :raises: FBchatException if request failed From 707df4f941911f72ed396517acebe2c7b12172cf Mon Sep 17 00:00:00 2001 From: Tang Date: Tue, 3 Oct 2017 03:15:48 +0800 Subject: [PATCH 3/3] use mimetype to see if it's a GIF thanks to @madsmtm's good idea --- fbchat/client.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fbchat/client.py b/fbchat/client.py index 6040244..277fed9 100644 --- a/fbchat/client.py +++ b/fbchat/client.py @@ -938,7 +938,7 @@ class Client(object): return self._doSendRequest(data) - def _uploadImage(self, image_path, data, mimetype, is_gif=False): + def _uploadImage(self, image_path, data, mimetype): """Upload an image and get the image_id for sending in a message""" j = self._postFile(self.req_url.UPLOAD, { @@ -949,7 +949,7 @@ class Client(object): ) }, fix_request=True, as_json=True) # Return the image_id - if not is_gif: + if not mimetype == 'image/gif': return j['payload']['metadata'][0]['image_id'] else: return j['payload']['metadata'][0]['gif_id'] @@ -983,7 +983,7 @@ class Client(object): return self._doSendRequest(data) - def sendRemoteImage(self, image_url, message=None, thread_id=None, thread_type=ThreadType.USER, is_gif=False): + def sendRemoteImage(self, image_url, message=None, thread_id=None, thread_type=ThreadType.USER): """ Sends an image from a URL to a thread @@ -991,18 +991,18 @@ class Client(object): :param message: Additional message :param thread_id: User/Group ID to send to. See :ref:`intro_threads` :param thread_type: See :ref:`intro_threads` - :param is_gif: if sending GIF, True, else False :type thread_type: models.ThreadType :return: :ref:`Message ID ` of the sent image :raises: FBchatException if request failed """ thread_id, thread_type = self._getThread(thread_id, thread_type) mimetype = guess_type(image_url)[0] + is_gif = (mimetype == 'image/gif') remote_image = requests.get(image_url).content - image_id = self._uploadImage(image_url, remote_image, mimetype, is_gif) + image_id = self._uploadImage(image_url, remote_image, mimetype) return self.sendImage(image_id=image_id, message=message, thread_id=thread_id, thread_type=thread_type, is_gif=is_gif) - def sendLocalImage(self, image_path, message=None, thread_id=None, thread_type=ThreadType.USER, is_gif=False): + def sendLocalImage(self, image_path, message=None, thread_id=None, thread_type=ThreadType.USER): """ Sends a local image to a thread @@ -1010,14 +1010,14 @@ class Client(object): :param message: Additional message :param thread_id: User/Group ID to send to. See :ref:`intro_threads` :param thread_type: See :ref:`intro_threads` - :param is_gif: if sending GIF, True, else False :type thread_type: models.ThreadType :return: :ref:`Message ID ` of the sent image :raises: FBchatException if request failed """ thread_id, thread_type = self._getThread(thread_id, thread_type) mimetype = guess_type(image_path)[0] - image_id = self._uploadImage(image_path, open(image_path, 'rb'), mimetype, is_gif) + is_gif = (mimetype == 'image/gif') + image_id = self._uploadImage(image_path, open(image_path, 'rb'), mimetype) return self.sendImage(image_id=image_id, message=message, thread_id=thread_id, thread_type=thread_type, is_gif=is_gif) def addUsersToGroup(self, user_ids, thread_id=None):