换起拍照并上传至Google云端硬盘-随记

查看 39|回复 1
作者:lijin671   
因为舍友老是乱动电脑,所以写了这个代码,保存证据,不怕一万就怕万一,Python不是很会,口下留情~
先去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里面做自动刷新,但也还没来得及做,欢迎大佬补充、指正。

路径, 触发器

qiwaitfor   

学习了  谢谢分享!
您需要登录后才可以回帖 登录 | 立即注册

返回顶部