Python: curl -F 等同于 Requests 或其他

Python: curl -F equivalent with Requests or other

我想重现以下 curl -F 请求 (from the Messenger API) 以将图像文件和参数发送到 Messenger 的发送 API:

curl  \
-F recipient='{"id":"USER_ID"}' \
-F message='{"attachment":{"type":"image", "payload":{}}}' \
-F filedata=@/tmp/shirt.png \
"https://graph.facebook.com/v2.6/me/messages?access_token=PAGE_ACCESS_TOKEN"

我正在使用 Requests,我尝试了很多很多东西(包括使用正确的收件人 ID 等。例如:

recipient = '{"id":"USER_ID"}'
message = '{"attachment":{"type":"image", "payload":{}}}'
files = [("recipient", recipient), ("message", message), ("filedata", open(imagePath, 'rb'))]
r = requests.post('https://graph.facebook.com/v2.6/me/messages?access_token=ACCESS_TOKEN', files=files)

我也试过:

files = {"recipient" : recipient, "message" : message, "filedata" : open(imagePath, "rb")}

我几乎总是从 Messenger 收到此响应错误:

'{"error":{"message":"(#100) param recipient must be non-empty.","type":"OAuthException","code":100,"fbtrace_id":"xxxxx"}}'

我在这里不知所措。我可能以某种方式滥用了 Requests 语法,或者向 API 发送了格式不正确的字符串,但我已经阅读了 Requests 文档并浏览了 Whosebug 对此提出的问题,但无法解决我的问题。谢谢。

这是正确的格式:

imgName = "tmp/graph.png"
files = { "filedata" : ('filename.png', open(imagePath, 'rb'), 'image/png')}   
data = {
    "recipient":'{"id":"' + id + '"}',
    "message":'{"attachment":{"type":"image", "payload":{}}}'
    }

r = requests.post('https://graph.facebook.com/v2.6/me/messages?access_token=' + ACCESS_TOKEN, files=files, data=data)

我认为问题是您试图在请求文件 kwarg 中发送表单数据,而它应该在数据中:

data = {
    'recipient': '{"id":"USER_ID"}',
    'message': '{"attachment":{"type":"image", "payload":{}}}'
}
files = {
    "filedata": open(imagePath, 'rb')
}
r = requests.post('https://graph.facebook.com/v2.6/me/messages?access_token=ACCESS_TOKEN', data=data, files=files)

一个假设是 imagePath 存在。

也在 python {} 中表示 Set 如果其中没有 key:value 对,所以在你的答案中,你传递了一组一个元组,其中有两个项目,字符串 filedatafile object.

{("filedata", open(imgName, 'rb'))} # Set of tuple
{"filedata": open(imgName, 'rb')}   # dictionary