使用云端硬盘文件流获取Google云端硬盘文件链接

时间:2018-07-20 09:48:34

标签: python macos google-drive-api

我正在使用云端硬盘文件流来访问我的Google云端硬盘文件。
因此,我有了所有使用Python的Google Drive文件的列表(使用os.path.walk),但我想知道是否可以在线获取文件链接。
我在Mac OS X上并使用Finder,并单击第二次单击,我有一个选项“使用Google云端硬盘打开”,可直接在浏览器中打开文件。我想对所有文件自动执行相同的操作。

3 个答案:

答案 0 :(得分:1)

我最近发现了一种检索位于您Google Drive File Stream文件系统内任何给定文件/文件夹的Drive API'文件ID'的更有效的方法。尽管我在Windows系统上发现了此功能,但Mac OS X上可能有类似的功能。

我不知道到底有什么机制允许以下功能,但其功能与NTFS备用数据流的工作方式几乎相同。事实是,驱动器文件流的虚拟驱动器的属性显示它已被分区为FAT32,不支持备用数据流。也许Google的文件系统驱动程序只是在模仿NTFS备用数据流的行为。无论如何,驱动器文件流驱动程序添加了一种机制,用于读取附加到位于其文件系统内的文件/文件夹的特殊元数据。可以通过在任何后缀有冒号的文件/文件夹路径上调用“ ReadFile”来访问此元数据,后跟一个特殊的标识符,该标识符描述了要检索的元数据。这些是我到目前为止发现的标识符(包括其中的一些描述):

  • user.drive.id -文件/文件夹的驱动器API“文件ID”
  • user.drive.team_drive_id -文件/文件夹的驱动器API“ Team Drive ID”(如果不在Team Drive中,则为空)
  • user.drive.gdoc -如果文件是“ Google Docs”文档,则返回“ 1”;否则,则返回“ 0”
  • user.drive.email -据我所知,这只是返回已登录Drive File Stream的Google帐户的电子邮件地址(我尝试在归另一个Google帐户所有,但仍返回了我的电子邮件地址)
  • user.drive.itemprotostr -提供几乎所有附加到文件的元数据,包括几乎所有这些其他标识符的输出
  • user.drive.md5 -文件的MD5校验和
  • com.apple.FinderInfo -不知道这是否是有效的标识符(因为它在Windows上不起作用),但是由于我发现它与其他标识符非常接近,所以可能与您的平台有关,我想我会以防万一
  • user.drive.stableid
  • user.drive.pinned
  • user.drive.uncommitted
  • user.drive.progress
  • user.drive.impression
  • user.drive.is_virtual_folder
  • user.drive.thumbnail

Windows

在Windows上,从命令行读取此元数据的一种简单方法是使用“ type”命令。以下示例将为您提供位于Google云端硬盘根目录中的文件“ test.txt”的云端硬盘API文件ID:

type "G:\My Drive\test.txt:user.drive.id"

注意:如果您正在某种类型的脚本中使用此脚本来创建新文件/文件夹,然后快速读取“ user.drive.id”,请注意,“真实”文件ID可能需要花费几秒钟的时间被生成。如果您读取'user.drive.id'的值并且它以'local'开头,则意味着它尚未生成实际的文件ID。我认为,解决此问题的最佳方法是创建一个在检查之间休眠的异步循环,然后在不再以“本地”开头时返回文件ID。

我个人不使用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调用(在我的情况下为上万个)。祝您项目顺利!

答案 1 :(得分:0)

如果您已经安装了Google Drive Python API,那么这应该不太困难。

最简单的方法是对具有该名称的文件运行查询。

55,55,55,55

这将返回一个结果(hooray!这是您的文件)或多个结果。如果是后者,则需要检查您选择的文件是否正确。可以通过搜索是否返回的任何文件的父项与文件路径的名称匹配来完成此操作。

也就是说,如果您的路径为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

答案 2 :(得分:0)

我喜欢@lahma的答案,但在OSX / MacOS上对我而言这种方式不起作用

Google File Stream创建一个由sqlite数据库支持的文件系统。要获取链接的所有文档ID,您可以查询sqlite数据库。请注意,只有当您要处理大量 个文件或试图使某些文件自动化时,才值得沿着这条路线走。

请参阅Google的常见问题解答(https://support.google.com/a/answer/2490100?hl=en),Google File Stream将以下位置用于其本地缓存(默认情况下):

  • Windows:%LOCALAPPDATA%\Google\DriveFS
  • Mac:~/Library/Application Support/Google/DriveFS

该目录中有一个20个字符的字符串,可能是您的ID(例如:ZacGF23N0WRAbuY2TI9t)。

其中有metadata_sqlite_db

您可以通过sqlite打开它

sqlite metadata_sqlite_db

Google云端硬盘中的所有内容都在items表中。您可能关心的字段是:

  • stable_id-您将用于本地连接的内容
  • local_title-您在文件系统上看到的名称
  • id-生成链接所需的内容

您还将需要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;