web-dev-qa-db-ja.com

Python google-api-python-clientを使用してGoogle Photo APIにアクセスします

Google APIクライアントライブラリ ページによると、pythonクライアントライブラリを使用してGoogle Photos APIにアクセスできますが、pip install -t lib/ google-api-python-client Photos APIに関連するものは見当たりません。

REST APIsを手動で呼び出す代わりに、Googleビルドのクライアントライブラリを使用するにはどうすればよいですか?

7
Ido Ran

Ido Ran の例と brillb の例のおかげで、ついに問題も解決しました。上記のドキュメントリンクの一部は、もはや有効ではありません。上記の例を強化しようとすると、ページ Google Photos API が最も便利であることがわかりました。 APIを文書化するだけでなく、リクエストをインタラクティブにテストすることもできます。おそらく、そのテスト機能なしでは機能しませんでした。リクエストを入力すると、cURL、HTTP、またはJAVASCRIPTでコーディング例が表示されますが、Pythonの場合は何も表示されません。

アルバムのリストを作成する以外に、私も興味がありました

  • 各アルバムへのリンク、
  • 画像のリスト(アルバム内かどうか)、
  • 各メディア項目とそれらを見つけるためのURLへのリンク

アルバムへのリンクを取得するには、_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の長いリストを返すので、前者は役に立たないと思いますが、検索では、結果を日付で制限することができ、写真が撮影されました(アップロードされません!)。 getbatchGetもあります。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']}")
_
2
Wilfried

例が見つからなかったため、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()
5
Ido Ran

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']))
5
brillb

APIのドキュメントを確認してください here

より具体的には here です。ただし、かなり制限されているようです。

0
ArdentLearner