Python & Google Drive 專案

yysu
10 min readJun 17, 2017

--

今天不念書!想要做一個有趣的專案會應用到PythonGoogle Drive ,我想要做一隻能夠自動抓影片,抓完後自動丟到Google Drive上的程式,寫完瞬間覺得這好像沒什麼😂 但就是實際想做一個Python的東西出來,補充一下這個的靈感來自於我們學校學生的Google Drive的空間無限!可以來拿存好多東西ㄎ ㄎ ㄎ 。

今天先來進行第一階段,目標:能夠把東西丟到Google Drive上。

先去看Google 有關Drive的API,參考這個網頁:https://developers.google.com/drive/v3/web/quickstart/python,其實照他的步驟run,不到一分鐘就出來了,以下是我的圖片配上簡短的文字說明操作,首先:

STEP 1 : 開啟Google Drive API

  1. 先進入 https://console.developers.google.com/flows/enableapi?apiid=drive 這頁,點選 請選擇專案
(因為我是用學校的信箱做登入,可能跟一般的Google帳號頁面長不大一樣,不過方法都是一樣的)

2. 因為我之前有創立過專案了,所以我的下面有一些專案,如果要先見專案的話點選 + 號按鈕能夠建立專案

3. 接著打你想要的專案名稱,這裡我就照預設的懶得改XD,點選建立。

4. 創立完成後,會顯示一個藍色1的通知,點選他就可以切換到該專案裡面。

5. 進入到該專案後,往下滑動可以看到 入門指南裡面有啟用API並取得憑證(如金鑰),點選該欄。

6. 接著找到Drive API並點選

7. 點選啟用

8. 接著會要你建立一個憑證

9. 選擇該選的選項,因為這裡我們是使用Python來連,所以我選擇其他使用者介面,點選後進行下一步

10. 輸入 OAuth 2.0用戶端ID,我也懶得改了就繼續下去

11. 輸入產品名稱,這會在向你要求存取權的時候顯示!

12. 接著就完成憑證申請的步驟拉! 點選下載,可以得到json檔,請注意這個檔案不能外流!根據Google 的教學,要先把這個json檔改名成client_secret.json,並且跟等等python程式放同一個位置。

13. 最後點選完成即成功開啟Google Drive API的啟動。

STEP 2 : 安裝Python library

在Terminal環境下輸入:

pip install --upgrade google-api-python-client

(這邊需注意Python的版本,根據https://developers.google.com/api-client-library/python/start/installation

Python 2.6, 2.7, 3.3, or 3.4

STEP 3 : Python 程式

創立一個新資料夾,把STEP 1的 client_secret.json放入,並開一個quickstart.py把以下程式碼貼上

from __future__ import print_function
import httplib2
import os

from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage

try:
import argparse
flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
flags = None

# If modifying these scopes, delete your previously saved credentials
# at ~/.credentials/drive-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Drive API Python Quickstart'


def get_credentials():
"""Gets valid user credentials from storage.

If nothing has been stored, or if the stored credentials are invalid,
the OAuth2 flow is completed to obtain the new credentials.

Returns:
Credentials, the obtained credential.
"""
home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
credential_path = os.path.join(credential_dir,
'drive-python-quickstart.json')

store = Storage(credential_path)
credentials = store.get()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
if flags:
credentials = tools.run_flow(flow, store, flags)
else: # Needed only for compatibility with Python 2.6
credentials = tools.run(flow, store)
print('Storing credentials to ' + credential_path)
return credentials

def main():
"""Shows basic usage of the Google Drive API.

Creates a Google Drive API service object and outputs the names and IDs
for up to 10 files.
"""
credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
service = discovery.build('drive', 'v3', http=http)

results = service.files().list(
pageSize=10,fields="nextPageToken, files(id, name)").execute()
items = results.get('files', [])
if not items:
print('No files found.')
else:
print('Files:')
for item in items:
print('{0} ({1})'.format(item['name'], item['id']))

if __name__ == '__main__':
main()

這樣這個步驟就完成了!

最後就可以來測試我們的程式有沒有正確執行囉!

在Terminal 下輸入

python quickstart.py

應該會開啟你的瀏覽器,會要你登入你的帳密,要求存取權,點選同意後,你的Terminal就會顯示出你在Google Drive 上面的檔案資料夾!

踩雷分享:

在最後執行程式的過程中,我的程式一直出現以下錯誤訊息:

Traceback (most recent call last):
File "quickstart.py", line 72, in <module>
main()
File "quickstart.py", line 57, in main
credentials = get_credentials()
File "quickstart.py", line 40, in get_credentials
credentials = store.get()
File "/Users/yanyunsu/anaconda3/envs/py3.4/lib/python3.4/site-packages/oauth2client/client.py", line 407, in get
return self.locked_get()
File "/Users/yanyunsu/anaconda3/envs/py3.4/lib/python3.4/site-packages/oauth2client/file.py", line 54, in locked_get
credentials = client.Credentials.new_from_json(content)
File "/Users/yanyunsu/anaconda3/envs/py3.4/lib/python3.4/site-packages/oauth2client/client.py", line 302, in new_from_json
module_name = data['_module']
KeyError: '_module'

後來在StackOverFlow上面找到答案(這是個好網站,建議常常上去幫別人解答or瀏覽別人的回答,會進步得很快),

於是執行了:

rm ~/.credentials/drive-python-quickstart.json

結論:成功解決剛剛的問題,跑出我的Google Drive裡面的資料夾名稱出來!

明天再來下一階段:能夠將檔案上傳(原諒我偷懶只有這功能QQ,假日需要好好休息的!)

--

--

yysu

AWS Certified All-5 | CKA & CKAD | Ex - Cloud Engineer @ AWS