การใช้งาน Google Drive API ด้วย Google Client Library for Python

ในบทความนี้ จะแนะนำวิธีการเขียน Python เพื่อติดต่อกับ Google Drive API ทาง Google Client Library ซึ่ง จะใช้ REST v2 [1] เนื่องจาก ใน REST v3 ยังหาทางแสดง Progress ไม่ได้ (หากได้แล้วจะมา Update นะ)

สิ่งต้องมี

  1. Python 2.6 ขึ้นไป
  2. PIP Package Management Tool
  3. เครื่องต้องต่อ Internet ได้
  4. แน่นอน มี Google Account

ขั้นที่ 1: เปิดใช้ Drive API

เปิด URL https://console.cloud.google.com แล้วคลิก Select a project

จากนั้นคลิกปุ่ม + เพือสร้าง Project

ตั้งชื่อ Project แล้วคลิก Save

เลือก Project ที่สร้างขึ้น เลือก API Library ที่ต้องการ ในที่นี้คือ Google Drive API

แล้วคลิก Enable

จากนั้น Create Credentials

เลือกชนิดเป็น OAuth Client ID แล้วกรอกข้อมูลดังนี้

สร้าง Consent Screen

เลือก Application Type เป็น Web Application, ระบุ Name (จะแสดงตอนขอ Permission) แล้วตั้งค่า URL ทั้ง 2 อันเป็น http://localhost:8080

 

และ สุดท้าย คลิก Download

ก็จะได้ไฟล์ JSON มา ส่งนี้จะเรียกว่า “Client Secret File”  ให้เก็บไฟล์ไว้ใน Directory เดียวกันกับที่ต้องการจะเขียน Python Code โดยสามารถแก้ไขเปลี่ยนชื่อ เช่น ตั้งเป็น client_secret.json

ขั้นที่ 2: ติดตั้ง Google Client Library

ติดตั้งด้วย pip ตามคำสั่งต่อไปนี้

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

ขั้นที่ 3: เขียน Code เพื่อติดต่อ Drive API

จาก Python Quickstart [1] เป็นการเริ่มต้นที่ดีมาก เราสามารถนำ Code มาเป็นจุดเริ่มต้นได้ โดยตัวอย่างจะทำการติดต่อไปยัง Google Drive แล้ว List รายการของไฟล์ 10 อันดับแรกออกมา

ตัวอย่างที่ Google ให้มา จะอ้างอิงไปยัง Credentials Path ไปยัง directory “.credentials” ใน “Home Directory” ของผู้ใช้ แต่ในตัวอย่างที่จะแสดงต่อไปนี้ ได้แก้ไขให้ “Client Secret File” อยู่ที่ directory เดียวกับ python file และเมื่อทำการ Authorization แล้วก็จะได้ “Credential File” มาเก็บไว้ที่เดียวกัน

Code ต้นฉบับ สามารถดูได้จาก https://developers.google.com/drive/v2/web/quickstart/python ในที่นี้จะเปลี่ยนเฉพาะส่วนที่ต้องการข้างต้น และ เขียน Comment เพื่ออธิบายเพิ่มเติมเป็นภาษาไทย (ซึ่งไม่สามารถเขียนลงไปใน Python Code ได้) โดยตั้งชื่อไฟล์ว่า listfile.py

from __future__ import print_function
...
# การกำหนด SCOPES ต้องสอดคล้องกับบริการที่เราจะใช้งาน
SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'

# แก้ไข Client Secret File ให้สอดคล้องกับไฟล์ที่ได้จาก ขั้นตอนที่ 1
CLIENT_SECRET_FILE = 'client_secret.json'
# แก้ไข Application Name ตามต้องการ
APPLICATION_NAME = 'Drive API Python Quickstart'

...
def get_credentials():
...
 # ไม่ใช้
 # home_dir =os.path.expanduser('~')
 
 # เดิม อยู่ใน os.path.join(home_dir, '.credentials')
 # แก้ไขให้อยู่ที่ Current Working Directory เดียวกันเลย
 credential_dir = os.getcwd()
 ...
 # เดิม os.path.join(credential_dir,'drive-python-quickstart.json')
 # ตั้งชื่อ Credential ตามต้องการ 
 credential_path = os.path.join(credential_dir,'drive_credential.json')
...

def main():
...
 credentials = get_credentials()
 http = credentials.authorize(httplib2.Http())

 # ตรงนี้สำคัญ จะต้องเลือกใช้ REST Version ที่ต้องการ
 # ในที่นี้ ใช้ REST v2
 service = discovery.build('drive', 'v2', http=http)
 
 # ส่วนของการเขียน Code
 # ตัวอย่างนี้ เรียกใช้ files().list()
 # โดยตั้งค่า maxResults เป็น 10 ก็คือ เรียกเฉพาะ 10 รายการแรก
 # อ้างอิงจาก https://developers.google.com/drive/v2/reference/files/list
 results = service.files().list(maxResults=10).execute()

 # จาก อ้างอิง จะเห็นได้ว่า files().list() นั้น Return หรือ Response
 # items[] ซึ่งมี element เป็น รายการของไฟล์
 items = results.get('items', [])
 
 # ตรวจสอบว่ามีไฟล์หรือไม่
 if not items:
   print('No files found.')
 else:
   # หากมีไฟล์อยู่
   print('Files:')
   # loop เพื่อแสดงไฟล์ที่มีอยู่ ในที่นี้ จะไม่เกิน maxResults ข้างต้น
   for item in items:
     # แสดงฟิลด์ title และ id
     # เพิ่มเติม .encode('utf-8') ด้วย
     print('{0} ({1})'.format(item['title'].encode('utf-8'), item['id']))

if __name__ == '__main__':
 main()

ขั้นที่ 4: Run

ตอนนี้ใน Directory จะมีไฟล์

  • client_secrets.json
  • listfile.py

ใช้คำสั่ง

python listfile.py

หากเป็นการ Run ครั้งแรก ซึ่งจะยังไม่มีไฟล์ drive_credential.json โปรแกรมก็จะทำตาม “flow” โดย ถ้า run command line บนเครื่องที่มี X Window ก็จะเปิด Web Page ไปยัง Google เพื่อ Authorization

และเปิด Web นี้ ให้คลิกเลือก Account ที่จะติดต่อด้วย

หน้า Consent Screen คืออย่างนี้ คลิกอนุญาต

ผลที่ได้

Reference:

[1] https://developers.google.com/drive/v2/web/quickstart/python