Autoupload File ke Google Drive Menggunakan Python dan Windows Services

Mr. I
kasta
Published in
5 min readDec 17, 2017

Bangkok, Irsyad — Cukup menguji kesabaran kecepatan koneksi internetnya, untuk akses new post saja butuh waktu beberapa menit. Lebih baik tidak ada koneksi sama sekali daripada ada koneksi internet tapi lemot banget. Kalau gak ada akses internet kan tidak berharap banget atau nunggu loading. Bersyukur sama yang ada ajalah setidaknya nambah lagi satu postingan dari sejumlah catatan apa yang akan diposting hari ini. Seperti yang telah saya sebut pada artikel sebelumnya, saya akan membuat tutorial autoupload file ke akun Google Drive. Namun pada tutorial ini tidak mengcover semua kebutuhan yang saya jelaskan sebelumnya. Tutorial kali ini akan membuat suatu service yang akan tugasnya mengupload file ke Google Drive.

Algoritmanya adalah menentukan folder yang akan menjadi acuan perubahan, ketika ada file baru pada folder tersebut maka akan secara otomatis terupload. Servernya menggunakan Google Drive. Google Drive menyediakan API yang corenya menangani dua aksi yaitu upload dan download. Sebelum melakukan pengkodean pastikan telah memiliki authentikasi ke Google Drive. Gunakan tutorial ini untuk membuat authentikasi. Berdasarkan dokumentasi dari Google API, bahasa pemrograman Python menggunakan file JSON untuk authentikasi. Untuk menyeragamkan environment buatlah folder “gdrive” pada Desktop (C:\Users\admin\Desktop\gdrive).

Mendeteksi File Baru

Hal pertama yang harus dilakukan adalah bagaimana caranya kita mengetahui bahwa dalam folder yang telah kita buat tersebut terdapat file baru. Saya memanfaatkan watchdog untuk mengetahui aktivitas pada suatu folder. Jika belum menginstallnya silakan install dengan menggunakan perintah pip install watchdog. Berikut sintaks untuk mengetahui aktivitas pada suatu folder yang telah kita tentukan. Perihal folder sebenarnya dapat kita buat dinamis tapi pada tutorial ini saya buat secara statis.

import time
import os
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class Watcher:
DIRECTORY_TO_WATCH = "C:\\Users\\admin\\Desktop\\gdrive"
def __init__(self):
self.observer = Observer()
def run(self):
event_handler = Handler()
self.observer.schedule(event_handler, self.DIRECTORY_TO_WATCH, recursive=True)
self.observer.start()
try:
while True:
time.sleep(5)
except:
self.observer.stop()
print("Error")
self.observer.join()
class Handler(FileSystemEventHandler):
@staticmethod
def on_any_event(event):
(filepath, filename) = os.path.split(event.src_path)
if event.is_directory:
return None
elif event.event_type == 'created':
print("Received created event - %s." % filename)
elif event.event_type == 'modified':
print("Received modified event - %s." % filename)
if __name__ == '__main__':
w = Watcher()
w.run()

Jalankan sintaks di atas dengan python change.py pada command line. Tidak ada hasil jika belum menambahkan hasil pada folder tersebut. Ketika saya mengkopi suatu file maka hasilnya akan seperti berikut (asumsi nama file adalah 2.jpg).

C:\Users\admin\Desktop\gdrive>python change.py
Received created event - 2.jpg.
Received modified event - 2.jpg.

Upload File ke Google Drive

Setelah codingan di atas berhasil jalan sesuai dengan keinginan kita yaitu membaca file yang dicopy atau ditambahkan pada folder tersebut. Selanjutnya adalah membuat code untuk mengupload suatu file ke Google Drive. Berikut tampilan Google Drive saya sebelum mengupload file.

Untuk membuat codingan yang belum pernah saya kerjakan atau lakukan biasanya saya membuat testing dulu atau code sederhana. Berikut contoh codingan dengan asumsi pada folder terdapat suatu file yang bernama hello.txt dan akan saya upload. Simpan codingan tersebut dengan nama drive_upload.py dan jalankan dengan perintah python drive_upload.py pada command line.

from __future__ import print_function
import os
from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
try:
import argparse
flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
flags = None
SCOPES = 'https://www.googleapis.com/auth/drive.file'
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', scope=SCOPES)
creds = tools.run_flow(flow, store, flags) \
if flags else tools.run(flow, store)
DRIVE = build('drive', 'v3', http=creds.authorize(Http()))
FILES = (
('hello.txt', None),
)
for filename, mimeType in FILES:
metadata = {'name': filename}
if mimeType:
metadata['mimeType'] = mimeType
res = DRIVE.files().create(body=metadata, media_body=filename).execute()
if res:
print('Uploaded "%s" (%s)' % (filename, res['mimeType']))
Jika berhasil maka akan muncul tampilan berikut. Abaikan pesan error jika ada yang penting file berhasil di upload.
C:\Users\admin\Desktop\gdrive>python drive_upload.py
Uploaded "hello.txt" (text/plain)
[caption id="attachment_410" align="aligncenter" width="554"]Hasil upload file[/caption]

