【Python】Dropbox APIでアクセストークンを自動更新する


投稿日 2022年6月23日 >> 更新日 2023年2月28日

概要

Dropboxのアクセストークンを取得するにはDropboxのWebサイトにある自身で作成済みの開発用アプリから手動でアクセストークンを生成します。この場合ですと使用期限もあるので期限が切れる度に手動で生成しなくてはなりません。

「Unable to refresh access token without refresh token and app key」というエラーにも対応することができます。

Dropbox APIを使ったアクセストークンの取得は幾つかありますが、今回は「更新用トークン」を取得してDropboxオブジェクトのアクセストークンを自動で更新されるような設定をしていきます。

実行環境&使用ライブラリ

実行環境
Windows Subsystem for Linux
Python 3.6.9
pip 21.3.1
使用ライブラリ ライセンス
dropbox==11.32.0 MIT
$ pip install dropbox

アクセストークンの自動更新

アクセストークンを自動更新にするには、「更新用トークン」「アプリのキー」「アプリのシークレットキー」が必要です。

更新用トークンを取得するには「アプリのキー」と「アプリのシークレットキー」を使って「認証コード」を発行しなければいけません。

従ってDropboxの開発用アプリを作成する必要があります。開発用アプリの作成については以下の記事を参照ください。

開発用アプリから「App key」「App secret」を取得する

開発用アプリの「App key」と「App secret」は自身の開発用アプリにアクセスし下図の「settings」というページにいきます。

下方向にスクロールしていくと「App key」と「App secret」の項目が現れるのでコピーしておきます。

認証コードを取得する

認証プロセスを実行するにはDropbox APIの「DropboxOAuth2FlowNoRedirect」クラスを使用します。

このクラスのドキュメントとサンプルコードは以下のリンクにあります。

では最初に開発用アプリからコピーしてきた「App key」と「App secret」を「DropboxOAuth2FlowNoRedirect」クラスに渡し、認証コードを取得します。

from dropbox import DropboxOAuth2FlowNoRedirect


app_key = 'APP_KEY'
app_secret = 'APP_SECRET'

auth_flow = DropboxOAuth2FlowNoRedirect(
                        app_key,
                        consumer_secret=app_secret, # PKCEがFalseの場合に必要
                        use_pkce=False, # Trueだとシークレットキーは不要
                        token_access_type='offline'
)

第三引数の「token_access_type='offline'」とすることで更新用トークンに設定されます。

これでオブジェクトが作成されたので、「start()」メソッドで認証プロセスのURLを出力します。

auth_flow.start()
"""
'https://www.dropbox.com/oauth2/authorize?response_type=...'
"""

出力されたURLにアクセスすると下図のように表示されるので間違いがなければ「次へ」をクリックします。

開発用アプリの設定内容をご確認の上、「許可」をクリックします。

認証コードが発行されたので、コピーしておきます。

認証コードをオブジェクトに渡して更新用トークンを取得する

「App key」と「App secret」が渡されたオブジェクトの「start()」メソッドによって出力された認証プロセスのURLにアクセスして認証コードを発行しました。

auth_flow = DropboxOAuth2FlowNoRedirect(app_key, consumer_secret=app_secret, token_access_type='offline')

auth_flow.start()
"""
'https://www.dropbox.com/oauth2/authorize?response_type=...'
"""

認証コードを「finish()」メソッドに渡して更新用トークンを取得します。

oauth_result = auth_flow.finish('認証コード')

print(oauth_result)
"""
OAuth2FlowNoRedirectResult(...
"""

更新用トークンは「refresh_token」属性を呼び出すことで出力できます。

oauth_result.refresh_token
"""
'更新用トークン'
"""

refresh_token = oauth_result.refresh_token

更新用トークンを使って自動更新する

認証コードを渡して更新用トークンを取得することができたので、「Dropbox」クラスに渡して自動更新の設定を行っていきます。

準備する変数は、「App key」「App secret」「更新用トークン」です。

それぞれをDropboxクラスに渡してDropboxオブジェクトを作成します。

import dropbox


rdbx = dropbox.Dropbox(oauth2_refresh_token=refresh_token, app_key=app_key, app_secret=app_secret)

Dropboxのオブジェクトが作成されたので、「__dict__」メソッドで設定されているパラメータの属性値を確認します。

rdbx.__dict__
"""
{'_oauth2_access_token': None, '_oauth2_refresh_token': '******', '_oauth2_access_token_expiration': None, '_app_key': '*******', '_app_secret': '*******', '_scope': None, '_max_retries_on_error': 4, '_max_retries_on_rate_limit': None, '_session': <requests.sessions.Session object at 0x7fffd4cbe278>, '_headers': None, '_raw_user_agent': None, '_user_agent': 'OfficialDropboxPythonSDKv2/11.32.0', '_logger': <Logger dropbox (WARNING)>, '_host_map': {'api': 'api.dropboxapi.com', 'content': 'content.dropboxapi.com', 'notify': 'notify.dropboxapi.com'}, '_timeout': 100}
"""

「__dict__」メソッドに格納されている属性値を呼び出すには以下のようにします。

※アクセストークンを出力

rdbx._oauth2_access_token

現在アクセストークンは設定していないので空の状態です。

開発用アプリの権限によってDropboxのアカウント操作が限られますが、各種操作を実行することによってアクセストークンが更新されます。

なのでデフォルトの権限で設定されているアカウントの表示を実行します。

rdbx.users_get_current_account()
"""
FullAccount(account_id=...
"""

もう一度「_oauth2_access_token」属性を呼び出すとアクセストークンが更新されているのがわかります。

rdbx._oauth2_access_token
"""
'********'
"""

「refresh_access_token()」メソッドを使って実際に更新されるのか確認してみます。

before = rdbx._oauth2_access_token

rdbx.refresh_access_token()

after = rdbx._oauth2_access_token

before == after
"""
False
"""

アクセストークンの更新前(Before)、更新後(After)を比較してみると「False」となったので、更新されている事がわかります。

それでは以上となります。

最後までご覧いただきありがとうございました。