changeset 73:63bb8d716204

Fix upload of attached photos to Facebook Pages posts
author Ludovic Chabant <ludovic@chabant.com>
date Fri, 02 Feb 2024 21:08:10 -0800
parents 58348b2e6085
children 08ee3ffbe508
files silorider/silos/facebook.py
diffstat 1 files changed, 12 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/silorider/silos/facebook.py	Fri Feb 02 21:07:10 2024 -0800
+++ b/silorider/silos/facebook.py	Fri Feb 02 21:08:10 2024 -0800
@@ -1,3 +1,4 @@
+import json
 import logging
 import requests
 import pyfacebook
@@ -142,12 +143,12 @@
                 profile_url_handlers=ctx.profile_url_handlers)
 
     def mediaCallback(self, tmpfile, mt, url, desc):
-        resp = self.client.post_object(
-            object_id=self.page_id,
-            connection='photos',
-            data={
-                'url': url, 'caption': desc,
-                'published': False, 'temporary': True})
+        with open(tmpfile, 'rb') as fp:
+            resp = self.client.post_object(
+                object_id=self.page_id,
+                connection='photos',
+                files={tmpfile: fp},
+                data={'caption': desc, 'published': False})
         logger.debug("Uploaded photo '%s' as object: %s" % (url, resp))
         return resp['id']
 
@@ -157,7 +158,10 @@
             attached_media = []
             for media_id in media_ids:
                 attached_media.append({"media_fbid": media_id})
-            data['attached_media'] = attached_media
+            # Very bad: it looks like pyfacebook doesn't deep-JSONify
+            # things inside the data dictionary. So facebook returns
+            # an error code if we don't JSONify this array ourselves.
+            data['attached_media'] = json.dumps(attached_media)
 
         logger.debug("Posting Facebook update: %s" % entry_card.text)
         logger.debug("Using data: %s" % data)
@@ -165,6 +169,6 @@
         resp = self.client.post_object(
             object_id=self.page_id,
             connection='feed',
-            data={'message': entry_card.text})
+            data=data)
         logger.debug("Posted as object: %s" % resp)