簡體   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