我在維護一個使用官方Dropbox API的Python應用程序。爲了讓用戶能夠讓我的應用程序中使用他們的Dropbox帳戶,我用用DropboxSession類,這顯然是一樣的一個,我們可以找到this blog post一個小腳本:Dropbox API請求令牌不適用於Python 3?
# 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的代碼搜索,儘管在Python 3,這些鍵變成字節串(即它查找'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的兼容性。
那麼,有沒有人知道人們應該如何使它在Python 3中工作?爲了讓人們轉向新的程序,是否可以故意破壞它?前一段時間,我可以發誓它正在與Python 3合作。
謝謝您的時間,如果你有一個想法:)
編輯:看來Dropbox的SDK,並不是完全與Python 3兼容呢。所以,我想除了等待他們更新SDK之外沒有別的可做的事情了。
很好的工作發佈您的API密鑰和世界的祕密...... – MattDMo 2014-09-12 17:01:09
Dropbox for Python SDK尚未更新爲Python 3支持(截至當前版本2.1.0: https://www.dropbox.com/developers/core/sdks/python)。而且它並沒有故意癱瘓。它確實使用最新版本的Dropbox API和OAuth。至於在這裏結束的401錯誤,如果沒有更多信息,這將很難調試。這可能是一個有效的錯誤,即您的訪問令牌無效,或者可能是由於Python 3不兼容導致格式錯誤的請求。我建議自己查看請求,看看它可能出錯的地方。 – Greg 2014-09-12 17:25:35
@MattDMo,感謝您的關注,但應用程序的關鍵/祕密是我把鏈接的博客帖子。我認爲,自作者離開他們後,可以複製:-)格雷格似乎有正確的答案。因爲我認爲這個問題不會得到更好的結果,所以我會編輯這個問題並讓它在這裏作爲參考。 – Scylardor 2014-09-13 20:57:43