Как добавить изображение к существующему сообщению в Facebook с помощью API и python?

#python #facebook-graph-api

#python #facebook-graph-api

Вопрос:

Я использую facebook graph API для обновления / редактирования текста определенного сообщения на моей странице

 import facebook

page_token = '...'
fb = facebook.GraphAPI(access_token = page_token, version="2.12")
page_id = '...'
post_id = '...'
fb.put_object(parent_object = page_id   '_'   post_id,
              connection_name = '',
              message = 'new text')
 

теперь я пытаюсь добавить локальное изображение (хранящееся в той же папке скрипта python) к этому сообщению, но я не понимаю, как правильно это сделать, я пытался

 fb.put_object(parent_object=page_id '_' post_id, connection_name='', message='new text', source = open('out.png', 'rb'))
 

и

 fb.put_object(parent_object=page_id '_' post_id, connection_name='', message='new text', object_attachment = open('out.png', 'rb'))
 

но ни один из них не работает. Подсказки?

ps. это разрешение моего приложения

 pages_show_list
pages_read_engagement
pages_read_user_content
pages_manage_posts
pages_manage_engagement
 

РЕДАКТИРОВАТЬ: я пробовал использовать функцию put_photo , но она создает новое сообщение, добавляя к нему изображение, в то время как мне нужно добавить изображение к уже существующему сообщению

Комментарии:

1. новости: я пытался использовать функцию put_photo , но она создает новое сообщение, добавляя к нему изображение, в то время как мне нужно добавить изображение к уже существующему сообщению

Ответ №1:

https://developers.facebook.com/docs/graph-api/reference/page/photos/
https://developers.facebook.com/docs/graph-api/reference/photo/

В документации указано, что вы не можете выполнять обновления.

Вот скриншот того же

Комментарии:

1. Это странно, я только что попробовал, и мне удалось удалить изображение. Вот что я сделал: я вручную создал сообщение и добавил два изображения, затем я получил идентификатор одного из двух изображений и запустил код graph.delete_object(id=image_id) , а затем изображение было удалено.

2. Пожалуйста, обратитесь по этой ссылке developers.facebook.com/docs/graph-api/reference/photo

Ответ №2:

Я создал полный сценарий selenium на python, который может выполнять ту же задачу :

 from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time
import pyautogui as pag
option = Options()

option.add_argument("--disable-infobars")
option.add_argument("start-maximized")
option.add_argument("--disable-extensions")

# Pass the argument 1 to allow and 2 to block
option.add_experimental_option("prefs", { 
    "profile.default_content_setting_values.notifications": 1 
})

#########CHANGE################
EMAIL_ADDRESS="" # Email Address of your facebook account
PASSWORD="" # Password of your facebook account
POST_URL="" # URL of your post ex:- https://www.facebook.com/USERNAME/posts/ID
IMG_PATH="C:\...\test.jpg" # complete path of image
re_edit=True # set True when you already edited the post otherwise set it to False if you are editing the post for the first time
##########CHANGE###############

re_edit_val="/html/body/div[1]/div/div[1]/div[1]/div[3]/div/div/div[2]/div/div/div[1]/div[1]/div/div/div[1]/div/div[1]/div/div[2]"
re_edit_val2="/html/body/div[1]/div/div[1]/div[1]/div[4]/div/div/div[1]/div/div[2]/div/div/div/form/div/div[1]/div/div/div[3]/div[1]/div[2]/div/div[1]/span/div/div/div/div/div[1]"

driver = webdriver.Chrome(options=option, executable_path='chromedriver.exe')
driver.set_window_position(-10000,0) # hiding the windows
print("Accessing facebook.com")
driver.get("https://www.facebook.com/")
print("checking credentials")
driver.find_element_by_xpath("//input[@id='email']").send_keys(EMAIL_ADDRESS)
driver.find_element_by_xpath("//input[@id='pass']").send_keys(PASSWORD)
driver.find_element_by_xpath("//input[@id='pass']").send_keys(Keys.RETURN)
print("credentials checked successfully")
time.sleep(1)
print("Accessing the URL of the post")
driver.get(POST_URL)
time.sleep(0.5)
print("getting the edit access from facebook.com")
driver.find_element_by_xpath("/html/body/div[1]/div/div[1]/div[1]/div[3]/div/div/div[1]/div[1]/div/div/div/div/div/div/div/div/div/div/div/div/div/div[2]/div/div[2]/div/div[3]/div").click()  # clicking three dots
time.sleep(3)
if re_edit:
     re_edit_val="/html/body/div[1]/div/div[1]/div[1]/div[3]/div/div/div[2]/div/div/div[1]/div[1]/div/div/div[1]/div/div[1]/div/div[3]"
     re_edit_val2="/html/body/div[1]/div/div[1]/div[1]/div[4]/div/div/div[1]/div/div[2]/div/div/div/form/div/div[1]/div/div/div[3]/div[1]/div[2]/div/div[1]/div/span/div/div/div/div/div[1]"
     
driver.find_element_by_xpath(re_edit_val).click() # clicking the edit post
time.sleep(3)
print("Uploading the given image...")
driver.find_element_by_xpath(re_edit_val2).click() # clicking Image upload
time.sleep(0.5)
pag.write(IMG_PATH) # uploading file path
pag.press('enter')
time.sleep(1.5)
print("Finishing up...")
driver.find_elements_by_xpath("/html/body/div[1]/div/div[1]/div[1]/div[4]/div/div/div[1]/div/div[2]/div/div/div/form/div/div[1]/div/div/div[3]/div[2]/div")[0].click() # clicking save button
print("Photo uploaded")
 

Все, что вам нужно сделать, это изменить переменные, указанные выше
Примечание: — Он работает с 9 декабря 2020 года

Комментарии:

1. Спасибо! я также сделал это с помощью selenium, но мне пришлось прекратить его использование, потому что иногда окно зависает и блокирует скрипт, поэтому я ищу способ выполнить работу с помощью API, извините, что не так ясно в вопросе

2. @soundwave Вероятно, вам следует проверить, какая часть скрипта вызывает замораживание окна. Кроме того, для этой цели нет API, поэтому будет полезно использовать selenium. Если вы хотите использовать API, просто разверните мой код на платформе Heroku и вызовите запрос API.