Dropbox API请求令牌无法与Python 3一起使用



我正在使用官方Dropbox API维护Python应用程序。为了让用户让我的应用程序使用他们的Dropbox帐户,我使用了一个使用DropboxSession类的小脚本,这显然与我们在这篇博客文章中可以找到的相同:

# Include the Dropbox SDK libraries
from dropbox import client, rest, session
# Get your app key and secret from the Dropbox developer website
APP_KEY = '******'
APP_SECRET = '******'
# ACCESS_TYPE should be 'dropbox' or 'app_folder' as configured for your app
ACCESS_TYPE = 'app_folder'
sess = session.DropboxSession(APP_KEY, APP_SECRET, ACCESS_TYPE)
request_token = sess.obtain_request_token()
url = sess.build_authorize_url(request_token)
# Make the user sign in and authorize this token
print "url:", url
print "Please visit this website and press the 'Allow' button, then hit 'Enter' here."
# Python 2/3 compatibility
try:
    raw_input()
except NameError:
    input()
# This will fail if the user didn't visit the above URL
access_token = sess.obtain_access_token(request_token)
#Print the token for future reference
print access_token

虽然它可以完美地与Python 2.7.6配合使用,但它似乎失败了,因为Python 3.4中的Dropbox代码(raw_input问题已经得到处理)。我得到这个错误:

Traceback (most recent call last):
  File "/home/scylardor/.virtualenvs/onitu3/lib/python3.4/site-packages/dropbox/session.py", line 285, in _parse_token
    key = params['oauth_token'][0]
KeyError: 'oauth_token'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "get_access_token.py", line 12, in <module>
    request_token = sess.obtain_request_token()
  File "/home/scylardor/.virtualenvs/onitu3/lib/python3.4/site-packages/dropbox/session.py", line 185, in obtain_request_token
    self.request_token = self._parse_token(response.read())
  File "/home/scylardor/.virtualenvs/onitu3/lib/python3.4/site-packages/dropbox/session.py", line 287, in _parse_token
    raise ValueError("'oauth_token' not found in OAuth request.")
ValueError: 'oauth_token' not found in OAuth request.

长话短说,在研究了错误的代码后,Dropbox代码似乎在搜索字符串字典键,尽管事实上在Python3中,这些键变成了字节串(即,它查找不在这里的'oauth_token',而不是在这里的b'oauth_token')。

然而,即使在修复了代码,看看这是否是唯一的问题,运气不好,我在过程中也会遇到另一个错误:

Traceback (most recent call last):
  File "get_access_token.py", line 25, in <module>
    access_token = sess.obtain_access_token(request_token)
  File "/home/scylardor/.virtualenvs/onitu3/lib/python3.4/site-packages/dropbox/session.py", line 214, in obtain_access_token
    response = self.rest_client.POST(url, headers=headers, params=params, raw_response=True)
  File "/home/scylardor/.virtualenvs/onitu3/lib/python3.4/site-packages/dropbox/rest.py", line 316, in POST
    return cls.IMPL.POST(*n, **kw)
  File "/home/scylardor/.virtualenvs/onitu3/lib/python3.4/site-packages/dropbox/rest.py", line 254, in POST
    post_params=params, headers=headers, raw_response=raw_response)
  File "/home/scylardor/.virtualenvs/onitu3/lib/python3.4/site-packages/dropbox/rest.py", line 227, in request
    raise ErrorResponse(r, r.read())
dropbox.rest.ErrorResponse: [401] 'Unauthorized'

因此故障函数为sess.obtain_request_token()sess.obtain_access_token(request_token)。Python 2.7版本运行良好,但我希望保持Python 3的兼容性。

那么,有人知道如何在Python3中实现它吗?它是否会被故意破坏,以使人们转向新的程序?一段时间前,我可以发誓它与Python 3一起工作。

如果你有想法,谢谢你抽出时间:)

编辑:Dropbox SDK似乎还没有完全兼容Python 3。所以,我想除了等待他们更新SDK之外,没有其他事情可做了

尝试使用版本1.6的

$ pip install dropbox==1.6

与等待SDK兼容相比,您可以使用(或贡献和使用)"社区"分支dropbox-py3(在github上)。

(这些引号都是大引号。现在只有我在编码,也只有我需要的部分,但欢迎大家提供帮助。我认为这主要是识别缺少".encode"的几个部分,因为它混合了字节和字符串。)

最新更新