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

时间:2020-10-23 09:35:05

标签: python google-api google-drive-api google-api-python-client

我正在尝试检索Google云端硬盘中的所有文件,但仅检索“我的云端硬盘”中的文件。我尝试在查询中包括“所有者中的我”,但这使我在拥有者的共享文件夹中拥有大量文件。我在查询中尝试了“父母的'root'”,但这只返回了直接在“我的云端硬盘”下的文件,而我还需要这些子文件夹的子文件夹和子文件夹下的文件,等等。

我也尝试设置drive参数,但是在这种情况下,查询根本不检索任何内容:


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

如何使它正常工作?

我猜另一种可能性是从根开始,找孩子,然后递归地导航整棵树,但这将非常缓慢。如果我获取了所有文件,然后找出所有父母来检查它们是否在“我的云端硬盘”中,则我的文件过多,需要花费几个小时。

谢谢!

2 个答案:

答案 0 :(得分:1)

您提出的第一个请求将是对父母的根本要求。这是您的驱动器帐户的最高级别。

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

现在,您将需要循环遍历代码中的结果。检查是否为目录'application/vnd.google-apps.folder'的mime类型不是目录的所有内容都应该是位于Google云端硬盘帐户根目录中的文件。

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

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

然后可以循环获取每个目录中的所有文件。看起来像是一个已知的错误Drive.Files.list query throws error when using "sharedWithMe = false"

与我分享

您还可以在q参数中设置SharedWithMe = false,这将删除与您共享的所有文件。导致它只返回实际属于您的文件。

这曾经可以工作,但是我目前在测试时遇到问题。

速度。

事情如前所述,files.list默认情况下将仅返回所有内容,但不返回任何顺序,因此从技术上讲,您可以执行file.list并添加sharedwithme并获取驱动器帐户上的所有文件和目录。通过请求页面大小为1000,您的请求将减少。然后将其全部关闭在本地计算机上进行排序。

另一个选择是按照我上面的描述进行操作,然后依次获取每个目录。这可能会导致更多请求。

答案 1 :(得分:0)

在此处可能会使用Google驱动器API v3和python 3.7+的修复

使用以下语法:

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

此查询传递给service.files()。list方法应该可以为您提供所需的信息。您拥有的所有文件夹的列表,这是我能找到的最佳解决方法。 “ 所有者中的“我” ”是这里的关键。

完整的代码段在这里:

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')))