Pythonを使ってローカルのファイルをOneDriveにアップロードしようと色々と試しました。
Microsoft公式に従ったやり方
以下のサイトを参考にして進めてみました。また、他のWebサイトも色々と参考にしてみました。
結論から言うと、上手く行きませんでした。
HTTPリクエストをWebブラウザやJMeterを使って手動で確かめながら進めたのですが、上手く行かず。Webブラウザで行うとある程度進むのですが、Pythonのrequestsから実行するとうまく進みません。唯一上手く行ったのが、refresh_tokenを手動で取得してから、access_tokenを取得する、というやり方だけ。
色々と調べてみましたが、Webブラウザ経由とPython経由で違うところと言えば以下の【アカウントを選択する】に該当する操作がPythonではできていないからではないか??との疑念に行きつきました。
英語サイトの方が情報出てくるので、【graph authorization “pick an account”】とかで調べてみると、domain_hintを指定すると回避できるとか書いてありましたが上手く行かず。
この手法は将来課題として今回は諦めることにしました。
rclone-pythonの利用
結局どうしたのか。
結論は、rcloneのお世話になることにしました。rcloneでは簡単にOneDriveにコマンドラインからアクセスできていましたので、Pythonから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を使わないで操作する方法も試し続けてみたいと思います。
コメント