3

我正在編寫一個python腳本,用於將所有需要的配置文件從我的Linux VM備份到Google Drive Cloud。我希望自動執行此操作,而不必在每次腳本啓動時從瀏覽器輸入驗證碼。你能告訴我如何做到這一點?如何在沒有網頁瀏覽器的情況下使用谷歌驅動器API

#!/usr/bin/python 

import httplib2 
import pprint 
import credentials as cred 
from apiclient.discovery import build 
from apiclient.http import MediaFileUpload 
from oauth2client.client import OAuth2WebServerFlow, FlowExchangeError 

# Path to the file to upload 
FILENAME = 'hello.py' 

# Run through the OAuth flow and retrieve credentials from credentials.py 


def api_upload(FILENAME): 

    flow = OAuth2WebServerFlow(cred.credentials['CLIENT_ID'], cred.credentials['CLIENT_SECRET'], 
           cred.credentials['OAUTH_SCOPE'], 
           redirect_uri=cred.credentials['REDIRECT_URI']) 

    authorize_url = flow.step1_get_authorize_url() 
    print 'Go to the following link in your browser: ' + authorize_url 
    code = raw_input('Enter verification code: ').strip() 

    credentials = '' 
    try: 
     credentials = flow.step2_exchange(code) 
    except FlowExchangeError: 
     print "Your verification code is incorrect or something else is broken." 
     exit(1) 

    # Create an httplib2.Http object and authorize it with our credentials 
    http = httplib2.Http() 
    http = credentials.authorize(http) 

    drive_service = build('drive', 'v2', http=http) 

    # Insert a file 
    try: 
     media_body = MediaFileUpload(FILENAME, mimetype='text/plain',  resumable=True) 
     body = { 
      'title': "" + FILENAME, 
      'description': 'A test document', 
      'mimeType': 'text/plain' 
     } 
     upload_file = drive_service.files().insert(body=body, media_body=media_body).execute() 
     pprint.pprint(upload_file) 
    except IOError: 
     print "No such file" 
     exit(1) 

# Function usage: 
api_upload(FILENAME) 

這裏是我的示例功能。

另一個文件存儲的請求的憑據:

credentials = {"CLIENT_ID": 'blablabla', 
       "CLIENT_SECRET": 'blablabla', 
       "OAUTH_SCOPE": 'https://www.googleapis.com/auth/drive', 
       "REDIRECT_URI": 'urn:ietf:wg:oauth:2.0:oob'} 
+0

你能告訴我們你面臨的問題是什麼? – barunsthakur

+0

問題是,每次authorize_url = flow.step1_get_authorize_url() 打印'轉到您的瀏覽器中的以下鏈接:'+ authorize_url 您應該打開瀏覽器,按繼續並將驗證碼粘貼到控制檯。我怎樣才能做到這一點,而無需打開瀏覽器? – Jade

+0

編輯正確格式化問題。 – Leb

回答

1

基本上,你想這個腳本一個得到一個代碼和交換它的訪問令牌,並使用了一個分爲2名獨立的腳本,訪問令牌以訪問您的Google雲端硬盤。我會將上面的代碼分成兩個塊,並進行以下更改。

在第一部分中,您可以按照上述步驟進行操作,但在初始查詢中獲取代碼時,請將access_type設置爲'offline'並將approval_prompt設置爲'force'(請參閱https://developers.google.com/identity/protocols/OAuth2WebServer)。如果你這樣做了,那麼當你交換代碼時,返回的標記將不僅包含access_token,而且還包含一個refresh_token,它可以用來無限刷新訪問令牌。那麼這個第一個腳本應該將這些標記保存到一個文件並退出。如果你能做到這一點,那麼你只需要運行那一段代碼(通過手動干預)一次。

然後,您的第二個腳本可以在需要運行時從文件中加載這些保存的令牌,並在您不必介入的情況下訪問您的文檔。

相關問題