使用Python API将图像上传到Facebook

时间:2015-12-21 10:53:49

标签: python facebook facebook-graph-api upload photo

我已经在网上广泛搜索了一个通过Python API(Python for Facebook)将照片上传到Facebook的实际例子。这样的问题之前已经在stackoverflow上被问过了,但是我已经找到工作的答案了。

我的工作是:

import facebook as fb

cfg = {
    "page_id"      : "my_page_id",
    "access_token" : "my_access_token"
    }

api = get_api(cfg)
msg = "Hello world!"
status = api.put_wall_post(msg) 

我已经将 get_api(cfg)函数定义为

graph = fb.GraphAPI(cfg['access_token'], version='2.2')

# Get page token to post as the page. You can skip
# the following if you want to post as yourself.
resp = graph.get_object('me/accounts')
page_access_token = None
for page in resp['data']:
    if page['id'] == cfg['page_id']:
        page_access_token = page['access_token']
graph = fb.GraphAPI(page_access_token)
return graph

这确实会将消息发布到我的页面。 但是,如果我想要上传图像,一切都会出错。

# Upload a profile photo for a Page.
api.put_photo(image=open("path_to/my_image.jpg",'rb').read(), message='Here's my image')

我得到了可怕的 GraphAPIError:(#324)需要上传文件,stackoverflow上的非解决方案都适用于我。 如果我改为发出以下命令

api.put_photo(image=open("path_to/my_image.jpg",'rb').read(), album_path=cfg['page_id'] + "/picture")

我得到 GraphAPIError :(#1)无法获取图片我也找不到解决方案。

有人可以指出我正确的方向为我提供一个当前有效的例子吗?非常感谢,谢谢!

2 个答案:

答案 0 :(得分:3)

根据照片上传调用的方式,可能会导致324错误Facebook错误

  • 缺少图片
  • Facebook无法识别的图片
  • 错误的目录路径引用

原始cURL调用看起来像

curl -F 'source=@my_image.jpg' 'https://graph.facebook.com/me/photos?access_token=YOUR_TOKEN'

只要上述调用有效,您就可以确定照片与Facebook服务器一致。

324错误如何发生的一个例子

touch meow.jpg

curl -F 'source=@meow.jpg' 'https://graph.facebook.com/me/photos?access_token=YOUR_TOKEN'

如您所见,损坏的图像文件也会发生这种情况。

使用.read()将转储实际数据

空文件

>>> image=open("meow.jpg",'rb').read()
>>> image
''

图像文件

>>> image=open("how.png",'rb').read()
>>> image
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00...

这两个都不适用于你所看到的电话api.put_photo,Klaus D.提到电话应该没有read()

所以这个电话

api.put_photo(image=open("path_to/my_image.jpg",'rb').read(), message='Here's my image')

实际上变成了

api.put_photo('\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00...', message='Here's my image')

这只是一个字符串,不是想要的东西。

需要图片参考<open file 'how.png', mode 'rb' at 0x1085b2390>

答案 1 :(得分:0)

我知道这是旧的,并且没有用指定的 API 回答问题,但是,我是通过搜索发现的,希望我的解决方案能够帮助走在类似道路上的旅行者。

使用 requeststempfile

我如何使用 tempfilerequests 模块进行操作的快速示例。

下载图片并上传到 Facebook

下面的脚本应该从给定的 url 中获取图像,将其保存到临时目录中的文件中,并在完成后自动清理。

<块引用>

此外,我可以确认这在 Google Cloud Run 上的 Flask 服务上运行有效。这是容器运行时契约附带的,以便我们可以将文件存储在内存中

import tempfile
import requests

# setup stuff - certainly change this
filename = "your-desired-filename"           
filepath = f"{directory}/{filename}"
image_url = "your-image-url"
act_id = "your account id"
access_token = "your access token"

# create the temporary directory
temp_dir = tempfile.TemporaryDirectory()
directory = temp_dir.name

# stream the image bytes
res = requests.get(image_url, stream=True)
# write them to your filename at your temporary directory 
# assuming this works
# add logic for non 200 status codes
with open(filepath, "wb+") as f:
        f.write(res.content)

# prep the payload for the facebook call           
files = {
    "filename": open(filepath, "rb"),
}
url = f"https://graph.facebook.com/v10.0/{act_id}/adimages?access_token={access_token}"
# send the POST request
res = requests.post(url, files=files)
res.raise_for_status()
if res.status_code == 200:
    # get your image data back
    image_upload_data = res.json()
    temp_dir.cleanup()
    if "images" in image_upload_data:
        return image_upload_data["images"][filepath.split("/")[-1]]
    return image_upload_data
temp_dir.cleanup() # paranoid: just in case an error isn't raised