PythonでDropboxを使用する

PythonでDropboxを使用してみます。

PythonでDropboxを使用するには、事前にDropboxモジュールをインストールする必要があります。Dropboxモジュールは、Pythonの標準ライブラリではありません。

またDropboxのアカウントを取得し、開発者向けのアプリコンソールでアプリケーションを作成し、アクセストークンを生成しておく必要があります。DropboxAPIの利用。

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)

■Dropboxを使用する

では、早速PythonでDropboxを使用していきます。

■コード(ファイルをアップロードする)

import dropbox

dropbox_access_token="生成されたアクセストークン"
dropbox_path="/sky/sky_sample.jpg"
computer_path= r"C:\Users\user\test\sky_sample.jpg"

client = dropbox.Dropbox(dropbox_access_token)
print("ドロップボックスアカウントがリンクされました")

client.files_upload(open(computer_path, "rb").read(), dropbox_path)
print("アップロード:{}".format(computer_path))

インポートでdropboxモジュールを呼び出して、dropbox_access_tokenという変数を作成し、その中に、お持ちのDropboxアカウントで生成したアクセストークンをコピーして貼り付けて格納します。

次にdropbox_pathという変数を作成し、Dropbox(アップロード先)のファイルパスを指定し、格納します。computer_pathという変数を作成し、コンピューター上に保存されているDropboxにアップロードさせるファイルのパスを指定し格納します。

今回は「C:\Users\user\test(フォルダパス)」にsky_sample.jpgという空の画像ファイルを用意しましたので、これをアップロードしてみます。この画像ファイルは著作権フリーのものを使用しています。

次にclientオブジェクトを作成し、Dropboxアカウントをアプリケーションにリンクさせます。

その後、リンクした状態でfiles_upload()で今回用意した画像ファイルをバイナリファイルを読み込む(rb)モードで開きます。開いたものをread()で読み込み、files_uploadの括弧内(第2の引数)で指定したDropbox(アップロード先)のファイルパスにファイルをアップロードします。

■実行

今回書いたスクリプトを「file_upload_dropb.py」という名前で保存し、コマンドプロンプトから実行してみます。

dropbox.exceptions.BadInputError: BadInputError(‘****’, ‘Error in call to API function “files/upload”: Your app is not permitted to access this endpoint because it does not have the required scope \’files.content.write\’. The owner of the app can enable the scope for the app using the Permissions tab on the App Console.’)

実行してみると、上記のdropbox.exceptions.BadInputErrorというエラーが発生しました。

■対処方法

エラーの原因を調べてみると、Permissions(権限)、作成したアプリケーションのスコープを有効できていないことが原因でしたので、これを対処します。対処するには、Dropboxのアプリコンソールにアクセスします。アクセス後、お持ちのアカウントでログインします。

ログインすると、「My apps」で作成したアプリケーション(アクセストークンを生成したもの)が表示されているので、こちらを選択します。

選択すると、作成したアプリケーションの詳細ページが表示されますので、「Permissions(権限)」の文字をクリックします。

クリックすると「Individual Scopes(個々のスコープ)」という項目がありますので、この項目の中から「ファイルとフォルダ(Files and folders)」の編集に関わるものを選択し、チェックボックスにチェックを入れます。「files.content.write(Edit content of your Dropbox files and folders)」等。

チェックを入れた後、「Click Submit when you are done making changes(変更が完了したら、[送信]をクリックします)」というウインドウが表示されていますので、「Submit」ボタンをクリックします。クリックすると、「Permissions change successful」と表示され、内容が変更されます。

変更後、作成したアプリケーションの詳細ページに戻ります。

戻った後に「OAuth 2」という項目に「Generated access token」の「Generate」ボタンをクリックします。

クリックし、再度アクセストークンを生成します。生成されたアクセストークンをスクリプトの「dropbox_access_token」内に貼り付けます。

注意ですが、再度アクセストークンを生成し貼り付けないと「dropbox.exceptions.AuthError: AuthError(‘アクセストークン’, AuthError(‘missing_scope’, TokenScopeError(required_scope=’files.content.write’)))」というエラーが発生します。

貼り付けて内容を変更したスクリプトを再度実行してみます。

実行してみると、「ドロップボックスアカウントがリンクされました」と出力され、アップロードが完了しました。

完了後、Dropboxを確認してみると、「sky」というフォルダが作成され、「sky_sample.jpg」がアップロードされていることを確認できました。

■ファイルをダウンロードする

次に、ファイルのダウンロードを行ってみます。

■コード(ファイルをダウンロードする)

import dropbox

dropbox_access_token="生成されたアクセストークン"
client = dropbox.Dropbox(dropbox_access_token)

with open("sky_sample.jpg", "wb") as f:
    metadata, res = client.files_download(path="/sky/sky_sample.jpg")
    f.write(res.content)

先ほど、Dropboxにアップロードした「sky_sample.jpg」をダウンロードしてみます。

■実行

このスクリプトを「file_download_dropb.py」という名前で保存し、コマンドプロンプトから実行してみます。

実行してみると、カレントディレクトリ(作業ディレクトリ)に、Dropboxにアップロードした「sky_sample.jpg」がダウンロードされて保存されていることが確認できました。

なお、実行した際に「dropbox.exceptions.AuthError: AuthError(‘****’, AuthError(‘missing_scope’, TokenScopeError(required_scope=’files.content.read’)))」というエラーが発生する場合は、先ほどのファイルをアップロードした時に発生したエラーの対処と同じで作成したアプリケーションの詳細ページから「Permissions(権限)」へ移動し、「Individual Scopes(個々のスコープ)」の項目にある「files.content.read」のチェックボックスにチェックを入れます。入れた後に、必ず再度アクセストークンの生成を行い、生成されたアクセストークンを「dropbox_access_token」内に貼り付けて保存し、スクリプトを実行します。

コメント

タイトルとURLをコピーしました