我已经在网上广泛搜索了一个通过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)无法获取图片我也找不到解决方案。
有人可以指出我正确的方向为我提供一个当前有效的例子吗?非常感谢,谢谢!
答案 0 :(得分:3)
根据照片上传调用的方式,可能会导致324错误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 回答问题,但是,我是通过搜索发现的,希望我的解决方案能够帮助走在类似道路上的旅行者。
requests
和 tempfile
我如何使用 tempfile
和 requests
模块进行操作的快速示例。
下面的脚本应该从给定的 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