Bài viết này hướng dẫn cách viết script Python để upload file tự động lên Google Drive sử dụng lib Pydrive. Rất phù hợp với nhu cầu backup dữ liệu tự động vào Google Drive.
Bạn phải tạo Client ID cho cho đoạn script upload file, lúc này script của bạn gọi là “ứng dụng bên thứ 3 – third party app“. Sau đó tài khoản Google cấp quyền cho Client ID đó truy cập vào Drive thì mới upload được. Bài viết này sẽ hướng dẫn chi tiết các bước thực hiện.
Các bước thực hiện
- Bước 1: cài đặt Python 3
- Bước 2: cài đặt thư viện pydrive
- Bước 3: cài Visual Studio Code để lập trình Python
- Bước 4: tạo OAuth Client ID
- Bước 5: viết code upload file
- Bước 6: run code và cấp quyền cho Client ID truy cập
Bước 1: cài đặt Python 3
Trong lúc viết bài này mình đang sử dụng Python 3.7.3 x64, các bạn có thể cài phiên bản khác miễn là 3.6 trở lên.
Sau khi download về cài đặt như các chương trình bình thường rồi restart máy.
Bước 2: cài đặt thư viện pydrive
Dùng lệnh bên dưới để cài pydrive, phiên bản hiện tại là 1.3.1
pip install pydrive
Trong trường hợp cài đặt trên Linux bị lỗi vì không gỡ được httplib2 thì dùng lệnh
pip install pydrive --ignore-installed httplib2
Bước 3: cài Visual Studio Code để lập trình Python
Bạn có thể sử dụng Visual Studio Code hoặc editor khác để edit code Python. Code Python cần indent (thụt đầu dòng) chuẩn là được, Visual Code có ưu điểm là có interpreter khá xịn. Do đó mình recommend Visual Studio Code
Bước 4: tạo OAuth Client ID
Bạn cần tạo 1 project trong Google Developer Console để lấy được Client ID. Người dùng Google Drive sẽ cấp quyền cho Client ID này để đọc ghi file.
Vào Google Developer Console tạo project mới. Đặt tên cho dễ nhớ như BackupWebsiteDB chẳng hạn
Ấn nút ENABLE APIS AND SERVICES để tìm kiếm Google Drive API
Sau đó tìm Google Drive API và enable nó
Tạo Credentials mới => chọn OAuth Client ID
Chọn Desktop App vì chúng ta chạy script Python trực tiếp trên PC
Đặt tên cho app, ấn nút Create là xong. Sau khi tạo xong bạn sẽ có Client ID và Client Secret tương tự như bên dưới:
client_id: 389056109680-svtji0v994ecj0n2jnff7supfn2c1r2q.apps.googleusercontent.com
client_secret: 6COIiq7C9HeL_WmvPi5MVybz
Lưu ý: bạn phải giữ bí mật Client ID và Client Secret, đoạn ở trên chỉ là ví dụ
Bước 5: viết code upload file
Bạn cần tạo 2 file đặt cạnh nhau, trong đó 1 file code đặt tên là GoogleDrive.py và 1 file settings.yaml
File Python bạn đặt tên gì cũng được, còn file settings.yaml bắt buộc đúng tên vì pydrive sẽ đọc file này.
Nội dung file settings.yaml chứa client_id và client_secret đã lấy ở bước trên
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
client_config_backend: settings client_config: client_id: 389056109680-svtji0v994ecj0n2jnff7supfn2c1r2q.apps.googleusercontent.com client_secret: 6COIiq7C9HeL_WmvPi5MVybz save_credentials: True save_credentials_backend: file save_credentials_file: credentials.json get_refresh_token: True oauth_scope: - https://www.googleapis.com/auth/drive.file - https://www.googleapis.com/auth/drive.install |
Bạn cần lấy ID của folder Google Drive để nhúng vào code
Tiếp theo là nội dung file GoogleDrive.py, bạn cần thay ID của folder vào code bên dưới
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive gauth = GoogleAuth() drive = GoogleDrive(gauth) upload_file_list = ['1.png'] exist_file_list = drive.ListFile({'q': "'{}' in parents and trashed=false".format(targetDirID)}).GetList() for upload_file in upload_file_list: if(not os.path.exists(upload_file)): continue fileName = os.path.basename(upload_file) for file1 in exist_file_list: if file1['title'] == fileName: file1.Delete() gfile = drive.CreateFile({'parents': [{'id': targetDirID}], 'title': fileName}) # Read file and set it as the content of this instance. gfile.SetContentFile(upload_file) gfile.Upload() # Upload the file. |
Nếu bạn không xóa file trên Drive trước khi upload thì Drive sẽ giữ cả 2 file cùng tên
Bước 6: run code và cấp quyền cho Client ID truy cập
Khi run code lần đầu tiên thì bạn cần cấp quyền cho Client ID được phép truy cập vào Google Drive.
Sau khi cấp quyền thì script Python sẽ tạo 1 file credentials.json bên cạnh, file credentials.json chứa thông tin về token để upload file. Nếu mất file này thì bạn phải cấp quyền lại.
Nếu mọi việc trơn tru thì file sẽ upload thành công lên Google Drive.
Các lỗi thường gặp
Access blocked
Nếu bạn gặp lỗi như hình trên thì vào menu Oauth Consent screen chọn PUBLISH APP
Bonus
Code list file trong folder Google Drive, lưu ý chỉ liệt kê những file do chính bạn upload.
1 2 3 4 5 6 7 8 9 |
from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive gauth = GoogleAuth() drive = GoogleDrive(gauth) file_list = drive.ListFile({'q': "'{}' in parents and trashed=false".format('1AyRu9ixxuG-Bt5KB6cm0HmEkUAf7ZX1N')}).GetList() print(len(file_list)) for file in file_list: print('title: %s, id: %s' % (file['title'], file['id'])) |
Ngoài ra còn nhiều example khác nữa, bài viết này chỉ tập trung vào việc upload file tự động. Chúc các bạn thành công.
Bài viết khó hình dung quá.
Chưa nhìn thấy nhứng file yaml vào Google_Driver.py ở đâu.
File settings.yaml nằm bên cạnh file GoogleDrive.py chứ không nhúng vào
Cho mình hỏi vụ lấy list file, mình muồn lấy danh sách tất cả các file trong thư mục, kể cả do người khác upload thì có được không bạn?
tùy theo quyền của bạn thôi
targetdirID la cai gi ha ban
Là chuỗi ký tự trên url khi mở folder