【Python】OneDriveにファイルをアップロードする

python logo Python

Pythonを使ってローカルのファイルをOneDriveにアップロードしようと色々と試しました。

Microsoft公式に従ったやり方

以下のサイトを参考にして進めてみました。また、他のWebサイトも色々と参考にしてみました。

ユーザーの代わりにアクセスを取得 - Microsoft Graph
アプリがMicrosoft ID プラットフォームからアクセス トークンを取得し、ユーザーの代わりに Microsoft Graph を呼び出す方法について説明します。
ユーザーなしでアクセスを取得 - Microsoft Graph
アプリがMicrosoft ID プラットフォームからアクセス トークンを取得し、独自の ID で Microsoft Graph を呼び出す方法について説明します。

結論から言うと、上手く行きませんでした。

HTTPリクエストをWebブラウザやJMeterを使って手動で確かめながら進めたのですが、上手く行かず。Webブラウザで行うとある程度進むのですが、Pythonのrequestsから実行するとうまく進みません。唯一上手く行ったのが、refresh_tokenを手動で取得してから、access_tokenを取得する、というやり方だけ。

色々と調べてみましたが、Webブラウザ経由とPython経由で違うところと言えば以下の【アカウントを選択する】に該当する操作がPythonではできていないからではないか??との疑念に行きつきました。

Microsoft - Pick an account

英語サイトの方が情報出てくるので、【graph authorization “pick an account”】とかで調べてみると、domain_hintを指定すると回避できるとか書いてありましたが上手く行かず。

この手法は将来課題として今回は諦めることにしました。

rclone-pythonの利用

結局どうしたのか。

結論は、rcloneのお世話になることにしました。rcloneでは簡単にOneDriveにコマンドラインからアクセスできていましたので、Pythonからrcloneが使えないか、検索してみると、

rclone-python
A python wrapper for rclone.

すぐに出てきました。その名も【rclone-python】。

python-rcloneなんてのもあるようですが、ひとまずrclone-pythonを使ってみます。

まず、rcloneのインストールが必要となりますが、それは【Xserver VPN】UpdraftPlus + WP Crontrol + rclone + croneでWordPressの自動バックアップをご参照ください。

で、rclone-pythonのライブラリのインストールから進めていきます。

$ pip install rclone-python

以上ですね。

では、早速rclone-pythonでアップロードができるか試してみます。

# rclone-pythonのimport
from rclone_python import rclone

local_file_path = "./test/"
od_path = "/test/"
file_name = "test.jpg"

# 次の2行はrclone本体でconfig完了している場合は不要です。
# そうでない場合は、以下を実行することでブラウザが起動してアクセストークンが取得され、
# 接続が確立されます。
from rclone_python.remote_types import RemoteTypes
rclone.create_remote("onedrive", RemoteTypes.onedrive)

rclone.copy(local_file_path+file_name, "onedrive:"+od_path+file_name)

簡単にアップロードができてしましました。。。これまでの苦労は何だったのか。。。

ソースコードを見ると、他にもlsとかいろいろと使えるっぽいです。まあ、読んでみるとrcloneにコマンドと引数渡してるだけっぽいので、そりゃそうか、と。

実用上は全くこれで問題ないですが、Graphまわりの勉強の為、rcloneを使わないで操作する方法も試し続けてみたいと思います。

コメント

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