Google photo api利用にあたってのOauth認証(Python)

Pocket

写真が無料で容量無制限

Google photoの写真の容量無制限で保存できるということでローカルにある写真は全部Google photoにバックアップを取ろうと思うが、GUIでいちいち実施するのは面倒なので、APIでやろうと思う。

google photo APIはOAuth認証

Google photo APIはOauthということでちょっと手間がかかる。

まずは以下のサイトでAPIを有効化する必要がある。もちろんGoogleのサービスなのでGoogleのアカウントを持っている必要がある。

APIの有効可

ここれで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を利用したアルバムの作成、指定したアルバムに写真をアップロードするプログラムを参考までにまとめたいと思う。

「Google photo api利用にあたってのOauth認証(Python)」への2件のフィードバック

  1. 始めまして。
    NASで管理している子供の写真をgoogle photoに自動アップロードしようとおもい、この記事にたどりつきました。大変参考になります。

    わたしはpythonプログラミング自体初心者(2021年8月から独学開始)なのですが、一点だけコメントさせてください。記載されているコードの5行目~35行目は、login()関数の中身、でよろしいでしょうか?
    (4行目にdef login():を記載必要でしょうか?)

    コピペさせていただき、これから自分なりに解読していこうとおもっているのですが、つながりが追えず、念のためのコメントでした。

    1. おっしゃるとおり関数定義が必要ですね。
      ご指摘ありがとうございます。

      ちなみにgoogle photoは2021年の6月に無料保存がなくなるという改悪があったので、注意してください。

コメントを残す

%d人のブロガーが「いいね」をつけました。