写真が無料で容量無制限
Google photoの写真の容量無制限で保存できるということでローカルにある写真は全部Google photoにバックアップを取ろうと思うが、GUIでいちいち実施するのは面倒なので、APIでやろうと思う。
google photo APIはOAuth認証
Google photo APIはOauthということでちょっと手間がかかる。
まずは以下のサイトでAPIを有効化する必要がある。もちろんGoogleのサービスなのでGoogleのアカウントを持っている必要がある。
ここれでcredencials.jsonというファイルをダウンロードできれば成功。
ログインのスクリプトは以下の通り。Pythonで記載した。
[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()
[/python]
ほぼこの方のプログラムを参考にした。
参考にさせていただいた記事にはTokenをRefreshするmethodはなかったので、refreshを追加した。
Access Tokenは1時間で切れる。また、Google photo APIのアップロードはすごく遅い。
GUIでアップロードすると1枚/秒くらいの間隔でアップロードするが、APIで写真をアップロードすると5-10倍近くかかる。
すると大量の写真をアップロードしようとすると、1時間のTOKENが切れてしまって勝手に停止するなど、苦労することが結構あったので、上記の通りRefreshメソッドも追記して、
時間を計測し、3500秒くらいの間隔でRefreshさせることで完全自動で写真をアップロードできるようになった。
次回にAPIを利用したアルバムの作成、指定したアルバムに写真をアップロードするプログラムを参考までにまとめたいと思う。
Leave a Reply