首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Drive File Stream获取Google Drive文件链接

使用Drive File Stream获取Google Drive文件链接
EN

Stack Overflow用户
提问于 2018-07-20 17:48:34
回答 4查看 4.9K关注 0票数 2

我正在使用Drive File Stream访问我的Google Drive文件。

所以我有Python语言的所有Google Drive文件的列表(使用os.path.walk),但我想知道是否可以在线获取文件链接。

我在Mac上使用Finder,通过第二次点击,我有一个“用Google Drive打开”的选项,它可以直接在我的浏览器上打开文件。我想自动对我的所有文件执行相同的操作。

EN

回答 4

Stack Overflow用户

发布于 2018-08-31 10:32:22

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

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

  • user.drive.id - file/folder
  • user.drive.team_drive_id的驱动API‘文件ID’-文件/文件夹的驱动API‘团队驱动ID’(如果不在团队Drive)
  • user.drive.gdoc中,则为空-如果文件是'Google Docs‘文档,则返回'1’;如果文件是not
  • user.drive.email,则返回'0‘-据我所知,这只是返回驱动文件流登录到的谷歌帐户的电子邮件地址(我尝试在另一个谷歌帐户拥有的文件上调用它,但它仍然返回我的电子邮件address)
  • user.drive.itemprotostr -提供了几乎所有附加到该文件的元数据,包括几乎所有其他identifiers
  • user.drive.md5的输出- file
  • com.apple.FinderInfo的MD5校验和-不确定这是否实际上是一个有效的标识符(因为它在Windows上不起作用)。但是由于我发现它离其他平台很近,而且它可能与您的平台相关,所以我想我应该只在case
  • user.drive.stableid
  • user.drive.pinned
  • user.drive.uncommitted
  • user.drive.progress
  • user.drive.impression
  • user.drive.is_virtual_folder
  • user.drive.thumbnail

中提供它

视窗

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

代码语言:javascript
复制
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命令相同的功能:

代码语言:javascript
复制
cat "/Volumes/GoogleDrive/My Drive/test.txt:user.drive.id"

我希望这些信息对你或任何遇到这一点的人都有用。我知道它对我的Python应用程序非常有价值,因为它允许我使用已经被Drive File Stream缓存的数据,而不是必须为每个单独的文件进行单独的API调用(在我的例子中是数千个文件中的10个)。祝你的项目好运!

票数 8
EN

Stack Overflow用户

发布于 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

  • Mac:~/Library/Application Support/Google/DriveFS

  • 窗口

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

这里面有metadata_sqlite_db

您可以通过sqlite打开它

代码语言:javascript
复制
sqlite metadata_sqlite_db

google drive中的所有内容都在items表中。您可能关心的字段有:

  • stable_id -您将用于连接的名称-您在文件系统上看到的名称
  • id-生成您的链接

所需的内容

您还需要stable_parents表。此表将所有对象链接到其父对象。所以每个文件或文件夹都有一个父文件夹,除了你的根目录My Drive

此查询将按名称(20190312.pdf)查找文件,并显示该文件所在的文件夹:

代码语言:javascript
复制
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’的文件夹中的所有文档:

代码语言:javascript
复制
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;
票数 3
EN

Stack Overflow用户

发布于 2018-07-21 22:15:56

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

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

代码语言:javascript
复制
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有多个结果,那么你可以像这样循环遍历它们:

代码语言:javascript
复制
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']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51439810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档