Доступ к Google Photo API через Python с помощью google-api-python-client - PullRequest
0 голосов
/ 28 мая 2018

Согласно странице клиентских библиотек Google API можно получить доступ к API Google Photos с помощью клиентской библиотеки Python, но после установки с помощью pip install -t lib/ google-api-python-client я не вижу ничего, связанного с Photos API.

Как использовать встроенную клиентскую библиотеку Google вместо вызова API REST вручную?

Ответы [ 4 ]

0 голосов
/ 15 июня 2019

Благодаря примерам 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']}")
0 голосов
/ 29 мая 2018

Я не нашел ни одного примера, поэтому взял пример Drive API v3 и адаптировал его к API Photos v1.

Вы можете увидеть и использовать пример .

Суть:

from apiclient.discovery import build

service = build('photoslibrary', 'v1', http=creds.authorize(Http()))
results = service.albums().list(
    pageSize=10, fields="nextPageToken,albums(id,title)").execute()
0 голосов
/ 02 января 2019

API немного менее способен, чем указано в примере выше, он не поддерживает "поля".Но это работает:

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('token-for-google.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('client_id.json', SCOPES)
    creds = tools.run_flow(flow, store)
gdriveservice = build('photoslibrary', 'v1', http=creds.authorize(Http()))

results = gdriveservice.albums().list(
    pageSize=10).execute()
items = results.get('albums', [])
for item in items:
        print(u'{0} ({1})'.format(item['title'].encode('utf8'), item['id']))
0 голосов
/ 28 мая 2018

Ознакомьтесь с документацией API здесь .

А более конкретно здесь .Кажется, довольно ограниченный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...