File autoupload tanpa services

Pada sintaks di atas belum terupload secara otomatis. Kita perlu melakukan modifikasi pada code dengan menggabungkan sintaks pertama dengan sintaks kedua. Sintaks pertama membaca apakah ada file baru, jika ada file baru maka akan melakukan file kedua yaitu mengupload. Untuk case ini tidak perlu memanggil file python lain cukup menggabungkan kedua code tersebut. Hasil penggabungan dari kedua code tersebut adalah sebagai berikut dan simpan dengan nama auto.py. Jalankan dengan perintah python auto.py pada command line.

import time
import os
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
try:
import argparse
flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
flags = None
SCOPES = 'https://www.googleapis.com/auth/drive.file'
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', scope=SCOPES)
creds = tools.run_flow(flow, store, flags) \
if flags else tools.run(flow, store)
DRIVE = build('drive', 'v3', http=creds.authorize(Http()))
class Watcher:
DIRECTORY_TO_WATCH = "C:\\Users\\admin\\Desktop\\gdrive"
def __init__(self):
self.observer = Observer()
def run(self):
event_handler = Handler()
self.observer.schedule(event_handler, self.DIRECTORY_TO_WATCH, recursive=True)
self.observer.start()
try:
while True:
time.sleep(5)
except:
self.observer.stop()
print("Error")
self.observer.join()
class Handler(FileSystemEventHandler):
@staticmethod
def on_any_event(event):
(filepath, filename) = os.path.split(event.src_path)
if event.is_directory:
return None
elif event.event_type == 'created':
FILES = (
(filename, None),
)
for filename, mimeType in FILES:
metadata = {'name': filename}
if mimeType:
metadata['mimeType'] = mimeType
res = DRIVE.files().create(body=metadata, media_body=filename).execute()
if res:
print('Uploaded "%s" (%s)' % (filename, res['mimeType']))
print("Received created event - %s." % filename)
elif event.event_type == 'modified':
print("Received modified event - %s." % filename)
if __name__ == '__main__':
w = Watcher()
w.run()
Setelah menjalankan code tersebut saya mengkopi satu file dengan nama 3.jpg ke folder tersebut. Jika berhasil atau tidak ada error maka akan muncul pesan berikut dan pada Google Drive akan ada file baru dengan nama 3.jpg. Kecepatan upload tergantung dari kecepatan internet.C:\Users\admin\Desktop\gdrive>python auto.py
Uploaded "3.jpg" (image/jpeg)
Received created event - 3.jpg.
Received modified event - 3.jpg.
[caption id="attachment_411" align="aligncenter" width="615"]Hasil autoupload file[/caption]

Membuat Services untuk Menjalankan auto.py

Setelah codingan berjalan dengan baik maka langkah selanjutnya adalah membuat service. Pembuatan service ini dimaksudkan agar kita tidak menjalankan file auto.py tersebut setiap waktu. Setiap komputer atau laptop dinyalakan maka program tersebut akan jalan secara otomatis. Selain itu kita tidak perlu membuka command line atau powershell untuk menjalankannya sehingga aktivitas lain tidak akan terganggu. Untuk membuat service saya menggunakan third party yaitu AlwaysUp. Sebelum membuat service terlebih dahulu kita membuat .bat file untuk menjalankan skrip tersebut. Simpan file berikut dengan nama run.bat dan dapat disimpan di mana saja.

CD C:\Users\admin\Desktop\gdrive && python auto.py
Langkah — langkahnya adalah sebagai berikut.
Arahkan kursor pada tab Application dan pilih Add. Isi form sesuai informasi berikut dan tekan tombol Save >>
Klik kanan pada GDriveUpload dan pilih Start “GDriveUpload”.
Wait. Bukannya sudah ada yah aplikasi Google Drive yang dapat disinkronkan secara otomatis dan terinstall pada PC? Ya memang sudah ada, tapi artikel ini hanya memberikan lebih jelas secara teknikal apa yang saya jelaskan pada artikel sebelumnya mengenai background process.

--

--

Mr. I
kasta
Editor for

Code using various programming language commonly based on JVM (Java, Scala, Groovy) with DBMS (Oracle, PostgreSQL & MySQL)