我正在尝试使用Pushbullet在API docs之后发送文件。 这是我的功能:
def push_file(AccessToken, file_name):
f = open(file_name, 'rb')
file_type = mimetypes.guess_type(file_name)[0]
print("Uploading {0}...".format(file_name))
try:
data = {
'file_name': file_name,
'file_type' : file_type
}
resp = requests.post(UPLOAD_REQUEST_URL, data=data, auth=(AccessToken, '')).json()
if resp.get('error') != None:
print("Error: {0}".format(resp.get('error')['message']))
return
file_url = resp.get('file_url')
print(file_url)
resp = requests.post(resp.get('upload_url'), data=resp.get('data'), auth=(AccessToken, ''), files={'file': f})
data = {
'type' : 'file',
'file_name' : file_name,
'file_type' : file_type,
'file_url' : file_url,
'body' : ''
}
resp = requests.post(PUSH_URL, data=data, auth=(AccessToken, '')).json()
except requests.exceptions.ConnectionError:
traceback.print_exc()
f.close()
但我一直在接受:
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='s3.amazonaws.com', port=443): Max retries exceeded with url: /pushbullet-uploads (Caused by <class 'ConnectionResetError'>: [Errno 104] Connection reset by peer)
如果我使用另一个AccessToken,我仍然会收到此错误,即使这是我第一次发布到该网址。
答案 0 :(得分:2)
遗憾的是,上传过程不是很好,很快就会有所改进。这是一个不遵守JSON规则的请求。有一个curl示例显示了这个(https://docs.pushbullet.com/#upload-request),但理解curl语法基本上是不可能的。
这是我刚刚输入的一个例子,似乎有效:
import requests
import json
ACCESS_TOKEN = '<your access token here>'
resp = requests.post('https://api.pushbullet.com/v2/upload-request', data=json.dumps({'file_name': 'image.jpg'}), headers={'Authorization': 'Bearer ' + ACCESS_TOKEN, 'Content-Type': 'application/json'})
if resp.status_code != 200:
raise Exception('failed to request upload')
r = resp.json()
resp = requests.post(r['upload_url'], data=r['data'], files={'file': open('image.jpg', 'rb')})
if resp.status_code != 204:
raise Exception('failed to upload file')
print r['file_name'], r['file_type'], r['file_url']
答案 1 :(得分:0)
根据Pusbullet API
所有POST请求都应该通过HTTPS并使用带有的JSON正文 Content-Type标头设置为&#34; application / json&#34;。
尝试更改requests.post
这样的电话:
resp = requests.post(UPLOAD_REQUEST_URL, json=data, auth=(AccessToken, '')).json()
使用json=data
代替data=data
。请求会自动将Content-Type
设置为application/json
。