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
对,所以在你的答案中,你传递了一组一个元组,其中有两个项目,字符串 filedata
和 file object
.
{("filedata", open(imgName, 'rb'))} # Set of tuple
{"filedata": open(imgName, 'rb')} # dictionary
我想重现以下 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
对,所以在你的答案中,你传递了一组一个元组,其中有两个项目,字符串 filedata
和 file object
.
{("filedata", open(imgName, 'rb'))} # Set of tuple
{"filedata": open(imgName, 'rb')} # dictionary