Google APIクライアントライブラリ ページによると、pythonクライアントライブラリを使用してGoogle Photos APIにアクセスできますが、pip install -t lib/ google-api-python-client
Photos APIに関連するものは見当たりません。
REST APIsを手動で呼び出す代わりに、Googleビルドのクライアントライブラリを使用するにはどうすればよいですか?
Ido Ran の例と brillb の例のおかげで、ついに問題も解決しました。上記のドキュメントリンクの一部は、もはや有効ではありません。上記の例を強化しようとすると、ページ Google Photos API が最も便利であることがわかりました。 APIを文書化するだけでなく、リクエストをインタラクティブにテストすることもできます。おそらく、そのテスト機能なしでは機能しませんでした。リクエストを入力すると、cURL、HTTP、またはJAVASCRIPTでコーディング例が表示されますが、Pythonの場合は何も表示されません。
アルバムのリストを作成する以外に、私も興味がありました
アルバムへのリンクを取得するには、_item['productUrl']
_を取得するだけで上記の例を拡張できます。ただし、Firefoxでは何度もURLが機能しませんでしたIEまたはEdge(非常に簡単にアルバムを表示した後にエラー404)が、Chrome =およびOpera(理由を知っている人)。
アルバムのカバー写真のURL:_item['coverPhotoMediaItemId']
_の方が信頼性が高いようです。そこで、Infoの下にアルバムへのリンクがあります。
albums
メソッドを使用する代わりに、sharedAlbums
にアクセスすることもできます(そしてresults.get('sharedAlbums', [])
を指定します。shareableUrl
を取得できることを望んでいましたが、結果の一部としてShareInfo
リソースが見つかりませんでした。
画像のリストには、_mediaItems.list
_および_mediaItems.search
_の2つの方法を選択できます。前者はallの長いリストを返すので、前者は役に立たないと思いますが、検索では、結果を日付で制限することができ、写真が撮影されました(アップロードされません!)。 get
とbatchGet
もあります。Googleフォトによって画像に付与されたアイテムIDを知る必要があるため、試したことはありません。
各メソッドには、返されるエントリの最大数に制限(pageSize
)があります。それ以上ある場合は、pageToken
も送信し、次の部分を要求するために使用できます。
私はついにこの例を思いつきました:
_from os.path import join, dirname
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
SCOPES = 'https://www.googleapis.com/auth/photoslibrary.readonly'
store = file.Storage(join(dirname(__file__), 'token-for-google.json'))
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets(join(dirname(__file__), 'client_id.json', SCOPES))
creds = tools.run_flow(flow, store)
google_photos = build('photoslibrary', 'v1', http=creds.authorize(Http()))
day, month, year = ('0', '6', '2019') # Day or month may be 0 => full month resp. year
date_filter = [{"day": day, "month": month, "year": year}] # No leading zeroes for day an month!
nextpagetoken = 'Dummy'
while nextpagetoken != '':
nextpagetoken = '' if nextpagetoken == 'Dummy' else nextpagetoken
results = google_photos.mediaItems().search(
body={"filters": {"dateFilter": {"dates": [{"day": day, "month": month, "year": year}]}},
"pageSize": 10, "pageToken": nextpagetoken}).execute()
# The default number of media items to return at a time is 25. The maximum pageSize is 100.
items = results.get('mediaItems', [])
nextpagetoken = results.get('nextPageToken', '')
for item in items:
print(f"{item['filename']} {item['mimeType']} '{item.get('description', '- -')}'"
f" {item['mediaMetadata']['creationTime']}\nURL: {item['productUrl']}")
_
例が見つからなかったため、Drive API v3の例を取り上げ、Photos v1 APIに適合させました。
要点は次のとおりです。
from apiclient.discovery import build
service = build('photoslibrary', 'v1', http=creds.authorize(Http()))
results = service.albums().list(
pageSize=10, fields="nextPageToken,albums(id,title)").execute()
APIは上記の例で示されているよりも機能が少し劣り、「フィールド」をサポートしていません。しかし、それは動作します:
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
SCOPES = 'https://www.googleapis.com/auth/photoslibrary.readonly'
store = file.Storage('token-for-google.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_id.json', SCOPES)
creds = tools.run_flow(flow, store)
gdriveservice = build('photoslibrary', 'v1', http=creds.authorize(Http()))
results = gdriveservice.albums().list(
pageSize=10).execute()
items = results.get('albums', [])
for item in items:
print(u'{0} ({1})'.format(item['title'].encode('utf8'), item['id']))