• @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)
  • Stupid question, but does your service account automatically have access to your youtube account? It is not obvious to me that it would.

    I think you may be better off getting credentials via a regular oauth flow, which is what the api explorer does.

    Here i have implementd a modified version of the web quickstart from the youtube python api examples, which presents a webview that authorizes to a flask webserver. Then saves the access token to creds.json.

    This requires you to add http://localhost:8090/oauth2callback to the allowed callback uris in the developer console.

    Also, a bunch of packages need to get installed via stash pip --
    google-api-python-client
    google-auth
    google-auth-oauthlib
    google-auth-httplib2

    Once you have the token for your user, you can use the google youtube python api. I started with the youtube/api-samples repo on github, replaced their get_authenticated_service with one that uses the saved creds.json.

    # Authorize the request and store authorization credentials. def get_authenticated_service(): from oauth2client.client import AccessTokenCredentials creds=json.load(open('creds.json')) credentials= AccessTokenCredentials(access_token=creds['token'],user_agent='JonTestApp') return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)

    After that, I was able to create a playlist.

  • Has anyone gotten this to work? The installs work fine but I have yet to be able to authenticate to Instagram. Problem is on the Instagram side. I tried following the instructions but at some point Instagram does not respond. Before I spend more time on it I wondered if this has worked successfully for anyone in the Pythonista community.

Internal error.

Oops! Looks like something went wrong!