我正在使用Drive File Stream访问我的Google Drive文件。
所以我有Python语言的所有Google Drive文件的列表(使用os.path.walk),但我想知道是否可以在线获取文件链接。
我在Mac上使用Finder,通过第二次点击,我有一个“用Google Drive打开”的选项,它可以直接在我的浏览器上打开文件。我想自动对我的所有文件执行相同的操作。
发布于 2018-08-31 10:32:22
我最近发现了一种更有效的方法来检索Google Drive File Stream文件系统中任何给定文件/文件夹的Drive API 'File ID‘。虽然我在Windows系统上发现了这一功能,但在Mac上可能也有类似的功能。
我不知道具体是什么机制允许下面描述的功能,但它在功能上几乎与NTFS备用数据流的工作方式相同。问题是,驱动文件流的虚拟驱动器的属性显示它被分区为不支持备用数据流的FAT32。也许Google的文件系统驱动程序只是在模仿NTFS备用数据流的行为。无论如何,驱动器文件流驱动程序添加了一种机制,用于读取附加到位于其文件系统中的文件/文件夹的特殊元数据。可以通过在任何文件/文件夹路径上调用'ReadFile‘来访问此元数据,该文件/文件夹路径的后缀是冒号,后跟一个描述要检索的元数据的特殊标识符。以下是我到目前为止发现的标识符(包括对其中一些标识符的描述):
中提供它
视窗
在Windows上,从命令行读取元数据的一种简单方法是使用'type‘命令。下面的示例将为您提供驻留在Google Drive根目录中的文件'test.txt‘的Drive API文件ID:
type "G:\My Drive\test.txt:user.drive.id"注意:如果你在某些类型的脚本中使用它来创建新的文件/文件夹,然后快速读取'user.drive.id‘,请注意生成“真实”文件id可能需要几秒钟的时间。如果您读取'user.drive.id‘的值,并且它以'local’开头,这意味着它还没有生成实际的文件id。在我看来,处理这个问题的最好方法是创建一个在检查之间休眠的异步循环,然后在文件id不再以“local”开头时返回它。
我个人并不使用Mac,所以我绝对不是最有资格为Mac的使用提供建议的人。话虽如此,我确实有一点Linux的经验,我相信OS X使用了很多相同的命令,因为它是基于Unix的。如果Windows功能与OS X直接相关(我完全不确定),我相信下面的命令应该可以实现与上面提供的Windows命令相同的功能:
cat "/Volumes/GoogleDrive/My Drive/test.txt:user.drive.id"我希望这些信息对你或任何遇到这一点的人都有用。我知道它对我的Python应用程序非常有价值,因为它允许我使用已经被Drive File Stream缓存的数据,而不是必须为每个单独的文件进行单独的API调用(在我的例子中是数千个文件中的10个)。祝你的项目好运!
发布于 2019-03-14 03:24:01
我喜欢@lahma的回答,但它在OSX/MacOS上不适用于我
Google File Stream创建了一个由sqlite数据库支持的文件系统。要获取链接的所有文档id,可以查询sqlite数据库。注意:只有当你有很多文件要处理,或者你想要自动化一些东西时,才值得走这条路。
查看谷歌的常见问题(https://support.google.com/a/answer/2490100?hl=en),谷歌文件流使用以下位置作为其本地缓存(默认情况下):
%LOCALAPPDATA%\Google\DriveFS
~/Library/Application Support/Google/DriveFS
在该目录中有一个20个字符字符串,它可能是您的id (例如:ZacGF23N0WRAbuY2TI9t)。
这里面有metadata_sqlite_db
您可以通过sqlite打开它
sqlite metadata_sqlite_dbgoogle drive中的所有内容都在items表中。您可能关心的字段有:
所需的内容
您还需要stable_parents表。此表将所有对象链接到其父对象。所以每个文件或文件夹都有一个父文件夹,除了你的根目录My Drive。
此查询将按名称(20190312.pdf)查找文件,并显示该文件所在的文件夹:
SELECT
i.stable_id, i.id, i.local_title,
'parent', i2.stable_id, i2.id, i2.local_title
FROM items i
JOIN stable_parents sp ON i.stable_id = sp.item_stable_id
JOIN items i2 ON sp.parent_stable_id = i2.stable_id
WHERE i.local_title = '20190312.pdf';此查询将为您提供名为‘FAQ’的文件夹中的所有文档:
SELECT i.stable_id, i.id, i.local_title
FROM items i
LEFT JOIN stable_parents sp ON i.stable_id = sp.item_stable_id
LEFT JOIN items i2 ON sp.parent_stable_id = i2.stable_id
WHERE i2.local_title = 'FAQ' and i2.is_folder = 1;发布于 2018-07-21 22:15:56
如果你已经安装了Google Drive Python API,那么这应该不会太难。
最简单的方法是查询具有该名称的文件。
query = "name contains %s" % fileName
results = drive_service.files().list(q=query, fields="name, id, parents, webViewLink").execute()
files = results.get('files', [])
if len(files) == 1:
return files[0]['webViewLink']这将返回任何一个结果(万岁!这是您的文件),或者多个结果。如果是后者,您将需要检查您选择的文件是否正确。这可以通过搜索以查看任何返回文件的父文件是否与文件路径的名称匹配来完成。
也就是说,如果你的路径是G:\My Drive\Documents\Clowns.mp4,并且你第一次搜索Clowns.mp4有多个结果,那么你可以像这样循环遍历它们:
for current_file in files:
parent_id = current_file['parents'][0]
parent_folder = drive_service.files().get(fileId=parent_id, fields="name").execute()
if parent_folder['name'] == "Documents":
print("%s is the right file")
return current_file['webViewLink']https://stackoverflow.com/questions/51439810
复制相似问题