@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)