前段时间因为Google Photos照片传太多把Google Drive空间用完了,就买了三刀一个月的Google会员,然后就发现100G空间似乎一时半会儿还用不完,正好之前一直想着给博客服务器来个自动备份脚本,所以就先把坑填了。
但是港真,Google Drive家的Python API无论是文档还是API本身都没有Dropbox好用,有可能Dropbox家相对于G家还是更重视Python,可惜Dropbox会员一个月九刀起步,我实在是用不上。
准备
创建Application:
- 去Google API控制台创建一个Application。
- 进入应用,在左侧Library里面找到Google Drive API并且Enable。
- 点击左侧边栏里面的Credentials接着Create Credentials, 然后创建OAuth client ID,Application type选择Other,官方文档QuickStart说的是选择Web application,可是那样的话就无法在命令行里面完成账号验证了,最后点Save就完成创建Application了。
- 点击右侧下载按钮,将client_secret_[id].json 文件下载到程序运行目录并且重命名为client_secret.json。
安装PyDrive:
Google Drive本身是有提供API的,除此之外还提供了基于原有API的Python程序,即PyDrive。安装的时候不要使用pip install pydrive
来安装,因为这样装的1.01版本有一个bug会导致上传大文件的时候出现内存溢出,所以得从github上下载安装最新版。
1 |
pip install -e git+https://github.com/googledrive/PyDrive.git#egg=PyDrive |
然后创建配置文件settings.yaml
保存在程序运行目录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
client_config_backend: settings client_config: client_id: YOUR_API_CLIENT_ID client_secret:YOUR_API_CLIENT_SECRET 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 |
配置文件详细参见OAuth made easy。
创建Google Drive目录:
在Google Drive网页上新建一个文件夹,并且点击打开文件夹,网址中https://drive.google.com/drive/folders/
后面的部分就是文件夹的ID。
比如
1 |
https://drive.google.com/drive/folders/0B5GemgRzQWc-SU1ET3lDT1ZrRzA |
文件夹的ID就是0B5GemgRzQWc-SU1ET3lDT1ZrRzA
。
Coding
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' Author: razrlele Email: razrlele@gmail.com ''' from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive import os import time import argparse parser = argparse.ArgumentParser() parser.add_argument("--target", "-T", help="upload files to GDrive.") args = parser.parse_args() DB_NAME= [YOUR_DATABASE_NAME] DB_USER= [YOUR_DATABASE_USER] DB_PASSWD= [YOUR_DATABASE_PASSWORD] def main(to_upload): gauth = GoogleAuth() # 官方文档里面的LocalWebAuth()不能用于命令行验证 gauth.CommandLineAuth() drive = GoogleDrive(gauth) # 生成类似于20160728124758的时间戳 timestamp = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time())) zipname = 'RazrBlog'+timestamp+'.zip' os.system('zip -qr %s %s'%(zipname, to_upload)) sqlname = 'MySQL'+timestamp+'.sql' # 备份数据库 os.system("mysqldump -u %s -p%s %s > %s"%(DB_USER, DB_PASSWD, DB_NAME, sqlname)) os.system('zip -qr %s %s'%(zipname, sqlname)) try: f = drive.CreateFile({"title":zipname,"parents": [{"kind": "drive#fileLink", "id": "0B5GemgRzQWc-MkNmZDRlTHVDNmM"}]}) f.SetContentFile(zipname) f.Upload() print "Finished uploading ", zipname except: print "Uploading failed." print "Removing ", zipname os.remove(zipname) print "Removing ", sqlname os.remove(sqlname) if __name__ == '__main__': if args.target: main(args.target) |
在运行的时候第一次需要打开打开命令行里面显示的链接来完成账号授权,之后就不用验证了,使用crontab
实现自动备份。
1 2 3 |
chmod +x backup_to_gdrive.py # Run backup script automatically at 6am. crontab -e 0 6 * * * /path/to/backup_to_gdrive.py |
References:
http://pythonhosted.org/PyDrive/quickstart.html#authentication