首页 > 解决方案 > Google Photos API + python:工作的非弃用示例

问题描述

我一直在寻找这样的代码示例组合。但是没有维护的库(google-auth)+完整的工作示例。google-api-python-client并且oauth2client不再受支持(https://github.com/googleapis/google-api-python-client/issues/651)。

这是一个不推荐使用的库的工作示例,但我希望看到一些允许完全访问 api 的示例(按 albumId 搜索目前不适用于此库):

from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools

# Setup the Photo v1 API
SCOPES = 'https://www.googleapis.com/auth/photoslibrary.readonly'
store = file.Storage('credentials.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
    creds = tools.run_flow(flow, store)
service = build('photoslibrary', 'v1', http=creds.authorize(Http()))

# Call the Photo v1 API
results = service.albums().list(
    pageSize=10, fields="nextPageToken,albums(id,title)").execute()
items = results.get('albums', [])
if not items:
    print('No albums found.')
else:
    print('Albums:')
    for item in items:
        print('{0} ({1})'.format(item['title'].encode('utf8'), item['id']))

标签: pythongoogle-photos-apigoogle-auth-library

解决方案


  • 您想使用google_auth而不是oauth2client,因为oauth2client已弃用。
  • 您已经能够使用 Photo API。

如果我的理解是正确的,这个答案怎么样?请认为这只是几个可能的答案之一。

例如,授权的示例脚本可以在Drive API with python 的快速入门中看到。您可以看到安装库的方法。使用它,您的脚本可以修改如下。

修改后的脚本:

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request


def main():
    credentialsFile = 'credentials.json'  # Please set the filename of credentials.json
    pickleFile = 'token.pickle'  # Please set the filename of pickle file.

    SCOPES = ['https://www.googleapis.com/auth/photoslibrary']
    creds = None
    if os.path.exists(pickleFile):
        with open(pickleFile, 'rb') as token:
            creds = pickle.load(token)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                credentialsFile, SCOPES)
            creds = flow.run_local_server()
        with open(pickleFile, 'wb') as token:
            pickle.dump(creds, token)

    service = build('photoslibrary', 'v1', credentials=creds)

    # Call the Photo v1 API
    results = service.albums().list(
        pageSize=10, fields="nextPageToken,albums(id,title)").execute()
    items = results.get('albums', [])
    if not items:
        print('No albums found.')
    else:
        print('Albums:')
        for item in items:
            print('{0} ({1})'.format(item['title'].encode('utf8'), item['id']))


if __name__ == '__main__':
    main()
  • 关于检索专辑列表的脚本,使用了您的脚本。
  • 当您运行此脚本时,首先会运行授权过程。所以请授权范围。此过程只需要运行一次。但是如果你想改变范围,请删除pickle文件并重新授权。

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

添加1:

如果你想使用mediaItems.search 的方法,下面的示例脚本怎么样?关于授权脚本,请使用上面的脚本。

示例脚本:

service = build('photoslibrary', 'v1', credentials=creds)
albumId = '###'  # Please set the album ID.
results = service.mediaItems().search(body={'albumId': albumId}).execute()
print(results)

添加2:

  • 您想googleapiclient从我建议的上述示例脚本中删除。
  • 您想使用google_auth_oauthlib.flow和检索访问令牌google.auth.transport.requests
  • 您想使用request没有googleapiclient.

如果我的理解是正确的,那么这个示例脚本怎么样?

示例脚本:

在使用此脚本之前,请先设置albumId.

from __future__ import print_function
import json
import pickle
import os.path
import requests
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request


def main():
    credentialsFile = 'credentials.json'
    pickleFile = 'token.pickle'

    SCOPES = ['https://www.googleapis.com/auth/photoslibrary.readonly']
    creds = None
    if os.path.exists(pickleFile):
        with open(pickleFile, 'rb') as token:
            creds = pickle.load(token)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                credentialsFile, SCOPES)
            creds = flow.run_local_server()
        with open(pickleFile, 'wb') as token:
            pickle.dump(creds, token)

    albumId = '###'  # <--- Please set the album ID.

    url = 'https://photoslibrary.googleapis.com/v1/mediaItems:search'
    payload = {'albumId': albumId}
    headers = {
        'content-type': 'application/json',
        'Authorization': 'Bearer ' + creds.token
    }
    res = requests.post(url, data=json.dumps(payload), headers=headers)
    print(res.text)


if __name__ == '__main__':
    main()

笔记:

  • 在这种情况下,您可以同时使用 和 的https://www.googleapis.com/auth/photoslibrary.readonly范围https://www.googleapis.com/auth/photoslibrary

参考:


推荐阅读