PyDrive備份教學

最近買了台Raspberry Pi,因為讀寫都是在SD卡上面,所以很怕哪天SD卡突然掛了,裡面的資料就都沒了,上網找了這個方法,但用的人似乎很少 ,就來寫我人生中的第一篇電腦教學文!!

開始

此方法是使用 Google 釋出的 API 所以要先去 APIs console 建立專案

如果是第一次使用 會先跳出使用介紹 這個別理他 ((好啦 大家都知道

先點選右上角的 “選取專案” -> “建立專案”

建立後 應該會直接跳轉到資料庫的畫面

此時透過搜尋列搜尋 “Drive API” 接著啟用它

點選 左側 “憑證” 後 選取"OAuth同意畫面"

只需在 " 向使用者顯示的產品名稱 " 輸入即可儲存

接著建立憑證 選取 “OAuth 用戶端ID”

類型務必選擇 “其他” 這樣可以用的範圍比較廣

接著右邊有個下載符號 下載完放到要執行的資料夾內

並重新命名為 client_secrets.json

安裝pyDrive 可以透過指令

$ pip install pydrive

會安裝到最新版本 但是遇到大檔上傳時會有內存溢出問題

因此建議可以安裝舊版

$ pip install -e git+https://github.com/googledrive/PyDrive.git#egg=PyDrive

裝完後 沒問題就可以開始寫程式了

先建立一個"quickstart.py" 的檔案 (檔名可以隨便取)

並貼上下面指令: (詳細請參考: http://pythonhosted.org/PyDrive/quickstart.html)

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.CommandLineAuth() #透過授權碼認證
drive = GoogleDrive(gauth)

file1 = drive.CreateFile({'title': 'Hello.txt'})  # 建立檔案
file1.SetContentString('Hello World!') # 編輯檔案內容
file1.Upload() #檔案上傳

使用 $ python quickstart.py 執行該檔案後,會有連結跑出來

透過瀏覽器查看這個網址 這時可以用任何google帳號登入 之後可看到請求權限驗證畫面

點選後會有授權碼 把它複製到 terminal 裡面即可完成上傳(“若當初是選擇網路應用程式 會看不到授權碼”)

若要是自動驗證

需在資料夾內建立一個 settings.yaml 文件 (請記得settings有s 害我多花了30分鐘找問題@@)

並貼上下面指令: (詳細請參考 http://pythonhosted.org/PyDrive/oauth.html )

client_config_backend: settings
client_config:
  client_id: 9637341109347.apps.googleusercontent.com
  client_secret: psDskOoWr1P602PXRTHi

save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json

get_refresh_token: True

oauth_scope:
  - https://www.googleapis.com/auth/drive.file
  - https://www.googleapis.com/auth/drive.install

其中 將 client_id 與 client_secret 改成自己的 可以從下載的.json檔中看到

保存後 再次執行 quickstart.py檔

這次手動輸入授權碼後,往後就都不用再輸入了

若是想要上傳檔案 可以這樣寫

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.CommandLineAuth() #透過授權碼認證
drive = GoogleDrive(gauth)


try:
    file1 = drive.CreateFile({"title":'Hello.txt',"parents": [{"kind": "drive#fileLink", "id": "1B4GktyQzQmZDRYTHYDUpW"}]})
    file1.SetContentFile('../mail.py')
    file1.Upload() #檔案上傳
    print "Uploading succeeded!"
except:
    print "Uploading failed."

在建立檔案時 id 的地方就是雲端硬碟裡面的資料夾id 可以在點進該資料夾時 查看網址

https://drive.google.com/drive/u/0/folders/1B4GktyQzQmZDRYTHYDUpW

大概就是這樣看

還有 在 SetContentFile 時 可以使用相對位置去抓檔

之後 使用crontab 就可以設定排程自動備份了

不懂的話可以自行去看鳥哥 就不再這邊說明了

補充:

讀者或許會發現PyDrive document 裡面是用 gauth.LocalWebserverAuth()

而不是 gauth.CommandLineAuth()

這樣的話 就不用輸入授權碼了 但是只限定從 local 主機上使用

因為文件上提到 LocalWebserverAuth(host_name='localhost', port_numbers=[8080, 8090])

預設就是 localhost 的 8080 8090 port

應該可以透過更改host_name去達到這功能

但是我沒有成功= =ˋ 不論是透過ip或是domain name

所以這對於遠端操作者可能會比較不便

若是選擇 “網路應用程式” 的讀者 可能也會遇到授權的問題

因為官方文件寫說 JavaScript 來源 跟 重新導向 URL都寫 http://loaclhost:8080/

但是我並不能成功

我是使用 JavaScript 來源 http://localhost:8080

重新導向 URI http://localhost:8090/ 才成功的 我也不知道為甚麼 功力太弱QQ


comments powered by Disqus