先去Google Cloud里面创建 OAuth、引入库、创建凭证
https://console.cloud.google.com/apis/credentials/consent?hl=zh-cn&project=sinuous-city-409603&supportedpurview=project
OAuth:只能启用测试版,然后将自己的Google账号添加进测试者。
API搜索启用:Google Drive API
最后是凭据,创建OAuth 2.0 客户端 ID,选择桌面应用,创建完成,下载json文件,记住路径,要在代码中修改路径。
import os
import datetime
import cv2
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
# 定义调用摄像头和保存照片的函数
def take_photo(filename='photo.jpg', show=False):
cam = cv2.VideoCapture(0)
retval, img = cam.read()
if retval:
cv2.imwrite(filename, img)
if show:
cv2.imshow(filename, img)
del(cam)
# 定义上传文件到Google Drive的函数
def upload_to_google_drive(filename):
creds = None
if os.path.exists('C:/Windows/Web/PhotouploadDrive/token.json'): #因为要设置定时任务,所以请将路径改为绝对路径,防止执行是路径有误。
creds = Credentials.from_authorized_user_file('C:/Windows/Web/PhotouploadDrive/token.json') #因为要设置定时任务,所以请将路径改为绝对路径,防止执行是路径有误。
if not creds or not creds.valid:
flow = InstalledAppFlow.from_client_secrets_file(
'C:/Windows/Web/PhotouploadDrive/xxxx.apps'
'.googleusercontent.com.json', #这个我是创建了Google项目,然后下载json文件的,xxx替换成你的json文件名,路径也要对应,最好是绝对路径,否则后面设定Windows任务会找不到。
['https://www.googleapis.com/auth/drive.file']) #因为要设置定时任务,所以请将路径改为绝对路径,防止执行是路径有误。
creds = flow.run_local_server(port=0)
with open('C:/Windows/Web/PhotouploadDrive/token.json', 'w') as token_file: #因为要设置定时任务,所以请将路径改为绝对路径,防止执行是路径有误。
token_file.write(creds.to_json())
service = build('drive', 'v3', credentials=creds)
file_metadata = {'name': os.path.basename(filename), 'mimeType': 'image/jpeg'}
media = MediaFileUpload(filename, mimetype='image/jpeg')
service.files().create(body=file_metadata, media_body=media).execute()
# 获取当前时间,并打开摄像头照相,然后上传到Google Drive
if __name__ == '__main__':
current_time = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
photo_name = 'C:/Windows/Web/PhotouploadDrive/output/Photo_{}.jpg'.format(current_time) #因为要设置定时任务,所以请将路径改为绝对路径,防止执行是路径有误。
take_photo(photo_name)
upload_to_google_drive(photo_name)
最后是Windows任务计划程序,创建基本任务,名称和描述看你自己填写,然后触发器可以先选计算机启动时,后面可以再添加新的,弄成多触发器,操作选启动程序,然后程序选择上面代码打包的exe文件,下一步,完成。然后查看这个任务,选择这个任务,右边有运行,可以测试是否成功运行,成功运行的话,会调用相机,拍照,然后再output里面有一份照片,然后Google硬盘里面也有一份,当然,保存的路径也可以按照你们的喜好更改,成功运行后,在触发器中添加其他的触发器,我是还有添加登录账户时拍照。
缺陷:其实缺陷挺多的,就好比调用了程序后,会有终端弹出,这个以后再改,然后是我原本想唤醒屏幕也拍照,好像需要用到第三方软件。。。还有Google验证是需要刷新的,我看网上是说可以再Python里面做自动刷新,但也还没来得及做,欢迎大佬补充、指正。