google 张照片 API

google photos API

有没有办法遍历某些相册中 google 照片中的所有项目? 我正在使用 API 提供的 google 照片,据我所知,我一次只能访问 100 个媒体项目,使用以下方法:

def create_service(client_secret_file, api_name, api_version, scopes):
    print(client_secret_file, api_name, api_version, scopes, sep=', ')
    SCOPES = [scope for scope in scopes[0]]
    cred = None
    pickle_file = f'token_{api_name}_{api_version}.pickle'
    if os.path.exists(pickle_file):
        with open(pickle_file, 'rb') as token:
            cred = pickle.load(token)

    if not cred or not cred.valid:
        if cred and cred.expired and cred.refresh_token:
            cred.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                client_secret_file, SCOPES)
            cred = flow.run_local_server()

        with open(pickle_file, 'wb') as token:
            pickle.dump(cred, token)

    service = build(api_name, api_version, credentials=cred)
    print(api_name, 'service created successfully')
    return service




service = create_service(CLIENT_SECRET_FILE, API_NAME, API_VERSION, SCOPES)
media = service.mediaItems().list(pageSize=MEDIA_TO_SHOW).execute()

其中所有大写字母都是一些不相关的字符串和 int 常量,表示 api 的名称、可访问的范围等...(为了便于阅读)。具体来说,MEDIA_TO_SHOW = 100

感谢您的帮助

在Google Photos API中的“mediaItems.list”的方法中,pageSize的最大值为100。当你想检索更多的项目时,它需要使用 pageToken。在pageToken的官方文档中是这样说的

pageToken: A continuation token to get the next page of the results. Adding this to the request returns the rows after the pageToken. The pageToken should be the value returned in the nextPageToken parameter in the response to the listMediaItems request.

当这反映到您的脚本中时,它将变成如下。

修改后的脚本:

service = create_service(CLIENT_SECRET_FILE, API_NAME, API_VERSION, SCOPES)

# I modified below script.
MEDIA_TO_SHOW = 100
mediaItemList = []
pageToken = ""
while True:
    res = service.mediaItems().list(pageSize=MEDIA_TO_SHOW, pageToken=pageToken if pageToken != "" else "").execute()
    mediaItems = res.get('mediaItems', [])
    mediaItemList.extend(mediaItems)
    pageToken = res.get('nextPageToken')
    if not pageToken:
        break

print(len(mediaItemList))  # You can see the number of items here.
  • 在这个脚本中,假设你的service可以用于service.mediaItems().list()的方法。

参考:

已添加:

如果要从特定相册中检索项目列表,请使用以下脚本。

修改后的脚本:

service = create_service(CLIENT_SECRET_FILE, API_NAME, API_VERSION, SCOPES)

# I modified below script.
album_id = "###"  # Please set the album ID.
MEDIA_TO_SHOW = 100
mediaItemList = []
pageToken = ""
while True:
    body = {
        "albumId": album_id,
        "pageToken": pageToken if pageToken != "" else "",
        "pageSize": MEDIA_TO_SHOW
    }
    res = service.mediaItems().search(body=body).execute()
    mediaItems = res.get('mediaItems', [])
    mediaItemList.extend(mediaItems)
    pageToken = res.get('nextPageToken')
    if not pageToken:
        break

print(len(mediaItemList))  # You can see the number of items here.

参考:

-Method: mediaItems.search