无法从 Google Drive API 检索 thumbnailLink

Posted

技术标签:

【中文标题】无法从 Google Drive API 检索 thumbnailLink【英文标题】:Can not retrieve thumbnailLink from google drive API 【发布时间】:2020-10-07 21:18:41 【问题描述】:

我正在尝试使用 python 和 google Drive API 从共享驱动器中的文件中获取 thumbnailLink,但是,文件信息不包括 thumbnailLink(尽管对于大多数文件,hasThumbnail 字段,我确实将其作为字段对于文件,值为 true)

我环顾四周,发现的解决方案似乎都不起作用(尽管这是我的第一个 python 项目以及我的第一个 google drive api 项目,所以我可能只是不知道我在做什么)

我尝试过的: - 将范围设置为“https://www.googleapis.com/auth/drive”(之前是 ..drive.metadata.readonly) - 使用通配符:results = drive.files().list(pageSize=10, fields="*",blablabla...)。例如,如果我尝试 fields="thumbnailLink" 它找不到任何文件。 - 获得列表后,我尝试使用该列表中每个文件的 ID 来执行 file = service.files().get(fileId=item_id, supportsAllDrives=True, fields="*").execute() 但同样的情况发生了,我有许多字段,包括设置为 true 的 hasThumbnail 字段,但没有缩略图链接。 - 我尝试使用官方网站上的“Try this API”控制台,实际上我确实获得了thumbnailLink! (具有与上述相同的参数)。所以我不明白为什么在我的应用程序请求时缺少它。

编辑(代码): 我有这样一种方法

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)

另外,是的,我确实使用服务帐户,我可以检索我需要的所有文件,而不是缩略图链接。

我认为调用 list() 然后调用 get() 是没有意义的,但我读到可以通过 get() 方法解决问题,但在我的情况下它不起作用。

【问题讨论】:

我能问你的问题吗? 1. 请问您要检索缩略图链接的文件的mimeType 吗? 2. 我可以查看您当前的脚本来复制您的问题吗? 你能提供你的完整代码吗?您使用的是服务帐号吗? 您好,感谢您的快速回复!我已经更新了上面的问题,如果您还有其他问题,请告诉我 【参考方案1】:

问题在于响应的结构

如果您指定fields="*",则响应将类似于


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

所以,thumbnailLink 嵌套在 files 内。

为了检索它,请指定:

fields='files(id, thumbnailLink)'

【讨论】:

谢谢,但这并不能解决问题。我已经尝试过你的实现,但是我只得到了返回的 id,没有 thumbnailLink。除此之外,如果我将“items”对象而不是“getItems”对象传递给上下文,我已经在items = results.get('files', []) 行中检索了“文件”部分你放在这里的模型json几乎就是我得到的,只是 thumbnailLink 字段完全丢失(即使对于那些具有“hasThumbnail:true”的项目 所以当你指定fields="*"你得到"hasThumbnail": true但同时thumbNailLink是空的?只有当您使用服务帐户检索文件 n Python 时才会发生这种情况,而不是当您以您身份进行身份验证或使用 Try this API? 完全正确。当我指定fields="*" 时,我得到"hasThumbnail"=true,甚至是缩略图版本,但没有thumbnailLinkTry this API 具有完全相同的复制粘贴参数确实返回了链接,而当我的应用程序接收到数据时,没有链接。 听起来像是服务帐户的权限问题。您是否在没有服务帐户或模拟的情况下以编程方式尝试? 我所做的是使用可以访问文件的现有用户帐户并为该帐户创建 API 密钥和所有内容。那有意义吗? (不太确定我是否理解这个问题,我认为我只是对此不熟悉)

以上是关于无法从 Google Drive API 检索 thumbnailLink的主要内容,如果未能解决你的问题,请参考以下文章

我们可以从 Android 中的 Google Drive API 检索数据吗?

如何使用 Google 服务帐户通过 Activity API 检索 Google Drive 活动?

在 Google API 资源管理器中检索到 Google Drive 网络视图链接,但在我的代码中没有

使用 REST api 从 Google Drive 下载图片

Google Drive API无法找到任何文件夹

如何从我的应用程序访问 google drive api