我正在使用云端硬盘文件流来访问我的Google云端硬盘文件。
所以我有Python中所有Google Drive文件的列表(使用os.path.walk
),但我想知道是否可以获取文件在线链接。
我在Mac OS X上并使用Finder,通过辅助点击,我有一个选项“使用Google Drive打开”,它可以直接在我的浏览器上打开该文件。我想自动对我的所有文件做同样的事情。
我最近发现了一种更有效的方法来检索位于Google云端硬盘文件流文件系统中的任何给定文件/文件夹的Drive API“文件ID”。虽然我在Windows系统上发现了此功能,但在Mac OS X上可能有类似的功能。
我不确切知道什么机制允许下面描述的功能,但它在功能上几乎与NTFS备用数据流的工作方式相同。问题是,Drive File Stream的虚拟驱动器的属性显示它被分区为FAT32,不支持备用数据流。也许Google的文件系统驱动程序只是模拟NTFS备用数据流的行为。无论如何,Drive File Stream驱动程序添加了一种机制,用于读取附加到其文件系统中的文件/文件夹的特殊元数据。可以通过在任何文件/文件夹路径上调用“ReadFile”来访问此元数据,该路径以冒号后跟,后跟描述要检索的元数据的特殊标识符。这些是我到目前为止发现的标识符(包括其中一些标识符):
在Windows上,从命令行读取此元数据的简单方法是使用“type”命令。以下示例将为您提供位于Google云端硬盘根目录中的文件“test.txt”的Drive API文件ID:
type "G:\My Drive\test.txt:user.drive.id"
注意:如果您在创建新文件/文件夹的某种类型的脚本中使用它并在之后快速阅读“user.drive.id”,请注意,生成“真实”文件ID可能需要几秒钟。如果您读取'user.drive.id'的值并以'local'开头,则表示它尚未生成实际的文件ID。在我看来,处理这个的最好方法是创建一个在检查之间休眠的异步循环,然后在它不再以'local'开头时返回文件id。
我个人并不使用Mac,所以我绝对不是最有资格提供有关其使用建议的人。话虽如此,我确实在Linux上有一些经验,我相信OS X使用了很多相同的命令,因为它是基于Unix的。如果Windows功能直接与OS X(我完全不确定)相关,我相信以下命令应该与上面提供的Windows命令相同:
cat "/Volumes/GoogleDrive/My Drive/test.txt:user.drive.id"
我希望这些信息对您或其他可能遇到此问题的人有用。我知道这对我的Python应用程序非常有价值,因为它允许我使用已经由Drive File Stream缓存的数据,而不必为每个单独的文件(在我的例子中是10个数千个)进行单独的API调用。祝你的项目好运!
如果您已安装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']
我喜欢@lahma的答案,但在OSX / MacOS上它对我不起作用
Google文件流创建由sqlite数据库支持的文件系统。要获取链接的所有文档ID,可以查询sqlite数据库。请注意,如果您要处理大量文件或尝试自动执行某些操作,则只需沿着此路线前进。
查看Google的常见问题解答(https://support.google.com/a/answer/2490100?hl=en),Google文件流使用以下位置作为其本地缓存(默认情况下):
%LOCALAPPDATA%\Google\DriveFS
~/Library/Application Support/Google/DriveFS
在该目录中是一个20字符串,可能是您的id(例如:ZacGF23N0WRAbuY2TI9t
)。
在那里有metadata_sqlite_db
你可以通过sqlite打开它
sqlite metadata_sqlite_db
谷歌驱动器中的所有内容都在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';
此查询将为您提供名为“常见问题”的文件夹中的所有文档:
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;