写真が無料で容量無制限
Google photoの写真の容量無制限で保存できるということでローカルにある写真は全部Google photoにバックアップを取ろうと思うが、GUIでいちいち実施するのは面倒なので、APIでやろうと思う。
google photo APIはOAuth認証
Google photo APIはOauthということでちょっと手間がかかる。
まずは以下のサイトでAPIを有効化する必要がある。もちろんGoogleのサービスなのでGoogleのアカウントを持っている必要がある。
ここれでcredencials.jsonというファイルをダウンロードできれば成功。
ログインのスクリプトは以下の通り。Pythonで記載した。
from pathlib import Path from requests_oauthlib import OAuth2Session import json google = OAuth2Session( auth_info.get("client_id"), scope=scope, token=token, auto_refresh_kwargs=extras, token_updater=save_token, auto_refresh_url=auth_info.get("token_uri"), redirect_uri=auth_info.get("redirect_uris")[0] ) if not google.authorized: print("not authorized") authorization_url, state = google.authorization_url( auth_info.get("auth_uri"), access_type="offline", prompt="select_account" ) print("Access {} and paste code.".format(authorization_url)) access_code = input(">>> ") google.fetch_token( auth_info.get("token_uri"), client_secret=auth_info.get("client_secret"), code=access_code ) assert google.authorized save_token(google.token) return google def save_token(token): token = { "access_token": token.get("access_token"), "refresh_token": token.get("refresh_token"), "token_type": token.get("token_type"), "expires_in": token.get("expires_in") } Path("token.json").write_text(json.dumps(token)) def load_token(): token = { "access_token": "", "refresh_token": "", "token_type": "", "expires_in": "-30", } path = Path("token.json") if path.exists(): token = json.loads(path.read_text()) return token def refresh(google): auth_info = json.loads(Path("credentials.json").read_text()).get("installed", None) assert auth_info is not None token = load_token() extras = { "client_id": auth_info.get("client_id"), "client_secret": auth_info.get("client_secret"), } authorization_url, state = google.authorization_url( auth_info.get("auth_uri"), access_type="offline", prompt="select_account", ) google.refresh_token( auth_info.get("token_uri"), refresh_token=token.get("refresh_token"), client_secret=auth_info.get("client_secret"), ) assert google.authorized save_token(google.token) If __name__ == '__main__': google = login()
ほぼこの方のプログラムを参考にした。
参考にさせていただいた記事にはTokenをRefreshするmethodはなかったので、refreshを追加した。
Access Tokenは1時間で切れる。また、Google photo APIのアップロードはすごく遅い。
GUIでアップロードすると1枚/秒くらいの間隔でアップロードするが、APIで写真をアップロードすると5-10倍近くかかる。
すると大量の写真をアップロードしようとすると、1時間のTOKENが切れてしまって勝手に停止するなど、苦労することが結構あったので、上記の通りRefreshメソッドも追記して、
時間を計測し、3500秒くらいの間隔でRefreshさせることで完全自動で写真をアップロードできるようになった。
次回にAPIを利用したアルバムの作成、指定したアルバムに写真をアップロードするプログラムを参考までにまとめたいと思う。
始めまして。
NASで管理している子供の写真をgoogle photoに自動アップロードしようとおもい、この記事にたどりつきました。大変参考になります。
わたしはpythonプログラミング自体初心者(2021年8月から独学開始)なのですが、一点だけコメントさせてください。記載されているコードの5行目~35行目は、login()関数の中身、でよろしいでしょうか?
(4行目にdef login():を記載必要でしょうか?)
コピペさせていただき、これから自分なりに解読していこうとおもっているのですが、つながりが追えず、念のためのコメントでした。
おっしゃるとおり関数定義が必要ですね。
ご指摘ありがとうございます。
ちなみにgoogle photoは2021年の6月に無料保存がなくなるという改悪があったので、注意してください。