Не удается получить ссылку на thumbnailLink из Google Drive API - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь получить thumbnailLink из файлов с общего диска, используя python и API Google Диска, однако информация о файле не включает thumbnailLink (хотя для большинства файлов поле hasThumbnail, которое я получаю как поле для файла имеет значение true)

Я много оглядывался, и ни одно из найденных мной решений не работает (хотя это мой первый проект python, а также мой первый google drive api project, поэтому я могу просто не знать, что делаю)

Что я пробовал: - установка области действия на 'https://www.googleapis.com/auth/drive' (было ..drive. metadata.readonly ранее) - с использованием подстановочного знака как такового: results = drive.files().list(pageSize=10, fields="*",blablabla...). Если я, например, попробую fields = "thumbnailLink", он не найдет никаких файлов. - после получения списка я попытался использовать идентификатор каждого файла из этого списка, чтобы сделать file = service.files().get(fileId=item_id, supportsAllDrives=True, fields="*").execute(), но происходит то же самое, у меня много полей, включая поле hasThumbnail, для которого установлено значение true, но нет ссылки на миниатюру. - Я пробовал использовать консоль «Попробуйте этот API» на официальном сайте, где я действительно получил ссылку на миниатюру !! (с теми же параметрами, что и выше). Поэтому я не понимаю, почему этого не хватает по запросу из моего приложения.

Изменить (код): у меня есть один такой метод

SCOPES = ['https://www.googleapis.com/auth/drive']

def getDrive():
    """Shows basic usage of the Drive v3 API.
    Prints the names and ids of the first 10 files the user has access to.
    """
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=53209)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('drive', 'v3', credentials=creds)
    return service

, затем я вызываю его отсюда и также получаю файлы:

def getFiles(request):
    drive = getDrive()
    # Call the Drive v3 API
    results = drive.files().list(
        pageSize=10, fields="*", driveId="blabla", includeItemsFromAllDrives=True, corpora="drive", supportsAllDrives=True).execute()

    items = results.get('files', [])
    getItems = []
    for item in items:
        item_id = item['id']
        getItems.append(drive.files().get(fileId=item_id, supportsAllDrives=True, fields="*").execute())
    if not items:
        print('No files found.')
    else:
        print('Files:')
        print(getItems)
        for item in items:
            # print(u'{0} ({1})'.format(item['name'], item['id']))
            print(item)

    return render(request, "index.html", {'files': getItems})

Кроме того, да, я использую учетную запись службы, я могу получить все файлы, которые мне нужны, только не thumbnailLink.

Я не думаю, что это делает имеет смысл вызвать list (), а затем также get (), но я читал, что проблема может быть решена с помощью метода get (), который в моем случае не сработал.

1 Ответ

0 голосов
/ 19 июня 2020

Проблема в структуре ответа

Если вы укажете fields="*", ответ будет примерно таким:

{
 "kind": "drive#fileList",
  ...
 "files": [
  {
   "kind": "drive#file",
    ...
   "hasThumbnail": true,
   "thumbnailLink": "XXX",
   "thumbnailVersion": "XXX"
    ...
  }
  ..
 ]
}

Итак, thumbnailLink вложен внутри files.

Чтобы получить его, укажите:

fields='files(id, thumbnailLink)'

...