Благодаря примерам Ido Ran и brillb я, наконец, тоже решил свою проблему.Некоторые из приведенных выше ссылок на документацию больше не действительны.Пытаясь улучшить приведенные выше примеры, я нашел страницу API Google Фото наиболее полезной.Он не только документирует API, но и позволяет вам тестировать ваши запросы в интерактивном режиме - я, вероятно, никогда не заставлял его работать без этой возможности тестирования.После ввода вашего запроса вы можете увидеть пример кода в cURL, HTTP или JAVASCRIPT - но ничего для Python.
Помимо создания списка моих альбомов, меня также интересовала
- ссылка на каждый альбом,
- список изображений (в альбомах или нет),
- ссылка на каждый элемент мультимедиа и URL-адрес для их поиска
Чтобы получить ссылку на альбомы, вы можете расширить приведенные выше примеры, просто получив item['productUrl']
.Однако во многих случаях URL не работал для меня в Firefox, IE или Edge (ошибка 404 после очень краткого показа альбома), но в Chrome и Opera (кто знает почему).
Гораздо надежнеекажется, что URL обложки альбома: item['coverPhotoMediaItemId']
и там вы найдете ссылки на альбом (ы) в Info .
Вместо использования метода albums
, вы также можете получить доступ к sharedAlbums
(и указать results.get('sharedAlbums', [])
. Я надеялся получить возможность shareableUrl
, но так и не нашел ресурс ShareInfo
как часть результатов.
ДляСписок изображений, у вас есть выбор из двух методов: mediaItems.list
и mediaItems.search
. Я не считаю первый полезным, поскольку он возвращает длинный список всех ваших изображений, хотя поиск позволяет ограничить результаты датой, фотография была сделана (не загружена!). Также есть get
и batchGet
, я никогда не пробовал, потому что вам нужно знать идентификатор элемента, присвоенный изображениюGoogle photos.
Каждый метод имеет ограничение (pageSize
) для максимама записей для возвращения.Если их больше, он также отправляет pageToken
, который можно использовать для запроса следующей части.
Я наконец-то придумал этот пример:
from os.path import join, dirname
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
SCOPES = 'https://www.googleapis.com/auth/photoslibrary.readonly'
store = file.Storage(join(dirname(__file__), 'token-for-google.json'))
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets(join(dirname(__file__), 'client_id.json', SCOPES))
creds = tools.run_flow(flow, store)
google_photos = build('photoslibrary', 'v1', http=creds.authorize(Http()))
day, month, year = ('0', '6', '2019') # Day or month may be 0 => full month resp. year
date_filter = [{"day": day, "month": month, "year": year}] # No leading zeroes for day an month!
nextpagetoken = 'Dummy'
while nextpagetoken != '':
nextpagetoken = '' if nextpagetoken == 'Dummy' else nextpagetoken
results = google_photos.mediaItems().search(
body={"filters": {"dateFilter": {"dates": [{"day": day, "month": month, "year": year}]}},
"pageSize": 10, "pageToken": nextpagetoken}).execute()
# The default number of media items to return at a time is 25. The maximum pageSize is 100.
items = results.get('mediaItems', [])
nextpagetoken = results.get('nextPageToken', '')
for item in items:
print(f"{item['filename']} {item['mimeType']} '{item.get('description', '- -')}'"
f" {item['mediaMetadata']['creationTime']}\nURL: {item['productUrl']}")