見出し画像

Google Photos APIをPythonで操作する

PythonでGoogle関連のサービスを操作する方法は巷に広がっているけど、Googleフォトに関して解説している記事が少なかったので苦労した。

APIを有効化する

Google Cloud Platformにログインし、プロジェクトを作成した後にAPIを有効化する。
1. APIとサービスを選択
2. ライブラリ
3. 検索バーに「photos」と入力し、Photos Library APIを選択
4. 有効化を選択

画像1

認証を作成

1. APIとサービスから、OAuth同意画面を選択
2. 外部を選択し、次へ
3. アプリケーション名を「GooglePhotos with Python」にして次へ
4. APIとサービスから、認証情報を選択
5. 上部から認証情報を作成→OAuthクライアント IDを選択
6. アプリケーションの種類から「デスクトップアプリ」を選択し、名前を「GooglePhotos with Python」にする。
7. 認証作成が完了したので、右端の矢印アイコンからjson形式でダウンロードする。

refreshトークンを発行する

Google Photos APIの利用には、先程の認証jsonファイルとアクセストークンが必要になる。アクセストークンは1時間で期限切れしてしまう為、いつでも発行できるようにするためのrefreshトークンを発行する。

import requests, ast, urllib, json

filepath = 'client_secret_xxx.json'

with open(filepath) as f:txt = f.read()
auth = ast.literal_eval(txt)['web']
SCOPE ='https://www.googleapis.com/auth/photoslibrary'
url = "https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=%s&redirect_uri=%s&scope=%s&access_type=offline" % (auth['client_id'], auth['redirect_uris'][0], SCOPE)
print(url)

出力されたURLをコピーし、ブラウザのURLバーに貼り付けて認証を進める。(URLをクリックした場合認証後ウィンドウが自動で閉じたので、コピペで対応すること)

リダイレクトされた後のURLにcode=xxxxxxxという記述があるので、コードを控えて下記を実行する。
初回の実行時のみレスポンスにrefresh_tokenが含まれるが、2回目からは含まれないので注意。もし破棄してしまった場合は、
・ログアウトし直す
・時間を置く
・chomeのシークレットウィンドウで認証し直す
を試す。

code = 'xxxxx'
tokenpath = 'xxxxxxxxxx.json'#保存したい場所

data = {
   'code': urllib.parse.unquote(code),
   'client_id': auth['client_id'],
   'client_secret': auth['client_secret'],
   'redirect_uri': auth['redirect_uris'][0],
   'grant_type': 'authorization_code',
   'access_type': 'offline'
}
response = requests.post('https://www.googleapis.com/oauth2/v4/token', data = data).json()
print(response)
if 'refresh_token' in response.keys():
   with open(topenpath, "w") as f:f.write(json.dumps(response))

Googleフォトにアクセス

refreshトークンからアクセストークンを発行し、アクセスする。
APIの詳細に関してはhttps://developers.google.com/photos/library/reference/restを参考。

with open(tokenpath) as f:refresh = json.loads(f.read())
data = {
   'refresh_token': refresh['refresh_token'],
   'client_id': auth['client_id'],
   'client_secret': auth['client_secret'],
   'grant_type': 'refresh_token'
}
token = requests.post('https://www.googleapis.com/oauth2/v4/token', data = data).json()
response = requests.get('https://photoslibrary.googleapis.com/v1/mediaItems?pageSize=50', headers={ "Authorization": "Bearer %s" % token["access_token"] })
photos = response.json()
for photo in photos['mediaItems']:
   if photo['mimeType']=='image/jpeg':print(photo)

お疲れ様でした。

この記事が気に入ったらサポートをしてみませんか?