2015-03-07 7 views
0

Я пытаюсь отправить файл с помощью Pushbullet после их API docs. Это моя функция:Python и pushbullet api: отправить файл

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) 

Если я использую другой маркер доступа я все еще получаю эту ошибку, даже если это первый раз, я отправляю к этой ссылке.

ответ

2

Процесс загрузки, к сожалению, не очень хороший и, надеюсь, будет улучшен в ближайшее время. Это один запрос, который не подчиняется правилу JSON. Существует пример скручивания, который показывает это (https://docs.pushbullet.com/#upload-request), но понимание синтаксиса завивки в принципе невозможно.

Вот пример, который я только что напечатал и, кажется, работает:

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'] 
+0

Спасибо, отлично работает :) – andrew

+0

Спасибо за это! Обратите внимание на других: вы должны добавить финальную кнопку после кода Криса, чтобы на самом деле сделать нажатие. Для тех, у кого есть проблемы вроде «http://stackoverflow.com/questions/29134512/insecureplatformwarning-a-true-sslcontext-object-is-not-available-this-prevent», пожалуйста, следуйте руководству здесь: https: // github. com/pyca/cryptography/issues/1981 Это вручную устанавливает необходимые утилиты, такие как cffi, enum34, ipaddress, idna, pycparser, криптография. –

0

Согласно Pusbullet API

Все запросы POST должны быть через HTTPS и использовать тело JSON с Content-Type заголовка, установленным в "приложение/JSON".

Попробуйте изменить requests.post звонки следующим образом:

resp = requests.post(UPLOAD_REQUEST_URL, json=data, auth=(AccessToken, '')).json() 

Использование json=data вместо data=data. Запросы автоматически устанавливают Content-Type на номер application/json.

+0

Я не могу использовать JSON = данные, я думаю, что версия запросов, установленные на моем компьютере слишком старая. Я также попытался установить вручную headers = {'Content-type': 'application/json'}, но я получаю тот же результат ... – andrew

+0

Попробуйте обновить запросы? 'pip install requests == 2.5.3' – Kedar