使用OAuth2代码在python中使用Dropbox API时出现问题

时间:2018-12-14 08:54:39

标签: python oauth-2.0 dropbox-api

我正在尝试使用Dropbox作为用户共享文件的媒介来设置应用。

我能够使用App令牌上传文件,但是当我尝试使用授权代码时,文件不会上传;该应用程序不会报告错误。

下面的代码包含两种方法:

dbx = get_dbx_with_token()

可以,但是

dbx = get_dbx_with_auth_code()

没有。任何帮助表示赞赏。

import webbrowser

from dropbox import Dropbox
from dropbox.files import WriteMode
from dropbox import DropboxOAuth2FlowNoRedirect

APP_KEY = '<my app key>'
APP_SECRET = '<my app secret>'
APP_TOKEN = '<my app token>'

def upload(dbx):
    local_file = '<path to local file>'
    remote_file = '<remote file name>'
    with open(local_file, 'rb') as f_upload:
        try:
            foo = dbx.files_upload(f_upload.read(), remote_file, 
                                   mode=WriteMode('overwrite'))
            print('done ...', foo)
        except:
            print('Upload error')

def get_dbx_with_auth_code():
    auth_flow = DropboxOAuth2FlowNoRedirect(APP_KEY, APP_SECRET)
    authorize_url = auth_flow.start()
    webbrowser.open(authorize_url)
    auth_code = input('Authorization code: ').strip()
    try:
        oauth_result = auth_flow.finish(auth_code)
    except:
        print('Token error')
        return None
    dbx = Dropbox(oauth_result.access_token)
    return dbx

def get_dbx_with_token():
    dbx = Dropbox(APP_TOKEN)
    return dbx

if __name__ == '__main__':
    dbx = get_dbx_with_token()
    #dbx = get_dbx_with_auth_code()
    upload(dbx)

dbx.files_upload函数(foo)返回:

 FileMetadata(
      name='uploaded.txt', 
      id='id:<my_id>', 
      client_modified=datetime.datetime(2018, 12, 13, 18, 24, 15), 
      server_modified=datetime.datetime(2018, 12, 13, 18, 24, 15), 
      rev='013000000010ede3870', size=6, path_lower='/upload test/uploaded.txt', 
      path_display='/upload test/uploaded.txt', 
      parent_shared_folder_id=None, 
      media_info=None, 
      symlink_info=None, 
      sharing_info=None, 
      property_groups=None, 
      has_explicit_shared_members=None, content_hash='<content hash>')

get_dbx_with_token的FileMetadata不同:

parent_shared_folder_id='1234567890', 
sharing_info=FileSharingInfo(read_only=False,
parent_shared_folder_id='1234567890',
modified_by='dbid:AAAyXwp1wvSzPzmqzCJ9SWFuxhc')

(顺便说一下,我上传到的文件夹是属于另一个用户的共享文件夹)

我认为它不起作用的原因是,如果我使用get_dbx_with_auth_code(),它不会出现在(浏览器)Dropbox文件夹中,但是如果我使用get_dbx_with_token(),它不会出现。

1 个答案:

答案 0 :(得分:0)

由于Greg的评论,我意识到实际上是在进行上传,但是由于我对API的了解有限,所以我没有意识到使用auth_code选项将文件放置在应用程序的特定文件夹中。既然我知道在哪里寻找就可以了。

  

输出表明文件已成功上传,因此听起来好像您在Dropbox网站上查找文件时在其他文件夹或帐户中一样。仔细检查您要查找的帐户/文件夹。此外,您可能在两个流程之间使用了不同的应用程序,因此请注意,如果某个应用程序具有“应用程序文件夹”权限,它将上传到特殊的“应用程序文件夹”中为应用程序制作的,默认情况下在“ / Apps”中

打印files_upload的输出显示了正在发生的事情。