Google 云端硬盘 API 仅在“我的云端硬盘”中搜索文件

Google Drive API search for files only in My Drive

我正在尝试检索 Google 驱动器中的所有文件,但仅检索 'My Drive' 中的文件。我尝试在查询中包含“'me' in owners”,但这给了我共享文件夹中我是所有者的大量文件。我在查询中尝试了“'root' in parents”,但这只返回我的驱动器直接下的文件,而我还需要子文件夹和子文件夹下的文件等。

我也尝试设置驱动器参数,但在这种情况下,查询根本没有检索到任何内容:


driveid = service.files().get(fileId='root').execute()['id']

page_token = None
my_files = list()
while True:
    results = service.files().list(q= "'myemail@gmail.com' in owners",
                                    pageSize=10,
                                    orderBy='modifiedTime',
                                    pageToken=page_token,
                                    spaces = 'drive',
                                    corpora='drive',
                                    driveId = driveid, 
                                    includeItemsFromAllDrives=True,
                                    supportsAllDrives=True,
                                    fields="nextPageToken, files(id, name)").execute()
    items = results.get('files', [])
    my_files.extend(items)
    page_token = results.get('nextPageToken', None)
    if page_token is None:
        break

print(len(my_files))
# This prints: 0

我怎样才能让它工作?

我想另一种可能性是从根开始,得到 children 并递归地导航整个树,但这会非常慢。如果我获取所有文件然后找出所有 parents 以检查它们是否在我的驱动器中,这同样适用,我的文件太多,这需要几个小时。

提前致谢!

您提出的第一个请求是 parents 在 root 中。这是您的云端硬盘帐户的顶层。

results = service.files().list(q= "root in parents").execute()

现在您需要在代码中循环遍历此处的结果。检查 MIME 类型是否为目录 'application/vnd.google-apps.folder' 不是目录的所有内容都应该是位于 Google 驱动器帐户根目录中的文件。

现在您找到的所有这些目录您可以做的是发出新请求以找出这些目录中的文件

results = service.files().list(q= "directorIDFromLastRequest in parents").execute()

然后您可以循环获取每个目录中的所有文件。看起来它是一个已知错误 Drive.Files.list 查询在使用“sharedWithMe = false”时抛出错误

与我分享

您还可以在 q 参数中设置 SharedWithMe = false,这样应该会删除与您共享的所有文件。使其仅 return 实际属于您的文件。

这曾经有效,但我目前在测试时遇到问题。

速度。

如前所述,files.list 默认情况下只是 return 所有内容,但没有顺序,所以从技术上讲,您可以执行 file.list 并添加 sharedwithme 并取回所有您驱动器帐户上的文件和目录。通过请求 1000 的页面大小,您将有更少的请求。然后在你的机器上对它进行本地排序。

另一种选择是按照我上面写的那样依次获取每个目录。这可能会导致更多请求。

可能在此处使用 google 驱动器 API v3 和 python 3.7+

进行修复

使用以下语法:

q="mimeType='application/vnd.google-apps.folder' and trashed = false and 'me' in owners"

传递给 service.files().list 方法的查询应该可以满足您的需求。您拥有的所有文件夹的列表,这是我能找到的最佳解决方法。 “'me' in owners”是这里的关键。

此处为完整代码段:

response = service.files().list(q="mimeType='application/vnd.google-apps.folder' and trashed = false and 'me' in owners",
                                spaces='drive',
                                fields='nextPageToken, files(id, name)',
                                pageToken=page_token).execute()

for file in response.get('files', []):
    # Process change
    print ('Found file: %s (%s)' % (file.get('name'), file.get('id')))