繁体   English   中英

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

[英]Get Google Drive files links using Drive File Stream

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

我最近发现了一种更有效的方法来检索位于您的 Google Drive File Stream 文件系统中的任何给定文件\/文件夹的 Drive API“文件 ID”。 虽然我在 Windows 系统上发现了这个功能,但在 Mac OS X 上可能也有类似的功能。

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

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

    视窗<\/h1>

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

    注意:如果您在某种类型的脚本中使用它来创建新文件\/文件夹并在之后快速读取“user.drive.id”,请注意,生成“真实”文件 id 可能需要几秒钟. 如果你读取'user.drive.id'的值并且它以'local'开头,这意味着它还没有生成一个实际的文件id。 在我看来,处理这个问题的最好方法是创建一个在检查之间休眠的异步循环,然后在它不再以“本地”开头时返回文件 ID。

    我个人不使用 Mac,所以我绝对不是最有资格就其使用提供建议的人。 话虽如此,我确实在 Linux 方面有一些经验,而且我相信 OS X 使用很多相同的命令,因为它是基于 Unix 的。 如果 Windows 功能与 OS X 直接相关(我完全不确定),我相信以下命令应该与上面提供的 Windows 命令实现相同的功能:

    我希望此信息对您或可能遇到此问题的任何其他人有用。 我知道这对我的 Python 应用程序非常有价值,因为它允许我使用已由 Drive File Stream 缓存的数据,而不必为每个单独的文件进行单独的 API 调用(在我的情况下是成千上万个文件)。 祝你的项目好运!

    "

我喜欢@lahma 的回答,但它在 OSX/MacOS 上对我不起作用

Google File Stream 创建一个由 sqlite 数据库支持的文件系统。 要获取链接的所有文档 ID,可以查询 sqlite 数据库。 请注意,只有当您有很多文件要通过或者您正在尝试自动化某些事情时,才值得沿着这条路线走。

查看 Google 的常见问题解答 ( https://support.google.com/a/answer/2490100?hl=en),Google文件流使用以下位置作为其本地缓存(默认情况下):

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

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

里面有metadata_sqlite_db

您可以通过 sqlite 打开它

sqlite metadata_sqlite_db

谷歌驱动器中的所有内容都在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;

如果您已经安装了 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']

下面是我在尝试使用 python 获取文件 ID 时避免“本地”问题的解决方案:

...
shareable_link = get_shareable_link(file_path)
while 'local-' in shareable_link:
  shareable_link = get_shareable_link(file_path)
  sleep(1) # could be incremental instead of 1 second always
  print('trying to avoid local- issue...')
...

# get shareable link for a file in Google Drive
def get_shareable_link(file_path, return_URL=False):
  fid = getoutput("xattr -p 'user.drive.id' " + "'" + file_path + "'")
  # for testing
  if return_URL:
    return HTML(f"<a href=https://drive.google.com/file/d/{fid} target=_blank>Click Me!</a>")
  else:
    return "https://docs.google.com/uc?export=download&id=" + fid

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM