我花了几天时间试图弄清楚如何在 Python 中将图像发布到CloudApp,使用 Requests 来访问CloudApp 的 API。我可以使用使用Poster的pycloudapp来完成此操作,但我想了解如何使用 Requests。
我一直在尝试使用InspectB.in来比较我的脚本和 pycloudapp 发布的内容以尝试找出差异。似乎并不多,但显然存在的少数是重要的。使用我当前的代码,我得到一个服务器端错误 (500),这令人沮丧。因为基于海报的代码有效,我希望找到一种方法让请求也能正常工作,尽管我认为这可能不可行。
CloudApp 使用 Amazon Web Storage,我知道“文件”参数必须与 AWS 一起使用。到目前为止,我已经尝试了几种data = collections.OrderedDict(sorted(upload_values)); data['file'] = open(last_pic, 'rb')
不带files
参数使用的排列,而不是使用单独的data
和files
字典(如建议的这里。我已经files
使用和不带文件名的字典。
这是我的代码:
#!/usr/bin/env python
import requests
import os
last_pic = '/.../image.jpg'
USER = 'email@email.com'
PASS = 'mypass'
AUTH_URL = 'http://my.cl.ly'
API_URL = 'http://my.cl.ly/items/new'
s = requests.Session()
s.auth = requests.auth.HTTPDigestAuth(USER, PASS)
s.headers.update({'Accept': 'application/json'})
upload_request = s.get(API_URL)
upload_values = upload_request.json()['params']
filename = os.path.basename(last_pic)
upload_values['key'] = upload_values['key'].replace(r'${filename}', filename)
files = {'file': open(last_pic, 'rb')}
stuff = requests.post(upload_request.json()['url'], data=upload_values, files=files)
print(stuff.text)
根据 InspectB.in,工作(pycloudapp)帖子和我的帖子之间的唯一区别是:
pycloudapp 帖子正文中的每个参数都有Content-Type: text/plain; charset=utf-8
,但在我的代码中没有。例如:
--d5e0c013a6de4105b07ac844eea4da6e
Content-Disposition: form-data; name="acl"
Content-Type: text/plain; charset=utf-8
public-read
与我的:
--b1892e959d124887a61143dd2b468579
Content-Disposition: form-data; name="acl"
public-read
文件数据不同。
pycloud应用程序:
--d5e0c013a6de4105b07ac844eea4da6e
Content-Disposition: form-data; name="file"
Content-Type: text/plain; charset=utf-8
����JFIFHH���ICC_PROFILE�applmntrRGB XYZ �...
与我的:
--b1892e959d124887a61143dd2b468579
Content-Disposition: form-data; name="file"; filename="20130608-ScreenShot-180.jpg"
Content-Type: image/jpeg
����JFIFHH���ICC_PROFILE�applmntrRGB XYZ �...
标题基本相同,除了:
pycloud应用程序:
Accept: application/json
Accept-Encoding: identity
矿:
Accept: */*
Accept-Encoding: gzip, deflate, compress
具体来说,两者都成功注册为Content-Type: multipart/form-data
认为接受标头可能是重要的区别,我尝试添加headers = {'accept': 'application/json', 'content-type': 'multipart/form-data'}
(以及两个单独的),但没有运气。不幸的是,如果我修改标头,它会覆盖所有标头并丢失多部分编码。
我也想知道文件Content-Type: image/jpeg
在我的帖子Content-Type: text/plain; charset=utf-8
中还是在工作帖子中可能是问题所在。
为这么长的帖子道歉,这让我发疯了,感谢您提供的任何帮助。