Download file dari Google Drive dengan Python

Terkait dengan artikel sebelumnya tentang bagaimana membuat Service Account di akun Google Cloud Platform, kali ini kita akan mencoba implementasinya dalam sebuah program sederhana namun berguna dalam keseluruhan project kita tentang ID Card.

Program ini hanya memiliki satu fungsi yaitu mendownload file Google Datasheet serta mengkonversi menjadi file berformat Microsoft Excel (xlsx). Service Account yang kita buat sebelumnya, berfungsi agar script yang kita jalankan tidak akan meminta kita untuk memasukkan username serta password setiap kali dijalankan. Sebagai gantinya, agar file kita yang berada di dalam Google Drive tetap aman dan tidak bisa diakses oleh sembarang orang, dibutuhkan mekanisme tersendiri. Dan mekanisme tersebut melibatkan Service Account beserta Access Key berupa file berformat JSON yang kita download dibagian akhir dari artikel sebelumnya. Untuk lebih jelasnya, kita akan bedah perbagian dari scriptnya dibawah ini:

#!/usr/bin/env python3

import argparse
import os

from google.oauth2 import service_account

from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
import googleapiclient.http

scriptName = os.path.basename(__file__)
scriptPath = os.path.realpath(os.path.dirname(scriptName))
assetsFolder = os.path.join(scriptPath, 'assets/')

# credentialFile and fileId kita samarkan dengan alasan keamanan
credentialFile = os.path.join(assetsFolder, 'idcard-******-************.json')
fileId = '12ZyiJ_***********************-txWsIEAnIx2Mc'


def downloadDataFromGoogleDrive(credFile, assetId, destFile):
    funcName = downloadDataFromGoogleDrive.__name__
    if not (os.path.isfile(credFile) and (os.path.isdir(destFile))):
        print(
            f"Error in {scriptName}, function: {funcName}(): File do not exist")
        print(f"credentialFile: {credFile} ({os.path.isfile(credFile)})")
        print(f"dataFile: {destFile} ({os.path.isfile(destFile)})")
        exit(1)
    # Create a service object for interacting with Google Drive API
    credentials = service_account.Credentials.from_service_account_file(
        credFile, scopes=['https://www.googleapis.com/auth/drive'])
    service = build('drive', 'v3', credentials=credentials)

    try:
        # Download the file
        request = service.files().export_media(
            fileId=assetId,
            mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
        with open(destFile, 'wb') as fh:
            downloader = googleapiclient.http.MediaIoBaseDownload(fh, request)
            done = False
            while done is False:
                status, done = downloader.next_chunk()
                print(f"Download {int(status.progress() * 100)}%.")
        print(f'Google documents ID "{assetId}" succesfully exported and downloaded')
        print(f"output file: {destFile}")
        fh.close()
    except HttpError as e:
        print(f'An error while exporting and downloading Google docs file: {e}')


def main():
    parser = argparse.ArgumentParser(scriptName)
    parser.add_argument("-o", "--output", default="RegistrasiMember.xlsx", 
                        help="save downloaded file as filename. Default to RegistrasiMember.xlsx")
    args = parser.parse_args()
    dataFile = os.path.join(scriptPath, args.output)

    try:
        downloadDataFromGoogleDrive(credentialFile, fileId, dataFile)
    except Exception as e:
        print(f"Error: download failed ({e})")
        exit(1)

if __name__ == "__main__":
    main()

Seperti biasa, untuk menjalankan script ini, terlebih dulu kita harus mengaktifkan Virtual Environment python dengan cara:

$ source .venv/bin/activate
$ ./downloadFromGoogleDrive.py <== sesuai nama file script

(output yang dihasilkan serupa dengan berikut:)

Download 100%.
Google documents ID "12ZyiJ_***********************-txWsIEAnIx2Mc" succesfully exported and downloaded
output file: /root/source/IDCard/RegistrasiMember.xlsx

parameter penting disini yaitu credentialFile dan fileId. untuk credentialFile adalah file Access Key yang kita jelaskan sebelumnya, sedangkan untuk fileId adalah identitas file unik dari file yang berada di google drive yang akan kita download. Untuk mendapatkan fileId ini caranya cukup mudah. Cukup buka file yang bersangkutan dalam sebuah browser, kemudian perhatikan pada alamat URL yang ada pada window browser, maka akan terlihat sebuah alamat URL serupa berikut:

https://docs.google.com/spreadsheets/d/<fileId>/edit?pli=1#gid=********

pada bagian <fileId> itulah identitas file unik yang akan kita gunakan.

Nah, sampai disini sekiranya cukup jelas bagaimana cara kerja script yang kita buat. Selanjutnya script ini tinggal kita integrasikan dengan fungsionalitas project IDCard kita yang lain untuk membentuk sebuah sistem yang komplit untuk mengelola database member beserta halaman profil tiap member yang ditampilkan di website https://sif.my.id

by: @adymulianto