google photos API 修改后的脚本:参考:修改后的脚本:参考:

问题描述

有没有办法迭代Google相册中某个相册中的所有项目? 我正在使用google photos提供的API,据我所知,我一次只能使用以下内容访问100个媒体项目:

def create_service(client_secret_file,api_name,api_version,scopes):
    print(client_secret_file,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,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:用于获取结果下一页的继续标记。将其添加到请求中将返回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,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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...