【问题标题】:google photos API谷歌照片 API
【发布时间】:2021-01-13 06:28:43
【问题描述】:

有没有办法遍历某个相册、谷歌照片中的所有项目? 我正在使用谷歌照片提供的 API,据我所知,我一次只能访问 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

感谢您的帮助

【问题讨论】:

    标签: python google-photos-api


    【解决方案1】:

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

    pageToken:获取下一页结果的延续令牌。将此添加到请求中会返回 pageToken 之后的行。 pageToken应该是listMediaItems请求响应中nextPageToken参数返回的值。

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

    修改脚本:

    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

    【讨论】:

    • 谢谢。据我了解,这会遍历所有专辑中的所有媒体项目,对吗?有没有办法做确切的事情,但在一些特定的专辑?
    • @Hadar Sharvit 感谢您的回复。是的。在我提出的第一个修改脚本中,从所有专辑中检索项目列表。如果您想从特定相册中检索项目列表,请查看我的答案中添加的示例脚本。如果这不是您期望的方向,我深表歉意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2020-06-07
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多