@felciano There appear to be 2 issues.
- Dropbox version 11.7.0 crashes when using the appex module.
- The keychain module does not work with the appex module.
You will need to use Dropbox 6.4.0 and you will need to store your refresh_token somewhere else besides keychain.
You can modify dropboxlogin like this:
#refresh_token = keychain.get_password('dropbox', 'refresh_token')
refresh_token = "your_refresh_token"
You can then remove the dropbox folders from site-packages-3 or try this script which removes site-packages-3 from sys.path when running from a share sheet and temporarily reverts back to dropbox 6.4.0.
import sys
import appex
import console
print('file', appex.get_file_path())
def test():
print(sys.path[1])
if appex.is_running_extension(): # if share sheet
sys.path.remove(sys.path[1]) # remove site-packages-3 from sys.path
import dropbox
print('dropbox version', str(dropbox.__version__))
import dropboxlogin
dropbox_client = dropboxlogin.get_client()
print('Getting account info...')
account_info = dropbox_client.users_get_current_account()
print('linked account:', account_info)
test()
If you are just trying to upload a file from a share sheet, this script does not use the dropbox module:
import sys, os, json, shutil
import appex
import console
import keychain
import requests
from requests.auth import HTTPBasicAuth
app_key = "your_app_key"
app_secret = "your_app_secret"
refresh_token = "your_refresh_token"
def dropbox_token(refresh_token):
data = {'refresh_token': refresh_token, 'grant_type': 'refresh_token'}
try:
r = requests.post('https://api.dropbox.com/oauth2/token', data=data,
auth = HTTPBasicAuth(app_key, app_secret))
result = r.json()
except:
print(str(sys.exc_info()))
return { 'refresh_token': None, 'access_token': None, 'error': {'.tag': str(sys.exc_info())} }
#print('dbx:', result)
return result
def upload_file(source_filename, path):
with open(source_filename, 'rb') as f:
data = f.read()
parms = {}
parms['path'] = path
parms['mode'] = 'overwrite'
print (json.dumps(parms))
headers = {'Authorization': 'Bearer %s' % (access_token,),'Dropbox-API-Arg': json.dumps(parms),'Content-Type': 'application/octet-stream' }
url = 'https://content.dropboxapi.com/2/files/upload'
try:
r = requests.post(url, stream=True, headers=headers, data=data)
except:
print("Exception requests: %s" % str(sys.exc_info()))
result = r.json()
return result
local_path = os.path.expanduser('~/Documents/tmp')
access_token = dropbox_token(refresh_token)['access_token']
files = appex.get_file_paths()
if files != None and files != []:
for i in range(len(files)):
print('Input path: %s' % files[i])
basename = os.path.basename(files[i])
filename=os.path.join(local_path, basename)
shutil.copy(files[i], filename)
upload_file(basename, '/remote/dropbox/path/' + basename)