2014-09-12 86 views
1

我在維護一個使用官方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之外沒有別的可做的事情了。

+1

很好的工作發佈您的API密鑰和世界的祕密...... – MattDMo 2014-09-12 17:01:09

+1

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

+0

@MattDMo,感謝您的關注,但應用程序的關鍵/祕密是我把鏈接的博客帖子。我認爲,自作者離開他們後,可以複製:-)格雷格似乎有正確的答案。因爲我認爲這個問題不會得到更好的結果,所以我會編輯這個問題並讓它在這裏作爲參考。 – Scylardor 2014-09-13 20:57:43

回答

0

嘗試使用1.6版

$ pip install dropbox==1.6 
0

不是等待SDK兼容,你可以用更好的(或推動和使用)的「社區」叉,dropbox-py3here on github)。 (這些引號是大引號的,現在只是我編碼的一部分,只是我需要的部分,但是大家都很樂意幫忙,我認爲這主要是識別少數缺少「.encode」的部分,因爲它是混合字節和字符串)