上載檔案到自己的 Google雲端帳戶,或從自己的 Google雲端帳戶下載檔案,是非常簡單
最近幫朋友剪輯影片,對方將大量檔案存放到 Google雲端硬碟,每個檔案都超過 1GB
發現下載大量大型載檔案非常不方便……
一般從其他公開的 Google雲端帳戶的位置下載檔案都是使用網頁瀏覽器
如果只是一個檔案便會立即下載;但如果是多個檔案,便需要先將選取的檔案壓縮成一個 ZIP檔案,才開始下載
如果檔案不是大型檔案,時間還不太長;但如果是大型檔案,先壓縮再下載,所花的時間便會很長
而且這種方法受制於相同 Google雲端的資料夾的檔案,如果檔案分散在不同資料夾,仍然需要逐一處理
這個狀態會非常浪費時間,而且需要安份地在電腦前(或最少需要遙距控制)手動操作
Google檔案類型
由於 Google雲端硬碟 與 Google文件編輯器 整合Google 有幾種檔案能夠轉換成一般檔案
Google檔案類型 | MIME類型 | 可轉轉換格式 |
---|---|---|
Google文件 | application/vnd.google-apps.document | DOCX, ODT, RTF, PDF, TXT, HTML.ZIP, EPUB |
Google試算表 | application/vnd.google-apps.spreadsheet | XLSX, ODS, PDF, HTML.ZIP, CSV, TSV |
Google簡報 | application/vnd.google-apps.presentation | PPTX, ODP, PDF, TXT, JPG, PNG, SVG |
Google繪圖 | application/vnd.google-apps.drawing | PDF, JPG, PNG, SVG |
Google表格 | application/vnd.google-apps.form | |
Google網頁 | application/vnd.google-apps.site | |
Google App Script | application/vnd.google-apps.script | JSON |
Google Jam | application/vnd.google-apps.jam |
Google文件格式 ,下載連結為
https://docs.google.com/document/u/0/d/<google-drive-file-id>/export?format=<extension>Google試算表格式 ,下載連結為
https://docs.google.com/spreadsheets/u/0/d/<google-drive-file-id>/export?format=<extension>Google簡報格式 ,下載連結為
https://docs.google.com/presentation/d/<google-drive-file-id>/export/<extension>?pageid=<page-id>Google繪圖格式 ,下載連結為
https://docs.google.com/drawings/d/<google-drive-file-id>/export/<extension>?pageid=p雖然 Google App Script 及 Google Jam 都能夠匯出,但暫時必須在 Google雲端硬碟進行
一般檔案 ,下載連結為
https://drive.google.com/uc?id=<google-drive-file-id>google-drive-file-id 為 Google雲端檔案的ID
extension 為 可以轉換的格式
page-id 為 Google簡報的頁面ID ,但不是頁數 ;當 page-id 為 p 時,為全部頁面
小於或等於100MB
當一般檔案小於或等於100MB時,下載連結會直接下載檔案大於100MB
![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhabMGb9mtbrYtInx3bkxjDllxKGxOU3Kh2-54v47XaDUbwzGawfv8HxyT0HR99ioamAu6LWuyQgFu-IkUwBvPBVW08lRrReJMRc3mJAXyLzwxXyGwSecHYuQyswCaE7-8JmfvI7reZgO8/w600/batch-download-google-drive-14.png)
當一般檔案大於100MB時,下載連結並不會直接下載檔案,而是詢問是否需要下載
Google API Console
到 https://console.developers.google.com 並登入自己的Google帳戶![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCO5TP1jb6pZBIH0ZlGLGxc26FaPc5NgWmfIswvcunbCRiEb6vJpKnEcgBC_uL_boYL_WJ1kgvUcJssCtKocvonTAhGXPO825l1jgHNR8gVOUR0PsmzsWWtWybokUmsE7k1D548zviuow/w600/batch-download-google-drive-02.png)
在 資訊主頁 > 建立專案
![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr6luheyCx_0hW75C_xCO4gyC9zPB_a0F7m5AMPepDGqC2Jt6s2Q2VbPTs_93ZBXDO0G0VdUUxa77t1tHw4AeayrLcyztyMx2ESQBI_HppfE-0ACenxUnaQ7cUz53wzyPtZV0eAX2bfwE/w600/batch-download-google-drive-03.png)
設定 專案名稱 後按 建立
![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyXyLdXlxVQLq88lulaxh1PpJlca58H7yOGf4liAX_EISYAt7Z9rJFN6DqrkF53VKAuNHebEkd8Ac_OhOFf5tLnuTCSnmm_SarCdMmIef9jE-me41LpDQd8kZrkfEtbtFjdY3qq0I0JGM/w600/batch-download-google-drive-04.png)
按 啟用 API 和服務
![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSAHbMriGPT52t3Cx5qzIDiDFdreYia4RKAo0HiFGGvl7EO_h5dmKihWRBUYHSDt6KVhHw9WypXyxOxtwEkGNVpiB64gJ-9ZR2TEMQnuGVmfeArnxi7uIdF0nhNN7JYp7dAo5mMfPNzZs/w600/batch-download-google-drive-05.png)
搜尋 Google Drive API
![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1kOxvjpDODcUCNRiYz0MZ1-iT1yIgWp4XfYCvNvxbVi1oOQ4DM10vgRkNRYj2lYgfUq-TEvp3_YFJe1vVB6ndt89983rKPhGNK5f01LBBiwdv5RhAPxm5YrL-L1dVnKoIt6atjNJ3Mk0/w600/batch-download-google-drive-06.png)
按 啟用 Google Drive API
![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhacdH7GBzGRYrrAcx2M2MeqjtrRnLC9iBvWBLouBgVzwjK2cwRqY66ZQpk7zozzCW3XpNCYgO0Rr0OOdSH-fadocj_wTeFYmABjdizEEzdt0K39_PNjTLinBtqfxpIzs1auy1dPMO4usw/w600/batch-download-google-drive-07.png)
按 建立憑證
![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0HvF2nuesat8HhhsmWwfADiOt7tyt5ZFqG4uxkHk_h_Cqz4zVNMl3Lw-JYjetTKka649ASJIhH-gzwFHy3egdLRHgOsWvUjwiS-uy8bItnb016BqU1eGIqF2fdYgAjRXai_X-NxeTG3M/w600/batch-download-google-drive-12.png)
按 API金鑰
![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDxqNGIIq1fhzFPNm2G4R3SGRiX0dQyMfBJk02y9a3nDvgeFWgLQkY4RpCUfzcEV7O2-_uXQhN6W1z1Au4DdPMBzV94cEaXqovv3j1ciL1WVKWiwKcGQFA-_lJsA3wcYRnMNbWq-9ou3Y/w600/batch-download-google-drive-13.png)
有需要可以 修改 API金鑰的名稱 方便管理
及 應用程式限制 讓 API金鑰 更加安全
然後按 建立
![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1H2c9S2Q5YoWRbfSBRvx8IigBK6DiYNTPQk8KUWDfUUjYLNcwo6UsSNQbwPnOSWCHzVLLqrGWIvDajh-qaMjkz7LVys5owlcPUEx6nktCGBHtXRp3WpXolCdf_NzsZBYaUNAexnqHDa0/w600/batch-download-google-drive-11.png)
由於 API 金鑰能透過閣下的許可使用 Google 各種 API 服務,因此不要透露給其他人使用
![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSCCG8ppOyj3Fmn50Sd1Zw-xCS4RZWaJU28On_fBu86UdxMqUqC8X97bm1llmCtNqQw1KawKprfOFXtJ5X_OnUtu36siJ4WFE4p7BOzuktK6k2O-8AjdAhVMH1WlJC521iH69g8BwrDXY/w600/batch-download-google-drive-10.png)
若不慎洩漏,請立即刪除該 API 金鑰 或 重設該 API 金鑰
然後按 儲存
程式碼
因此在下使用編寫一個簡單的 腳本程式 來下載 Google雲端的檔案![見下文 見下文](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRJLdiOuvY1PzuwujYsQ63GS3PYK1CHGMKGfCEyCTEG3gLD9w8_1L_8eVvvsc3Gjfxh-qgJWt4nAqO_tGhDNs_pcib7Aw4eEwtkEJfnxxU552RAYhagDBB-jjqOffz5y_QK3_Bxq1CHYE/w600/batch-download-google-drive-15.png)
當使用 Google Drive API 獲取檔案的 MIME類型,便可以區分 Google檔案 及 一般檔案
由於當一般檔案 小於或等於100MB時,會使用 HTTP狀態碼 (HTTP Status Code) 會傳回 302 才下載檔案
而 大於100MB時,會傳回 200 ,需要手動按下載的連結才能下載檔案
該連結會附加 confirm 的參數,並且需要具備 Cookie 才允許下載檔案
由於在下同樣希望懶惰一點,因此使用 HTTP狀態碼 識別
#!/bin/bash APIKEY="your-api-key" COOKIE="cookie.txt" function downloadFolder() { JSON=`curl --request "GET" -sL "https://www.googleapis.com/drive/v3/files?q='${1}'+in+parents&key=${APIKEY}" | jq ".files"` LENGTH=`echo "${JSON}" | jq ".|length"` i="0" while [ "${i}" -lt "${LENGTH}" ]; do ID=`echo "${JSON}" | jq -r ".[${i}].id"` NAME=`echo "${JSON}" | jq -r ".[${i}].name"` MIME=`echo "${JSON}" | jq -r ".[${i}].mimeType"` case "${MIME}" in "application/vnd.google-apps.folder") echo -e "run \e[1;92mdownloadFolder \"${ID}\"\e[0m to download this folder next time" ;; "application/vnd.google-apps.document") downloadDocument "${ID}" "${NAME}" ;; "application/vnd.google-apps.spreadsheet") downloadSpreadsheet "${ID}" "${NAME}" ;; "application/vnd.google-apps.presentation") downloadPresentation "${ID}" "${NAME}" ;; "application/vnd.google-apps.drawing") downloadDrawing "${ID}" "${NAME}" ;; "application/vnd.google-apps."*) echo -e "\e[1;91mMIME type \"${MIME}\" cannot be exported\e[0m" ;; *) downloadFile "${ID}" "${NAME}" ;; esac i=`echo "${i} + 1" | bc` done } function downloadFile() { NAME="${2}" if [ "${NAME}" = "" ]; then NAME=`curl --request "GET" -sL "https://www.googleapis.com/drive/v3/files/${1}?key=${APIKEY}" | jq -r ".name"` fi LINK="https://drive.google.com/uc?export=download&id=${1}" CODE=`curl -I --request "GET" -sL "${LINK}" | head -1 | sed -r 's/.+([0-9]{3}).+/\1/g'` if [ "${CODE}" = "200" ]; then CONFIRM=`wget --save-cookies="${COOKIE}" -q "${LINK}" -O- | grep 'confirm=' | sed -r 's/.+confirm=([^&]+)&.+/\1/g'` wget --load-cookies="${COOKIE}" "${LINK}&confirm=${CONFIRM}" -O "${NAME}" rm "${COOKIE}" elif [ "${CODE}" = "302" ]; then wget "${LINK}" -O "${NAME}" fi } function downloadDocument() { NAME="${2}" if [ "${NAME}" = "" ]; then NAME=`curl --request "GET" -sL "https://www.googleapis.com/drive/v3/files/${1}?key=${APIKEY}" | jq -r ".name"` fi wget "https://docs.google.com/document/u/0/d/${1}/export?format=pdf" -O "${NAME}.pdf" } function downloadSpreadsheet() { NAME="${2}" if [ "${NAME}" = "" ]; then NAME=`curl --request "GET" -sL "https://www.googleapis.com/drive/v3/files/${1}?key=${APIKEY}" | jq -r ".name"` fi wget "https://docs.google.com/spreadsheets/u/0/d/${1}/export?format=pdf" -O "${NAME}.pdf" } function downloadPresentation() { NAME="${2}" if [ "${NAME}" = "" ]; then NAME=`curl --request "GET" -sL "https://www.googleapis.com/drive/v3/files/${1}?key=${APIKEY}" | jq -r ".name"` fi wget "https://docs.google.com/presentation/d/${1}/export/pdf?pageid=p" -O "${NAME}.pdf" } function downloadDrawing() { NAME="${2}" if [ "${NAME}" = "" ]; then NAME=`curl --request "GET" -sL "https://www.googleapis.com/drive/v3/files/${1}?key=${APIKEY}" | jq -r ".name"` fi wget "https://docs.google.com/drawings/d/${1}/export/pdf?pageid=p" -O "${NAME}.pdf" } downloadFolder "google-drive-folder-id" downloadDocument "google-drive-document-id" downloadSpreadsheet "google-drive-spreadsheet-id" downloadPresentation "google-drive-presentation-id" downloadDrawing "google-drive-drawing-id" downloadFile "google-drive-file-id"上述程式看似很複雜,其實只是使用 CURL, Wget, jq 便可以簡次下載 Google雲端的檔案
將 google-drive-*-id 取代為需要下載的 Google雲端檔案的ID
將 APIKEY 修改為閣下的 Google API Console 的 API金鑰,便可以使用
總結
雖然不一定是最簡單最方便的方法,但可以自動化下載程序,對需要在 Google雲端硬碟 下載大量大型檔案,算是一種替待方法其實 Google Drive API 已經提供 Java, Python, Node.js 的函式庫,亦有第三方 gdrive 可以使用,可以更快開發自己的 Google Drive 程式
不過在下只是執行簡單操作,因此沒有使用大型的函式庫
沒有留言 :
張貼留言