mediaItems.search_next () возвращает 400 - PullRequest
1 голос
/ 24 мая 2019

Невозможно получить все результаты mediaItems.search:

photos = google.get_service(credentials, 'photoslibrary', 'v1')
request = photos.albums().list(pageSize=50)
while request is not None:
    result = request.execute()
    for album in result['albums']:
        request2 = photos.mediaItems().search(body={'albumId': album['id']})
        while request2 is not None:
            result2 = request2.execute()
            request2 = photos.mediaItems().search_next(request2, result2)
            print('nextpageToken' in result2, request2)
    request = photos.albums().list_next(request, result)

Запуск этого не удастся при первом вызове search_next () с

[...]
  File "/usr/local/lib/python3.7/dist-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/googleapiclient/http.py", line 851, in execute
    raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://photoslibrary.googleapis.com/v1/mediaItems:search?alt=json returned "Invalid JSON payload received. Unexpected end of string. Expected an object key or }.

Это не библиотека недействительно поддерживается кажется, так что может быть проблема, или я что-то здесь упускаю?

Ответы [ 2 ]

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

Если результатов больше, чем указанное pageSize, API возвращает pageToken, вы должны использовать для запроса следующую часть.См. Пример здесь Доступ к Google Photo API через Python с помощью google-api-python-client

0 голосов
/ 26 мая 2019

google-api-python-client является универсальным клиентом для всех основанных на обнаружении API Google и поэтому поддерживает все API, основанные на этом протоколе, включая Photos.

Правильный способ использования сервисов состоит в том, чтобы вызвать метод build и после этого использовать доступные методы сервисов.

Помимо этого вы всегда хотите использовать list_next как search_nextне существует.

Вот пример API фотографий, работающего на моем ноутбуке (python 3.6)

import os
import pickle

from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

SCOPES = ['https://www.googleapis.com/auth/photoslibrary.readonly', ]


# we check if we save the credentials in the past and we reuse them
if not os.path.exists('credentials.dat'):

    # no credentials found, we run the standard auth flow
    flow = InstalledAppFlow.from_client_secrets_file('client_id.json', SCOPES)
    credentials = flow.run_local_server()

    with open('credentials.dat', 'wb') as credentials_dat:
        pickle.dump(credentials, credentials_dat)
else:
    with open('credentials.dat', 'rb') as credentials_dat:
        credentials = pickle.load(credentials_dat)

if credentials.expired:
    credentials.refresh(Request())

photos_sdk = build('photoslibrary', 'v1', credentials=credentials)

# photos API
photos_albums_api = photos_sdk.albums()
photos_mediaitems_api = photos_sdk.mediaItems()

albums_list_params = {
    'pageSize': 50,
}

# first request
albums_list_req = photos_albums_api.list(**albums_list_params)

while albums_list_req is not None:
    photos_albums_list = albums_list_req.execute()

    # print(photos_albums_list)

    for album in photos_albums_list['albums']:
        print(album['title'])

        mediaitems_search_req = photos_mediaitems_api.search(body={'albumId': album['id']})

        while mediaitems_search_req is not None:
            mediaitems_search = mediaitems_search_req.execute()

            print(mediaitems_search)

            # mediaItems pagination management
            mediaitems_search_req = photos_mediaitems_api.list_next(mediaitems_search_req, mediaitems_search)

    # albums pagination handling
    albums_list_req = photos_albums_api.list_next(albums_list_req, photos_albums_list)
...