问题描述
有没有办法迭代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.